while ( condition ) +---------->|
statement | |
| +--------------+ FALSE
| | condition |--------+
| +--------------+ |
| | |
| | TRUE |
| | |
| V |
| statement |
| | |
(repeat loop) +-----------+ | (exit loop)
|
+<---------------+
|
V
|
LOOP:
+--> Evaluate "condition" (use cmp)
| |
| V
| Branch on the FALSE outcome of "condition" to label A: -----+
| | |
| | TRUE |
| | |
| V |
| Translate "statement" into assembler code |
| | |
| V |
+--------- b LOOP |
|
A: +<------------------------------------------------+
|
V
|
Notice that:
|
int A, B;
int Q, R;
// Computes: Q = A/B and R = A%B
Q = 0;
R = A;
while ( R >= B )
{
Q = Q + 1;
R = R - B;
}
|
The flow chart of the program segment:
|
Assembler program:
main:
// Q = 0;
movw r0, #:lower16:Q
movt r0, #:upper16:Q // r0 = addr(Q)
mov r1, #0
str r1, [r0] // Q = 0;
// R = A;
movw r0, #:lower16:A
movt r0, #:upper16:A // r0 = addr(A)
ldr r1, [r0] // r1 = A;
movw r0, #:lower16:R
movt r0, #:upper16:R // r0 = addr(R)
str r1, [r0] // R = A;
while:
// test R >= B
movw r0, #:lower16:R
movt r0, #:upper16:R // r0 = addr(R)
ldr r1, [r0] // r1 = R;
movw r0, #:lower16:B
movt r0, #:upper16:B // r0 = addr(B)
ldr r2, [r0] // r2 = B;
cmp r1, r2 // Check: R >= B
blt whileEnd // If R < B: exit while loop
/* ***********************************
While body
*********************************** */
// Q = Q + 1
movw r0, #:lower16:Q
movt r0, #:upper16:Q // r0 = addr(Q)
ldr r1, [r0] // r1 = Q;
add r1, r1, #1 // r1 = Q+1
str r1, [r0] // Q = Q+1;
// R = R - B
movw r0, #:lower16:R
movt r0, #:upper16:R // r0 = addr(R)
ldr r1, [r0] // r1 = R;
movw r0, #:lower16:B
movt r0, #:upper16:B // r0 = addr(B)
ldr r2, [r0] // r2 = B;
sub r1, r1, r2 // r1 = R - B
movw r0, #:lower16:R
movt r0, #:upper16:R // r0 = addr(R)
str r1, [r0] // R = R - B;
// End of while body --- branch back to test !!
b while
whileEnd:
Stop:
nop
/* --------------------------------------------------
Begin of the permanent program variables
-------------------------------------------------- */
.data
A: .4byte 37
B: .4byte 7
Q: .skip 4 // Quotient
R: .skip 4 // Remainder
.end
|
How to run the program:
|