Loops on Assembly
Lucas Carpio
For-loops
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
For-loops (2)
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
For-loops (3)
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-loops
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-loops
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
Recomendaciones
- Para for-loops se toman los cx-register como estandar.
- Para las demas loop conditions puedes tomar cualquiera de tu preferencia.
Call on Assembly
Raul Ovalle
Call
Nos permite ejecutar un procedimiento repetidas veces en diversos momentos del programa sin necesidad de reescribir las mismas instrucciones una y otra vez.
Llamada sencilla
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
Llamada con argumentos
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
Llamada con Stack Frame
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
Loops on Assembler
By Lucas Carpio
Loops on Assembler
- 1,090