Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: michellcrh en 6 Abril 2022, 07:19 am



Título: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
Publicado por: michellcrh 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.  


Título: Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
Publicado por: fary 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.





Título: Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
Publicado por: michellcrh 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?


Título: Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
Publicado por: fary 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.


Título: Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
Publicado por: michellcrh 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?


Título: Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
Publicado por: fary 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.

(https://fundacion-sadosky.github.io/guia-escritura-exploits/buffer-overflow/imagenes/partes-registro.png)


(https://2.bp.blogspot.com/-Zg3LKT-orx0/WnJj_PZhlVI/AAAAAAAAAO4/AScqvPK5bgcsR35wP4w5CKAXEqVTspLDQCLcBGAs/s320/ia32-introduccion-23-728.jpg)

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!


Título: Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
Publicado por: michellcrh 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 :-\


Título: Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos
Publicado por: fary 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.