elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Nasm - tablas de multiplicar
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Nasm - tablas de multiplicar  (Leído 6,548 veces)
NuevoUsuario

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Nasm - tablas de multiplicar
« en: 8 Octubre 2021, 18:47 pm »

Hola Gente del foro. Estoy aprendiendo Nasm. He escrito un programa que muestra el resultado de las tablas de multiplicar.

Todo bien si pido los resultados de las tablas del 1 al 9, obteniendo la salida por ejemplo en la tabla del 2:

02
04
06..
..12
14
16..
..20

Pero al pedir los resultados de la tabla del 10

no me muestra bien los números, sino que la salida es:

elige una del 2 al 10 10
01
02
3\220
4\300
5
06
07
8\200
9\260
:\340

 

Podrían ayudarme a resolverlo? Gracias. Este es el código

Código
  1. ; pregunta por las tablas de multiplicar
  2.  
  3. %macro print 2
  4. mov eax, 4
  5. mov ebx, 1
  6. mov ecx, %1
  7. mov edx, %2
  8. int 0x80
  9. %endmacro
  10.  
  11. %macro read 2
  12. mov eax, 3
  13. mov ebx, 0
  14. mov ecx, %1
  15. mov edx, %2
  16. int 0x80
  17. %endmacro
  18.  
  19. section .data
  20. msg db "elige una del 2 al 10 "
  21. lenmsg equ $-msg
  22.  
  23. ln db 0xa, 0xd
  24. lenln equ $-ln
  25.  
  26. section .bss
  27. tab resb 2
  28. prod resb 3
  29.  
  30. section .text
  31. global _start
  32.  
  33. _start:
  34. print msg, lenmsg
  35. push ecx
  36. read tab, 2
  37. pop ecx
  38. mov edi, 1
  39.  
  40. tabla:
  41. cmp edi, 10
  42. jg exit
  43. mov ax, [tab]
  44. sub ax, '0'
  45. mul edi
  46. cmp ax, 10
  47. jge greater
  48. add ax, '0'
  49. mov [prod], ax
  50. print prod, 2
  51. print ln, lenln
  52. cont:
  53. inc edi
  54. jmp tabla
  55.  
  56. greater:
  57. clc
  58. aam                                        ; adjust ascii after multiplication
  59. pushf
  60. or ah, 30h
  61. or al, 30h
  62. popf
  63. mov [prod+0], ah
  64. mov [prod+1], al
  65. print prod, 2
  66. print ln, lenln
  67. jmp cont
  68.  
  69. exit:
  70. mov eax, 1
  71. mov ebx, 0
  72. int 0x80


« Última modificación: 8 Octubre 2021, 18:50 pm por NuevoUsuario » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Nasm - tablas de multiplicar
« Respuesta #1 en: 9 Octubre 2021, 11:32 am »

Si escribo 10 en tab habra 2 bytes:
0x31 y 0x30

Código
  1. mov ax, [tab]
  2. sub ax, '0'

Despues de restarle a AX '0' (0x30) tenes:
0x01 y 0x30


« Última modificación: 9 Octubre 2021, 11:47 am por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
NuevoUsuario

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Nasm - tablas de multiplicar
« Respuesta #2 en: 9 Octubre 2021, 12:43 pm »

Ok, entiendo. Gracias por tu tiempo. Buena suerte! \v/
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Nasm - tablas de multiplicar
« Respuesta #3 en: 9 Octubre 2021, 15:31 pm »

De nada.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
NuevoUsuario

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Nasm - tablas de multiplicar
« Respuesta #4 en: 12 Octubre 2021, 01:43 am »

Hola a todos. Continúo con mi programa de tablas de multiplicar. He agregado lo siguiente: Le pregunto al usuario por la tabla de multiplicar que elija.
Ahora el problema es que aunque responda correctamente me imprime el cartel de error.
Espero que puedan ayudarme, gracias. La salida:

Elige una tabla de multiplicar del 2 al 10 2

2 x 01 = 2
Ok.
2 x 02 = 4
Error.
2 x 03 = 6
Error.
2 x 04 = 8
Error.
2 x 05 =

El código:
Código
  1. ; pregunta por las tablas de multiplicar
  2.  
  3. %macro print 2
  4. mov eax, 4
  5. mov ebx, 1
  6. mov ecx, %1
  7. mov edx, %2
  8. int 0x80
  9. %endmacro
  10.  
  11. %macro read 2
  12. mov eax, 3
  13. mov ebx, 0
  14. mov ecx, %1
  15. mov edx, %2
  16. int 0x80
  17. %endmacro
  18.  
  19. section .data
  20. sel db "Elige una tabla de multiplicar del 2 al 10 "
  21. lensel equ $-sel
  22.  
  23. exis db ' x '
  24. lenx equ $-exis
  25.  
  26. igual db " = "
  27. leni equ $-igual
  28.  
  29. ok db "Ok."
  30. lenok equ $-ok
  31.  
  32. error db "Error."
  33. lenerr equ $-error
  34.  
  35. ln db 0xa, 0xd
  36. lenln equ $-ln
  37.  
  38. section .bss
  39. tab resb 2
  40. mult resb 2
  41. res resb 3
  42. prod resb 3
  43.  
  44. section .text
  45. global _start
  46.  
  47. _start:
  48. print sel, lensel
  49. read tab, 2
  50. mov edi, 0
  51. tabla:
  52. inc edi
  53. mov ax, [tab]
  54. sub ax, '0'
  55. mul edi
  56. push ax
  57. cmp edi, 9
  58. jg exit
  59. print ln, lenln
  60. add edi, '0' ; paso a ascii
  61. mov [mult], edi
  62. mov bl, [mult+1]
  63. mov bh, [mult+0]
  64. add bx, '0'
  65. mov [mult], bx
  66. print tab, 1
  67. print exis, lenx
  68. print mult, 2
  69. print igual, leni
  70. read res, 2
  71. mov cx, [res]
  72. sub cx, '0'
  73. pop ax
  74. cmp ax, cx
  75. je okey
  76. print error, lenerr
  77. sub edi, '0' ; paso a binario
  78. jmp tabla
  79.  
  80. okey:
  81. print ok, lenok
  82. sub edi, '0' ; paso a binario
  83. jmp tabla
  84.  
  85. exit:
  86. mov eax, 1
  87. mov ebx, 0
  88. int 0x80
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Nasm - tablas de multiplicar
« Respuesta #5 en: 12 Octubre 2021, 12:38 pm »

Estas leyendo el salto de linea y usandolo en los calculos.

Primera iteracion del bucle, en tab tenemos:
0x32 y 0x0A

Código
  1. mov ax, [tab]
  2. sub ax, '0'
  3. mul edi
  4. push ax

AX es primero 0x0A32
Al restarle '0' es 0x0A02
multiplicar por 1 no cambia nada
Asi que empujas en la pila 0x0A02

Segunda iteracion del bucle, mismo valor en tab:

AX es primero 0x0A32
Al restarle '0' es 0x0A02
Al mutiplicarlo por 2 AX es 0x1404
Asi que empujas en la pila 0x1404

Tenes exactamente el mismo error de logica al comparar, si aprieto 4 y enter, en res habra esto:

0x34 y 0x0A

Código
  1. mov cx, word ptr [res]
  2. sub cx, '0'
  3. pop ax
  4. cmp ax, cx

De casualidad te funciona en la primera iteracion:
CX es primero 0x0A32
Al restarle '0' es 0x0A02

Coincide con el resultado errado que empujaste en la pila.

En la segunda iteracion:
CX es primero 0x0A34
Al restarle '0' es 0x0A04

0x1404 no es igual a 0x0A04.



Llegados a este punto es imperativo que logres depurar tu programa linea por linea, entiendo que estas usando Linux (yo uso Windows asi que adapte tu codigo a MASM, con todo lo que eso significa partiendo de que los saltos de linea son \r\n y no \n solo como en Linux y las llamadas a la interrupcion 80h tienen que se reemplazadas por las APIs de Windows) asi que busca algun tutorial sobre gdb.
« Última modificación: 12 Octubre 2021, 12:45 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
NuevoUsuario

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Nasm - tablas de multiplicar
« Respuesta #6 en: 12 Octubre 2021, 19:32 pm »

Eternal Idol, te agradezco sobremanera. Claro entiendo jaja el primero es acertado de casualidad jajaj.
He usado un poco gdb.
Nunca lo usé en C, pero esto es un poco más complejo jaja.
Mirá si bien programé bastante en C, varias aplicaciones y juegos; al poco andar con assembler noté eso, que mi lógica no era tan buena como yo creía.
Y te voy a decir por qué estoy estudiando ensamblador ahora.
Comencé a desarrollar el juego sudoku en C, con las llibrerías ncurses, y me trabé en una parte asique dije: voy a aprender ensamblador para mejorar y luego retomar el juego. Y aquí estoy, descubriendo mis falencias en lógica.
Con esta ayuda que me diste, además, veo como pensar en assembler. Me sirvió mucho.
Voy a estudiar más así evito preguntar a cada rato. Muchísimas gracias por compartir tu conocimiento y dedicar tu tiempo. Un abrazo.
Voy a leer detenidamente tus comentarios y  mirar el código. Genial gracias!
« Última modificación: 12 Octubre 2021, 19:47 pm por NuevoUsuario » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Nasm - tablas de multiplicar
« Respuesta #7 en: 12 Octubre 2021, 21:57 pm »

De nada y suerte con eso  ::)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Python]Tablas de Multiplicar
Scripting
CATBro 5 15,200 Último mensaje 17 Enero 2011, 09:01 am
por fallout20xx
Tablas de multiplicar con Hilos.
Java
Didy 2 5,940 Último mensaje 12 Mayo 2013, 23:14 pm
por Didy
Tablas de multiplicar php « 1 2 »
PHP
Giankaa 11 6,635 Último mensaje 22 Agosto 2015, 16:59 pm
por #!drvy
C++ Tablas de multiplicar
Programación C/C++
H4ckw1X 4 11,342 Último mensaje 18 Marzo 2017, 19:25 pm
por Meta
Tablas de multiplicar en nasm
ASM
NuevoUsuario 3 4,707 Último mensaje 24 Enero 2022, 20:52 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines