Quantcast
Channel: Preguntas más recientes con las etiquetas linux - Stack Overflow en español
Viewing all articles
Browse latest Browse all 1694

Programa NASM no suma ni da diferencia entre dos numeros como inputs

$
0
0

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     ``` 

Viewing all articles
Browse latest Browse all 1694

Latest Images

Trending Articles


pagare de natural english


Revolver RG


***Benelli MR1 .223 en GDL***


Lista de prefijos móviles por operador móvil en España


25/04/2016 (A)


Reguetoneros y productores que perdieron la vida


Jared Leto será El Guasón en la película Suicide Squad


Shotacon 3D 2.0


"EL LUCAS Y EL GUERO CHOMPAS" INTEGRANTES DEL CDS DENUNCIADOS CON EL GOBIERNO...


[Wii] Marvel: Ultimate Alliance [NTSC][WBFS]

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>