>>35722 (OP)
Este código imprime rombos en la pantalla, es una especie de code golf que un anón sugirió en un hilo aquí en Hispachan.
; compilar con fasm
; ejecutar con:
; qemu-system-x86 -hda rombos.bin -L bios
use16
jmp 0x7c0:.start
.start:
movax, cs
movds, ax
moves, ax
moval, $21 ; setea el modo de video
movah, $0
int0x10
push mnsg1
push mnsg1.len
call imprimir
call nl
call nl
.mainloop:
push mnsg2
push mnsg2.len
call imprimir
push bentrd
push bentrd.len
call obtenerinput
push bentrd
push ax
call leerentero
cmp ax, $0
je .error
; limite sano
cmp ax, 40
jg .error
mov cx, ax
cmp ax, $9
jne .ponerrombo
push evett
push evett.len
call imprimir
call nl
.ponerrombo:
push cx
call imprimirrombo
jmp .mainloop
.error:
call nl
jmp .mainloop
jmp .start
leerentero:
push bp
mov bp, sp
push si
push di
push bx
push cx
mov di, [bp + 4]
mov si, [bp + 6]
add di, si
mov bx, $0
.bucle_1:
cmp si, di
jge .leerenterodone
lodsb
; checkea el rango 0..9
cmpax, $30
jb.enteroinvalido
cmp ax, $39
jg.enteroinvalido
subax, $30
push ax
mov ax, bx
mov cx, $0a
mul cx
mov bx, ax
pop ax
add bx, ax
jmp .bucle_1
.enteroinvalido:
mov bx, $0
.leerenterodone:
mov ax, bx
pop cx
pop bx
pop di
pop si
movsp, bp
pop bp
ret
imprimir:
push bp
mov bp, sp ; guarda el stack pointer
push di
push si
push bx
push cx
mov di, [bp + 4] ; largo
mov si, [bp + 6] ; cadena
add di, si
.bucle_2:
cmp si, di
jge .imprimirdone
lodsb
; interrupcion para generar la salida (output)
movah, $0e
movbx, $0
int0x10
jmp.bucle_2
.imprimirdone:
mov ax, $0
pop cx
pop bx
pop si
pop di
movsp, bp
pop bp
ret
obtenerinput:
push bp
mov bp, sp ; guarda el stack base pointer
sub sp, 2
push bx
push si
push di
mov di, [bp + 4]
mov si, [bp + 6]
mov [bp - 2], si
add di, si
.bucle_3:
; interrupcion para obtener al entrada del keyboard
mov ah, $0
int $16
; si la tecla presionada es enter terminamos
cmp al, $0d
je .obtenerinput