Flow chart of the if-else statement if ( condition ) ----> | statement1(s); V else +--------------+ FALSE statement2(s); | condition |--------+ +--------------+ | | | | TRUE | | | V | statement1(s) | | | +---------+ | | | | +<---------------+ | | | V | statement2(s) | | | V +-------->+ | V |
Assembler codes to evaluate "condition" (with cmp) FALSE Branch on the FALSE outcome of "condition" to label A: ----+ | | | (TRUE) | | | V | Assembler codes for "statement1(s)" | | Branch (always) to label B: -----------+ | | | | | A: Assembler codes for "statement2(s)" <----------------------+ | | V | B: +<---------------------------+ | V |
All you need to do is: code the flow chart using the correct conditional branch instructions !!!
Example if-else-statement (find the maximum of x and y)
int x; int y; int max; if ( x >= y ) max = x; else max = y; |
As before, I will omit discussing the variable definitions !
(I showed you the variable definitions to give you their data type information !)
if ( x >= y ) max = x; else max = y; |
The corresponding flow chart is:
main: movw r0, #:lower16:x movt r0, #:upper16:x // r0 = addr(x) ldr r0, [r0] // r0 = x movw r1, #:lower16:y movt r1, #:upper16:y // r1 = addr(y) ldr r1, [r1] // r1 = y cmp r0, r1 // compare x ? y blt else // if ( x < y ) Branch to "else" // max = x movw r0, #:lower16:x movt r0, #:upper16:x // r0 = addr(x) ldr r0, [r0] // r0 = x movw r1, #:lower16:max movt r1, #:upper16:max // r1 = addr(max) str r0, [r1] // max = r0 (= x) b ifEnd // Skip over the else part !!! else: // max = y movw r0, #:lower16:y movt r0, #:upper16:y // r0 = addr(y) ldr r0, [r0] // r0 = y movw r1, #:lower16:max movt r1, #:upper16:max // r1 = addr(max) str r0, [r1] // max = r0 (= y) ifEnd: /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data x: .4byte 7 // Try a value > y y: .4byte 10 max: .kip 4 |
DEMO: /home/cs255001/demo/asm/6-if/if-else1.s