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:
|