Lucas Carpio
For-loop en C
for(int x = 0; x<=3; x++)
{
//Do something!
}
For-loop en assembly
xor cx,cx ; cx-register is the counter, set to 0
loop1 nop ; Whatever you wanna do goes here, should not change cx
inc cx ; Increment
cmp cx,3 ; Compare cx to the limit
jle loop1 ; Loop while less or equal
Si solo necesitas hacer algo 0-3=4 veces, pero no necesitas el index, seria mas fácil de esta manera:
mov cx,4 ; 4 iterations
loop1 nop ; Whatever you wanna do goes here, should not change cx
loop loop1 ; loop instruction decrements cx and jumps to label if not 0
Si se decesa ejecutar una simple instruccion, por una cantidad de veces constantes, se puede utilizar un assembler-directive para hardcodear esa instruccion
times 4 nop
Do-while-loop en C
int x=1;
do{
//Do something!
}
while(x==1)
mov ax,1
loop1 nop ; Whatever you wanna do goes here
cmp ax,1 ; Check wether cx is 1
je loop1 ; And loop if equal
Do-while-loop en assembly
While-loop en C
while(x==1){
//Do something
}
jmp loop1 ; Jump to condition first
cloop1 nop ; Execute the content of the loop
loop1 cmp ax,1 ; Check the condition
je cloop1 ; Jump to content of the loop if met
While-loop en assembly
Nos permite ejecutar un procedimiento repetidas veces en diversos momentos del programa sin necesidad de reescribir las mismas instrucciones una y otra vez.
Sin argumentos ni parámetros, en ocasiones se usan variables globales. Es también la mas sencilla de aprender.
call sumar
mov [C], eax
sumar
mov eax,[A]
add eax, [B]
ret
Es lo que hasta ahora hemos hecho con la instrucción PUSH en las llamadas a la API de Windows. Podemos darle datos de entrada
push [B]
push [A]
call sumar
mov [C], eax
sumar
push ebp
mov ebp,esp
virtual at ebp
.ebp_anterior dd ?
.Retorno dd ?
.local_A dd ?
.local_B dd ?
end virtual
mov eax, [local_A]
add eax, [local_B]
leave
ret 8
Esta es la mas dificil e interesante, pues nos permite hacer lo mismo que se hace con los lenguajes como C, con variables locales, recursión, y argumentos de entrada.
push dword [B]
push dword [A]
call sumar
sumar:
push ebp
mov ebp, esp
sub esp, 4
virtual at ebp – 4
.resultado dd ?
.ebp_anterior dd ?
.retorno dd ?
.local_A dd ?
.local_B dd ?
end virtual
mov eax, [.local_A]
add eax, [.local_B]
mov [.resultado], eax
leave
ret 8