This page builds upon 03a
and introduces an else block to an if-statement.
Recall that if conditional with an else-block looks as follows in C/C++:
if (condition) {
code statement(s)
} else {
other code statements(s)
}
Similar to 03a
, the assembly code uses the negation of the condition in
the C/C++ code to skip to the else block.
foo:
# Before if/else
bne t0, t1, _f2Else # Example comparison, seeing if t0 == t1
# "Then" block
j _f2Join # Join the two blocks of code
_f2Else:
# "Else" block
j _f2Join # Join the two blocks of code
_f2Join:
# After if/else conditional
# ...
jalr zero, ra, 0
Here is a C
code example for a complete if-then-else
statement:
if(T >= 0) {
ptr = string;
}
else {
ptr = 0;
}
ptr++;
A typical RISC-V implementation for this statement is:
blt t0, zero, _else # if T < 0 goto _else
add t1, t2, zero # ptr <- string
j _join # goto _join
_else:
add t1, zero, zero # ptr <- 0
_join:
addi t1, t1, 1 # ptr++
In this code, T
is in register t0
, ptr
is in t1
, string
is in t2
.
The blt
instruction stands for "branch less than" and the condition is true
when T < 0
--- the negation of the condition in the original C
code. At
the end of the code block corresponding to the then
part of the if
statement, the jump instruction j
is required to ensure that the execution
skips the else
block. The execution falls through from the else
block to
the addi
statement that is at the point where the two diverging control
paths join together again.