if ( cond or "Other conditions" )
statement1;
else
statement2;
|
The compound condition is:
cond or "Other conditions"
|
When we evaluation the condition cond at the left hand side, there are 2 possible outcomes:
|
So in the case that cond ≡ true, we can take the then branch of the program flow immediately (and terminate the boolean evaluation prematurely !!!)
if ( cond or "Other conditions" ) ----> |
statement1; V
else +--------------+ TRUE
statement2; | eval cond |--------+
+--------------+ |
| |
| FALSE |
V |
+--------------+ FALSE |
| eval theRest |--------|---+
+--------------+ | |
| TRUE | |
| | |
V | |
statement1 <---------+ |
| |
+---------+ |
| |
| +--------------------+
| |
| V
| statement2
| |
| |
+-------->+
|
|
V
|
Evaluate "cond" (with cmp)
TRUE
Branch on TRUE outcome of "cond" to label A: ---------------+
| |
| FALSE |
V |
Evaluate "Other Conditions" (another cmp) |
| FALSE
Branch on FALSE outcome of "Other Conditions" to label B: --|-----+
| | |
| TRUE | |
V | |
A: "statement1" assembler code <--------------------------+ |
| |
Branch always to label C: ---------------+ |
| |
| |
B: "statement2" assembler code <---------|----------------------+
| |
V |
C: +<-------------------------------+
|
V
|
int x, y, a;
if (x <= a || x >= b)
x = x + 1;
else
x = x - 1;
|
The flow chart of the above program is:
|
The assembler program code for this compound if-statement is:
/* --------------------------------------------------
<----a b----->
------+----------+--------
if (x <= a or x >= b)
x = x + 1;
else
x = x - 1;
-------------------------------------------------- */
.text
main:
// Test if ( x <= a )
movw r0, #:lower16:x
movt r0, #:upper16:x // r0 = addr(x)
ldr r0, [r0] // r0 = x
movw r1, #:lower16:a
movt r1, #:upper16:a // r1 = addr(a)
ldr r1, [r1] // r1 = a
cmp r0, r1 // x <= a ?
ble then // Branch to "then" if x <= a
// test if ( x >= b )
movw r0, #:lower16:x
movt r0, #:upper16:x // r0 = addr(x)
ldr r0, [r0] // r0 = x
movw r1, #:lower16:b
movt r1, #:upper16:b // r1 = addr(b)
ldr r1, [r1] // r1 = b
cmp r0, r1 // x >= b ?
blt else // Branch to "else" if x < b
then:
// x = x + 1
movw r0, #:lower16:x
movt r0, #:upper16:x // r0 = addr(x)
ldr r1, [r0] // r1 = x
add r1, r1, #1 // r1 = x+1
str r1, [r0] // x = x+1
b ifEnd // ** SKIP over the else part !!! ***
else:
// x = x - 1
movw r0, #:lower16:x
movt r0, #:upper16:x // r0 = addr(x)
ldr r1, [r0] // r1 = x
sub r1, r1, #1 // r1 = x-1
str r1, [r0] // x = x-1
ifEnd:
.data
x: .4byte 5 // Try x: 10 < x < 20
a: .4byte 10
b: .4byte 20
.end
|
How to run the program:
|