Soy principiante en Ensamblador y he estado tratando de implementar un codigo en NASM 64 bits que reciba dos numeros (de n digitos cada uno). Ambos son pasados por el algoritmo ATOI (Ascii to integer) y luego son sumados y tambien se busca la diferencia entre ellos. Y por ultimo se usa el algoritmo ITOA (Integer to Ascii) para poder imprimirlos en consola.
El problema con el que me encontre es que a la hora de imprimir los resultados. Este no imprime nada. A esto me refiero:
0Ingrese el segundo numero: 123 El resultado de la suma es: 00 y el resultado de la diferencia es: 00
Si alguien sabe el como poder solucionar este problema, se lo agradeceria bastrate :)
Este es el codigo del programa:
pedirNumUno db "Ingrese el primer numero: ", 0 largoPedirUno equ $ - pedirNumUno pedirNumDos db "Ingrese el segundo numero: ", 0 largoPedirDos equ $ - pedirNumDos mensajeDeSuma db "El resultado de la suma es: ", 0 largoMensajeSuma equ $ - mensajeDeSuma mensajeDeDiferencia db " y el resultado de la diferencia es: ", 0 largoMensajeDiferencia equ $ - mensajeDeDiferencia mensajeError db "Error en los valores ingresados.", 0 largoError equ $ - mensajeError mensajeDebug db "Estoy aca!!!", 10 largoDebug equ $ - mensajeDebug digitos db "0123456789ABCDEF"section .bss numeroUno resb 21 numeroDos resb 21 resultadoDiferencia resb 21 resultadoSuma resb 21 resultado resb 21section .text ;seccion de procedimientos y macros;-----------------------------------------------------------------------------------------------;Macro para depuracion%macro debug 2 push rax push rcx push rdx push rbx push rbp push rsi push rdi push r10 push r9 push r8 mov rdi, 1 mov rsi, %1 mov rdx, %2 mov rax, 1 syscall pop r8 pop r9 pop r10 pop rdi pop rsi pop rbp pop rbx pop rdx pop rcx pop rax%endmacro;----------------------------------------------------------------------------------------------;Fin macro depuracion;---------------------------------------------------------------------------------------------- global _start_start: mov byte[resultado+20], 10 mov byte[resultadoSuma+20], 10 mov byte[resultadoDiferencia+20], 10 ;Se pide numero 1 mov rdi, 1 mov rsi, pedirNumUno mov rdx, largoPedirUno mov rax, 1 syscall ;Se lee numero 1 y se guarda en rsi mov rdi, 0 mov rsi, numeroUno mov rdx, 21 mov rax, 0 syscall mov rdi, numeroUno ;Se llama a atoi call atoi ;debug mensajeDebug, largoDebug mov [numeroUno], rax ;------------------------------------------------------------------------------------------------ ;Inicio prueba de entrada/salida ;------------------------------------------------------------------------------------------------ ;mov rax, [numeroUno] debug numeroUno,21 mov rcx, resultado add rcx, 19 mov rbx, 10 call itoa debug resultado, 21 ;jmp Fin_De_Programa ;------------------------------------------------------------------------------------------------ ;Fin prueba entrada/salida ;------------------------------------------------------------------------------------------------ ;Se pide numero 2 ; Prueba Atoi y Itoa mov rdi, [resultado] ; Prueba call itoa ; Prueba ;debug resultado, 21 mov rdi, 1 mov rsi, pedirNumDos mov rdx, largoPedirDos mov rax, 1 syscall ;Se lee numero 2 y se guarda en numeroDos mov rdi, 0 mov rsi, numeroDos mov rdx, 100 mov rax, 0 syscall mov rdi, rsi ;Se llama a atoi call atoi mov [numeroDos], rax ;call sumar ;call diferencia mov rdi, 1 mov rsi, mensajeDeSuma mov rdx, largoMensajeSuma mov rax, 1 syscall mov rdi, 1 mov rsi, resultadoSuma mov rdx, 100 mov rax, 1 syscall mov rdi, 1 mov rsi, mensajeDeDiferencia mov rdx, largoMensajeDiferencia mov rax, 1 syscall mov rdi, 1 mov rsi, resultadoDiferencia mov rdx, 100 mov rax, 1 syscallFin_De_Programa: mov rax, 60 xor rdi, rdi syscallsumar: xor rsi, rsi xor rdx, rdx mov rsi, numeroUno mov rdx, numeroDos add rsi, rdx call itoa retdiferencia: xor rsi, rsi xor rdx, rdx mov rsi, numeroUno mov rdx, numeroDos sub rsi, rdx mov rcx, [resultadoDiferencia] call itoa ret; atoi: Convierte una cadena de dígitos en un número entero; Argumentos:; RDI: Dirección de la cadena; Retorna:; RAX: Número enteroatoi: xor rax, rax ; rax = 0 xor rcx, rcx ; rcx = 0 (contador para el índice de la cadena) mov r12, 10.loop: movzx rdx, byte [rdi + rcx] ; Carga el siguiente byte de la cadena cmp rdx, 10 ; Verifica si es el final de la cadena je .done ; Si es así, salta a la etiqueta done sub rdx, '0' ; Convierte el carácter a dígito mul r12 ; Multiplica el número actual por 10 add rax, rdx ; Suma el dígito al número inc rcx ; Incrementa el contador jmp .loop ; Repite el ciclo.done: ret; itoa: Convierte un número entero en una cadena de dígitos; Posicion numero 20 hay que colocarle el 0Ah; Argumentos:; RCX: Dirección de la cadena de destino + 19; RAX; Numero entero a convertir; RBX: Base numerica a la cual convertiritoa: ;Inicializacion itoa original ;debug mensajeDebug, largoDebug ;mov rcx, 10 ; rcx = 10 (para dividir por 10) ;mov rbx, rsp ; rbx = puntero al buffer de reversa ;add rsp, 20 ; Reserva espacio en la pila para el buffer de reversa ;mov byte [rbx + 20], 0 ; Establece el último byte del buffer en 0 (terminador de cadena) ;dec rbx ; Ajusta el puntero al buffer para escribir desde el final ;Fin inicializacion itoa original.reverse_loop: ;debug mensajeDebug, largoDebug xor rdx, rdx ; rdx = 0 (para división) div rbx ; Divide rax por rbx y guarda el residuo en rbx push rbx mov bl, byte[digitos+rdx] ; Convierte el residuo a carácter mov byte[rcx], bl pop rbx dec rcx ; Avanza el puntero al buffer cmp rax, 0 ; Verifica si el cociente es 0 jne .reverse_loop ; Si no es 0, repite el ciclo ;mov rsi, rsp ; Actualiza el puntero a la cadena de destino ;sub rax, rsi ; Calcula la longitud de la cadena ;mov rdx, rax ; rdx = longitud de la cadena ;mov rsi, rsp ; rsi = puntero al buffer de reversa ;mov rdi, rsi ; rdi = puntero a la cadena de destino ;rep movsb ; Copia la cadena invertida al destino ;add rsp, 20 ; Libera el espacio de la pila utilizado para el buffer de reversa ret ```