| UMBC | Repetition | Previous | Next |
The only different between a while and a do while loop is the while loops tests for continuation at the top of the loop and the do while loop test for continuation as the bottom of the loop. Thus, while loops may not execute at all, but a do while loop is going to execute at least one time.
A simple loop is the for statement:
for ( n = 10; n > 0; n-- )
/* do something */ ;
mov cx, n ; Initialize
theLoop:
; do something
dec cx ; Modification
jnz theLoop ; Test for termination -- can also use jg
mov cx, n ; Initialize
theLoop:
; do something
dec cx ; Modification
jcxz theLoop ; Test for termination
mov cx, n ; Initialize
theLoop:
; do something
loop theLoop ; Modification and test for termination
What if I want to count up instead of down? You must use the first version and use a different conditional jump and inc instead of dec.
What if I want to adjust the count by a value different that 1? Use add or sub, as appropriate.
Can I do anything in assembly language that I can do with a for statement in C? Of course.
What about while and until in C, can I do them? Yes, just make sure to put the compare and jump in the correct location.
#includeint main ( void ) { int i; /* simple for loop */ printf( "For Loop 1\n" ); for ( i = 10; i > 0; i-- ) { printf( " i = %d\n", i ); } /* simple reverse for loop */ printf( "For Loop 2\n" ); for ( i = 1; i <= 10; i++ ) { printf( " i = %d\n", i ); } /* by twos for loop */ printf( "For Loop 3\n" ); for ( i = 1; i <= 10; i+=2 ) { printf( " i = %d\n", i ); } return 0; }
section .data
str1 db 'For Loop 1',10,0
str2 db 'For Loop 2',10,0
str3 db 'For Loop 3',10,0
outstr db ' i = %d',10,0
section .bss
i resd 1
section .text
global main ;must be declared for linker (ld)
main: ;tell linker entry point
extern printf
push str1
call printf
add esp, 4
mov ecx, 10
loop1:
push ecx ; printf does not preserve the ecx register
; so I must.
push ecx
mov [i], ecx ; The C code changes the value of i with
; each step. I will also
push outstr
call printf
add esp, 8
pop ecx ; return ecx
loop loop1 ; decrement ecx and loop until zero.
push str2
call printf
add esp, 4
mov ecx, 10
mov dword [i], 1
loop2:
push ecx ; printf does not preserve the ecx register
; so I must.
push dword [i]
push outstr
call printf
add esp, 8
pop ecx
inc dword [i]
loop loop2 ; decrement ecx and loop until zero.
push str3
call printf
add esp, 4
mov ecx, 10
mov dword [i], 1
loop3:
push ecx ; printf does not preserve the ecx register
; so I must.
push dword [i]
push outstr
call printf
add esp, 8
pop ecx
inc dword [i] ; or sub dword [i], 2
inc dword [i]
dec ecx
loop loop3 ; decrement ecx and loop until zero.
;; The final part of the program must be a call to the operating system to exit
;;; the program.
mov ebx,0 ;successful termination of program
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel