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,060