Compound boolean expressions use
|
Example:
if (x <= a || x >= b)
x = x + 1;
else
x = x - 1;
|
Compilers use the short-circuit boolean evaluation technique to translate compound boolean expressions
The short-circuit boolean evaluation for the OR clause is based on the following:
condition1 || condition2: If condition1 = true then Outcome ≡ true // Outcome can be computed // with ONE condition If condition1 = false then Outcome ≡ condition2 |
We can construct a program flow for a compound || boolean expression using the above short-circuit boolean evaluation technique
The short circuit boolean evaluation will result in the following flow chart:
If condition C1 ≡ true, then C1 || C2 ≡ true and the program can proceed to the THEN part
But if condition C1 ≡ false, then C1 || C2 will depend on the outcome of C2.
if ( cond1 || cond2 ) -----> |
statement1(s); V
else +--------------+ TRUE
statement2(s); | eval cond1 |-----------------+
+--------------+ |
| FALSE |
V |
+--------------+ FALSE |
| eval cond2 |------------+ |
+--------------+ | |
| TRUE | |
|<--------------------|----+
V (then) |
statement1(s) |
| |
+<--------+ |
| (else) |
| statement2(s) <-----------+
| |
+-------->+
|
V
|
Example || condition:
int x, y, a;
if (x <= a || x >= b)
x = x + 1;
else
x = x - 1;
|
As before, I will omit discussing the variable definitions !
(I showed you the variable definitions to give you their data type information !)
if (x <= a || x >= b)
x = x + 1;
else
x = x - 1;
|
The corresponding flow chart is:
|
.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
|
DEMO: /home/cs255001/demo/asm/6-if/if-or.s