Esta pagina se ve mejor con JavaScript habilitado

MercuryOS IF-ELSE en ensamblador

 ·  🎃 kr0m

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.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí