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

[0] Índice de Mensajes