This web page contains schemes for translating various C control structures into assembly language. It also describes how to implement compound conditions formed by ORing or ANDing simpler conditions.
if (condition) { statements }
branch to next if condition is false code for statements next:
if (condition) { then_statements } else { else_statements }
branch to else if condition is false code for then_statements unconditional branch to next else: code for else_statements next:
while (condition) { statements }
unconditional branch to condition_test loop_top: code for statements condition_test: branch to loop_top if condition is true next:
loop_top: branch to next if condition is false code for statements unconditional branch to loop_top next:
Although the alternate assembler code may seem more natural, it executes two branches for each iteration of the loop. The preferred code executes only one branch per iteration.
do { statements } while (condition);
loop_top: code for statements condition_test: branch to loop_top if condition is true next:
The assembler code is just the preferred assembler code for a while loop with the unconditional branch omitted.
The label condition_test
is only needed if one of the
statements in statements is a continue statement.
for (initialization; condition; increment) { statements }
code for initialization unconditional branch to condition_test loop_top: code for statements increment: code for increment condition_test: branch to loop_top if condition is true next:
The label increment
is only needed if one of the statements in
statements is a continue statement.
A break statement can occur inside a C loop or switch statement.
It is implemented as a unconditional branch to a label immediately
following the loop or switch statement.
This label is named next
in the loop and switch assembler
code.
In assembly language, a conditional branch can be used to implement a conditional break statement. This has no direct equivalent in C.
A continue statement can occur inside a C loop.
For while and do-while loops, it is implemented as a unconditional branch
to a label for the condition test of the while or do-while statement.
This label is named loop_top
in the while loop assembler
code, and condition_test
in the and do-while assembler code
and the while loop alternate assembler code.
For a for loop, a continue statement is implemented as a unconditional
branch to a
label immediately preceding the code to implement the increment
statements.
This label is named increment
in the for loop assembler code.
In assembly language, a conditional branch can be used to implement a conditional continue statement. This has no direct equivalent in C.
switch (expression) { case val_1: case_1_statements case val_2: case_2_statements . . . case val_n: case_n_statements default: default_statements }
code to evaluate expression and save its value in exp branch to case_1 if exp equals val_1 branch to case_2 if exp equals val_2 . . . branch to case_n if exp equals val_n unconditional branch to default (or next if default clause is omitted) case_1: code for case_1_statements case_2: code for case_2_statements . . . case_n: code for case_n_statements default: code for default_statements next:
Normally, C switch statements have a break statement at the end of each
case.
This is implemented with an unconditional branch to the next
label.
branch to somewhere if condition1 OR condition2
branch to somewhere if condition1 is true branch to somewhere if condition2 is true
This construction generalize to any number of subconditions.
branch to somewhere if condition1 AND condition2
branch to next if condition1 is false branch to next if condition2 is false branch to somewhere next:
branch to next if condition1 is false branch to somewhere if condition2 is true next:
This construction generalize to any number of subconditions. In the simplified assembler code, only the last subcondition can be merged with the branch to somewhere.