Una de las estructuras mas básicas cuando se empieza a programar son las sentencias if, en este artÃculo explicaré un ejemplo muy sencillo en pseudocódigo y como traducirlo a ensamblador.
Antes de comenzar es recomendable que leas estos artÃculos anteriores:
En esamblador disponemos de distintas instrucciones de salto:
- je target ; jump if equal ( i.e. x == y)
- jne target ; jump if not equal ( i.e. x != y)
- jl target ; jump if less than ( i.e. x < y)
- jle target ; jump if less than or equal ( i.e. x <= y)
- jg target ; jump if greater than ( i.e. x > y)
- jge target ; jump if greater than or equal ( i.e. x >= y)
La implementación de un if-else en ASM es bastante sencilla, primero escribamos el código en pseudocódigo para luego ver el equivalente en ASM:
bl = 4
print bl
if ax == 4:
print '1'
else:
print '2'
fi
print '3'
En ensamblador serÃa:
vi boot_sect_if.asm
mov bl, '4'
mov ah, 0x0e; tty mode
mov al, bl; print bl value
int 0x10
cmp bl, '4'; compare the value in bl to 4
je then_block; jump to then_block if they were equal
mov al, '2'; print 2
int 0x10
jmp the_end; important : jump over the ’then ’ block , so we don ’t also execute that code.
then_block:
mov al, '1'; print 1
int 0x10
the_end:
mov al, '3'; print 3
int 0x10
jmp $; jump to current address = infinite loop
; padding and magic number
times 510 - ($-$$) db 0
dw 0xaa55
Generamos la imagen:
nasm -f bin boot_sect_if.asm -o boot_sect_if.bin
La cargamos en qemu:
qemu-system-x86_64 boot_sect_if.bin
SeaBIOS (version rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org)
iPXE (http://ipxe.org) 00:03.0 C980 PCI2.10 PnP PMM+07F91410+07EF1410 C980
Booting from Hard Disk...
413
Si cambiamos el valor de bl a 5:
vi boot_sect_if.asm
mov bl, '5'
Regeneramos la imagen:
nasm -f bin boot_sect_if.asm -o boot_sect_if.bin
La cargamos en qemu:
qemu-system-x86_64 boot_sect_if.bin
SeaBIOS (version rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org)
iPXE (http://ipxe.org) 00:03.0 C980 PCI2.10 PnP PMM+07F91410+07EF1410 C980
Booting from Hard Disk...
523
Podemos ver como la ejecución del código es la correcta.