# 4.4. If Else Implementation¶

You may have noticed that the logic for conditionals in assembly is the reverse of high level languages. In high level languages we use conditionals to specify extra code to run under certain circumstances:

```if(x < 2)
y = 5;
//rest of program
```

In assembly, a branch always skips code. So our branch logic has to be written to decide when to skip a group of instructions, not when to run them. Instead of asking “is x less than 2”, the compare and branch statement in the code below effectively say “if the value in r1 is greater than or equal to 2 don’t set y to 5”:

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19``` ``` .data x: .word 2 y: .word 0 .text _start: LDR r1, =x @load x's address LDR r1, [r1] @r1 = x CMP r1, #2 @test r1 vs 2 (calculate r1 - 2) BGE endIf @branch past "if body" if r1 Not Equal to 2 @These instructions only executed if r1 was == 2 MOV r2, #5 LDR r3, =y @load y's address STR r2, [r3] @y = 5 endIf: MOV r0, r0 @do nothing... rest of program here ```
Try sample

To write an if else in assembly, we generally use the form:

```test whether to skip to else
...if code...
else:
...else code...
endElse:
```

So this C++:

```if(x < 2)
y = 5;
else
y = 3;
```

Would become:

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24``` ``` .data x: .word 1 y: .word 0 .text _start: LDR r1, =x @load x's address LDR r1, [r1] @load x CMP r1, #2 @test x vs 2 (x - 2) BGE else @branch to else if x Greater or Equal @if part MOV r2, #5 B endElse @done with if part... get past else else: @else part MOV r2, #3 endElse: @done with if/else LDR r3, =y @load y's address STR r2, [r3] @y = value set in if/else ```
Try sample