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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos  (Leído 5,494 veces)
michellcrh

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
« en: 6 Abril 2022, 07:19 am »

Hola, espero me pueda ayudar
Tengo este código que suma 2 numeros de 2 dígitos en ensamblador NASM, pero quisiera mostrar el resultado en pantalla mediante una función CALL, el problema es que no entiendo como realizarlo ya que el resultado de la suma està en el registro eax y està en hexadecimal, tengo mi duda de si tengo que realizar una conversion a decimal de ese número o algua cosa así.

Código
  1. section .data
  2.    msg_1: db "Introduce un primer numero :", 10
  3.    lnmsg1 : equ $-msg_1
  4.    msg_2: db "Escribe un segundo numero :", 10
  5.    lnmsg2 : equ $-msg_2
  6.    msg_3: db "El resultado de la suma es:",10
  7.    lnmsg3 : equ $-msg_3
  8.  
  9.    diez db 10
  10.  
  11. section .bss
  12.    num1 resb 10
  13.    num2 resb 10
  14.    resultado resb 10
  15.    aux resb 10
  16.  
  17. section .text
  18.    global _start
  19.    _start:
  20.  
  21.        mov ecx, msg_1
  22.        mov edx, lnmsg1
  23.        mov ebx, 1
  24.        mov eax, 4
  25.        int 0x80  
  26.  
  27.        mov ecx, num1
  28.        mov edx, 10
  29.        mov ebx, 1
  30.        mov eax, 3
  31.        int 0x80  
  32.  
  33.        mov ecx, msg_2
  34.        mov edx, lnmsg2
  35.        mov ebx, 1
  36.        mov eax, 4
  37.        int 0x80  
  38.  
  39.        mov ecx, num2
  40.        mov edx, 10
  41.        mov ebx, 1
  42.        mov eax, 3
  43.        int 0x80  
  44.  
  45.        mov esi, num1
  46.        call atoi
  47.        pop eax
  48.  
  49.        mov esi, num2
  50.        call atoi
  51.        pop ebx
  52.  
  53.        add eax, ebx           ;El resultado de la suma se guarda en eax
  54.  
  55.  
  56.        call imprimir
  57.        jmp end
  58.  
  59.  
  60.  
  61.  
  62.        atoi:
  63.        push ebp
  64.        mov ebp, esp
  65.        xor eax, eax
  66.    .top:
  67.        movzx ecx, byte [esi] ; obtener un caracter
  68.        inc esi ; leer la siguiente dirección
  69.        cmp ecx, '0' ; digito valido?
  70.        jb .done
  71.        cmp ecx, '9'
  72.        ja .done
  73.        sub ecx, '0' ; "convertir" caracter a numero
  74.        imul eax, eax, 10 ; multiplicar el resultado obtenido por 10
  75.        add eax, ecx ; sumatoria
  76.        jmp .top ; until done
  77.  
  78.    .done:
  79.        pop ebp
  80.        ret
  81.  
  82.  
  83.  
  84.    imprimir:
  85.        push ebp
  86.        mov ebp, esp
  87.        mov [resultado], eax
  88.  
  89.  
  90.        mov eax, 4
  91.        mov ebx, 1
  92.        mov ecx, msg_3
  93.        mov edx, lnmsg3
  94.        int 0x80
  95.  
  96.        mov eax, 4
  97.        mov ebx, 1
  98.        mov ecx, resultado
  99.        mov edx, 10
  100.        int 0x80
  101.  
  102.        pop ebp
  103.        ret
  104.  
  105.  
  106.    end:
  107.        mov eax, 1
  108.        xor ebx, ebx
  109.        int 80h
  110.  
  111.  
  112.  
  113.        ; algoritmo de conversion
  114.        ; val = 0
  115.        ; numero = "289"
  116.        ; val = val + ('9' - 48) * 10⁰
  117.        ; val = 9 + ('8' - 48) * 10¹
  118.        ; val = 89 + ('2' - 48) * 10²
  119.        ; imul dest, op1, op2
  120.  


En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
« Respuesta #1 en: 6 Abril 2022, 15:10 pm »

Igual que conviertes la cadena que lees a número, luego tienes que convertir el resultado de la suma a cadena antes de imprimirlo.





En línea

Un byte a la izquierda.
michellcrh

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
« Respuesta #2 en: 6 Abril 2022, 15:27 pm »

DE acuerdo, o sea que podrìa usar mi còdigo que tengo para convertir de caracter a número pero sumandole el '0' en lugar de restarlo?
Y para imprimirlo habia visto que tenía que separarlo en caracteres para mostrar uno por uno, eso es cierto?
En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
« Respuesta #3 en: 6 Abril 2022, 15:38 pm »

Es sumandole '0', sí. Pero en lugar de multiplicar tienes que dividir. Lo de imprimirlo no tiene porque ser caracter a caracter.
En línea

Un byte a la izquierda.
michellcrh

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
« Respuesta #4 en: 6 Abril 2022, 16:31 pm »

Una duda que me surgió hace un momento, es que mi resultado de la suma está en eax y la división se haria en ax no? o sea ax/10, como hago para que mi resultado de la suma estè solo en ax?
En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
« Respuesta #5 en: 6 Abril 2022, 16:38 pm »

Si estas programando para 32 bits... la división la tendrás que hacer en 32 bits. Digo yo.






Otra cosa es que luego uses las partes altas o bajas del registro.

El código del cual asumo que surgió la duda fijate que es de 16 bits.

https://foro.elhacker.net/asm/como_pasar_un_registro_a_una_cadena_de_texto-t309441.0.html

saludos!
En línea

Un byte a la izquierda.
michellcrh

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
« Respuesta #6 en: 6 Abril 2022, 17:15 pm »

entonce como tal hice lo siguiente:

mov ebx, 10
idiv ebx ; dividir entre 10

para hacerlo con los 32 bits, pero lo que se va a dividir entre 10, tengo entendido que es EAX:EDX, o sea que el valor de mi suma deberìa estar reaprtido entre esos 2 registros no? y no sè como realizarlo :-\
En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
« Respuesta #7 en: 8 Abril 2022, 15:09 pm »

No tiene que estar repartido entre los dos registros. Pon el dividendo en EAX y pon EDX a 0.
En línea

Un byte a la izquierda.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ordenar 5 números de menor a mayor e imprimir los números impares
Programación C/C++
ERIK546 6 25,287 Último mensaje 23 Junio 2012, 00:36 am
por ERIK546
Duda para imprimir un resultado en un jlabel
Java
erikcdlm 2 2,602 Último mensaje 20 Noviembre 2014, 21:01 pm
por erikcdlm
[Ayuda] Hallar la suma de los dígitos de el factorial de 100
Programación C/C++
Loperso 4 3,891 Último mensaje 29 Abril 2016, 20:49 pm
por MAFUS
Imprimir resultado Python
Scripting
krystiag 0 1,978 Último mensaje 29 Noviembre 2016, 19:19 pm
por krystiag
Ayuda C++ suma de digitos hasta un solo digito.
Programación C/C++
Morx 5 6,515 Último mensaje 13 Noviembre 2018, 17:56 pm
por dijsktra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines