📖 Scenario: You are learning how ARM processors decide what to do next based on comparing values. This is important for making decisions in programs, like choosing between two options.
🎯 Goal: Build a simple ARM assembly code snippet that compares two numbers and branches (jumps) to different parts of the code depending on the comparison result.
📋 What You'll Learn
Create two registers with specific values
Set up a comparison instruction between the two registers
Use a conditional branch instruction based on the comparison
Add labels to mark the branch destinations
💡 Why This Matters
🌍 Real World
ARM processors use compare and branch instructions to make decisions in embedded systems, mobile devices, and many electronics.
💼 Career
Understanding compare and branch patterns is essential for embedded software developers and anyone working with low-level ARM assembly programming.
Progress0 / 4 steps
1
Set up registers with values
Write ARM assembly code to load the value 5 into register r0 and the value 10 into register r1.
ARM Architecture
Hint
Use the MOV instruction to put numbers into registers.
2
Compare the two registers
Add an ARM assembly instruction to compare the value in r0 with the value in r1 using the CMP instruction.
ARM Architecture
Hint
The CMP instruction subtracts the second register from the first and sets flags for branching.
3
Branch if less than
Write a conditional branch instruction BLT that jumps to the label less_than if r0 is less than r1.
ARM Architecture
Hint
The BLT instruction branches if the previous comparison shows the first value is less than the second.
4
Add branch labels and final instructions
After the BLT, add MOV r2, #0 (for when r0 >= r1) followed by B end to skip the less_than block. Then add the label less_than: followed by MOV r2, #1. Finally, add the label end:.
ARM Architecture
Hint
Labels mark places to jump to. Use B to jump unconditionally to end after the branch.
Practice
(1/5)
1. What is the main purpose of the CMP instruction in ARM assembly?
easy
A. To jump to a different part of the program unconditionally
B. To compare two values and set condition flags
C. To add two numbers and store the result
D. To load a value from memory into a register
Solution
Step 1: Understand the role of CMP
The CMP instruction compares two values by subtracting one from the other without storing the result, but it sets flags based on the outcome.
Step 2: Identify what CMP affects
These flags are then used by conditional branch instructions to decide program flow.
Final Answer:
To compare two values and set condition flags -> Option B
Quick Check:
CMP sets flags for branching decisions [OK]
Hint: CMP sets flags after comparing values for branching [OK]
Common Mistakes:
Thinking CMP jumps directly
Confusing CMP with arithmetic instructions
Assuming CMP stores the subtraction result
2. Which of the following is the correct syntax for a conditional branch in ARM assembly that jumps if two values are equal?
easy
A. BGT label
B. BNE label
C. BEQ label
D. BLT label
Solution
Step 1: Recall condition codes for branching
BEQ stands for 'Branch if Equal', which means it jumps if the zero flag is set after a CMP instruction.
Step 2: Match condition with instruction
BNE means 'Branch if Not Equal', BGT is 'Branch if Greater Than', and BLT is 'Branch if Less Than'. Only BEQ matches the condition for equality.
Final Answer:
BEQ label -> Option C
Quick Check:
BEQ jumps when values are equal [OK]
Hint: BEQ means branch if equal (zero flag set) [OK]
Common Mistakes:
Using BNE instead of BEQ for equality
Confusing greater than and equal conditions
Forgetting to use CMP before branch
3. Given the following ARM assembly code snippet, what will be the value in register r2 after execution?
A. Missing unconditional branch to skip MOV after BGT
B. CMP instruction is incorrect
C. MOV instructions use wrong registers
D. BGT should be BGE for correct branching
Solution
Step 1: Understand the flow of conditional branch
BGT branches to greater_label if r3 > r4. If not, execution continues to MOV r5, #10.
Step 2: Identify missing jump to skip unwanted instruction
After executing MOV r5, #10, the code falls through to greater_label and executes MOV r5, #20, overwriting the previous value. To avoid this, an unconditional branch is needed after MOV r5, #10.
Final Answer:
Missing unconditional branch to skip MOV after BGT -> Option A
Quick Check:
Need unconditional branch to prevent fall-through [OK]
Hint: Add unconditional branch after conditional MOV to avoid fall-through [OK]
Common Mistakes:
Thinking CMP is wrong
Assuming MOV instructions are incorrect
Confusing BGT with BGE
5. You want to write ARM assembly code that sets r0 to 1 if r1 is less than r2, and to 0 otherwise. Which sequence correctly implements this using compare and branch patterns?
hard
A. CMP r1, r2
BLT set_one
MOV r0, #0
B end
set_one:
MOV r0, #1
end:
B. CMP r1, r2
BGT set_one
MOV r0, #0
B end
set_one:
MOV r0, #1
end:
C. CMP r2, r1
BLT set_one
MOV r0, #0
B end
set_one:
MOV r0, #1
end:
D. CMP r1, r2
BEQ set_one
MOV r0, #0
B end
set_one:
MOV r0, #1
end:
Solution
Step 1: Understand the comparison needed
We want to check if r1 < r2. The CMP instruction compares r1 and r2, setting flags accordingly.
Step 2: Use the correct branch condition
BLT (Branch if Less Than) jumps if r1 < r2. If true, branch to set_one to set r0 to 1. Otherwise, set r0 to 0.
Step 3: Confirm the flow
If BLT is taken, r0 = 1; else r0 = 0. The unconditional branch after MOV r0, #0 skips the set_one label to avoid overwriting.
Final Answer:
CMP r1, r2
BLT set_one
MOV r0, #0
B end
set_one:
MOV r0, #1
end: -> Option A
Quick Check:
Use CMP + BLT for less than check [OK]
Hint: Use CMP then BLT to branch if less, else set zero [OK]
Common Mistakes:
Swapping operands in CMP
Using BGT instead of BLT
Forgetting unconditional branch after MOV 0
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.