Tablas de multiplicar en nasm
(1/1)
NuevoUsuario:
Hola amigos, esoty dando mis primeros pasos en Nasm.
Hago un programa para preguntar las tablas de multiplicar. Por ahora solo trato de imprimirlas, y es que mi problema es que el bucle no continúa, se detiene luego de imprimir el primer resultado. Si alguien puede ayudarme le agradezco .
Código
;; pregunta por las tablas de multiplicar del 2 al 10
%macro read 2
mov eax, 3
mov ebx, 0
mov ecx, %1
mov edx, %2
int 0x80
%endmacro
%macro print 2
mov eax, 4
mov ebx, 1
mov ecx, %1
mov edx, %2
int 0x80
%endmacro
section .data
msg db "Elige una tabla de Multiplicar del 2 al 10", 0xa
lenmsg equ $-msg
nwln db 0xa, 0xd
lennwln equ $-nwln
section .bss
prod resb 3
op resb 1
section .text
global _start
_start:
print msg, lenmsg
read op, 2
mov ecx, 10
mov ax, 1
multiplica:
mov bx, [op]
sub bx, '0'
push ax
mul bx
cmp ax, 90
jg m90
aam ; separa lo que hay en al. ah=decena al=unidad
add al, 48
add ah, 48
mov [prod+0], byte '0'
mov [prod+1], ah
mov [prod+2], al
push ecx
print prod, 3
print nwln, lennwln
pop ecx
pop ax
inc ax
cmp ecx, 1
je exit
loop multiplica
m90:
aam ; separo al. ah=10 al=0
add al, 48
mov [prod+2], al
mov al, ah ; muevo ah=10 a al
aam ; separo lo que hay en al. ah=1, al=0
add al, 48
add ah, 48
mov [prod+1], al ; muevo la decena
mov [prod+0], ah ; muevo la centena
print prod, 3
exit:
mov eax, 1
mov ebx, 0
int 0x80
Eternal Idol:
Código
op resb 1
Declaras una variable de 1 byte pero:
Código
read op, 2
...
mov bx, [op]
Pero lees y usas 2 bytes despues; eso esta mal de base.
¿Como sabes si se leyo un caracter + salto de linea o dos caracteres?
Aca ya te explique el problema que estas teniendo:
https://foro.elhacker.net/asm/nasm_tablas_de_multiplicar-t512336.0.html
Si escribo 3 y enter op valdra 0xA33 y si escribo 10 y enter op valdra 0x3031. Le resto 0x30 y multiplico a 1 por ese valor, 0xA03 y 0x3001 son mayores a 0x90. En ambos casos el codigo salta a m90 y continua la ejecucion hasta salir del programa.
Usando un depurador linea por linea lo verias mucho mas claro todo.
NuevoUsuario:
Hola capo! Mirá cómo te acordás! sí todavía estoy con ese problema porque tuve que dejarlo por cuestiones personales y ahora lo retomé. Agradezco mucho tu rta y tu tiempo. Prometo no volver a preguntar lo mismo. Gracias.
Eternal Idol:
De nadas y suerte con eso ::)
Navegación