2016-11-25 65 views
-4

我已經在64位彙編中編寫了這個程序來添加兩個數字。它適用於1位數字,但不適用於2位數字。64位彙編代碼添加2個數字

我的代碼有什麼問題?

segment .data 
    msg1 db "Enter a digit", 0xA, 0xD 
    len1 equ $- msg1 
    msg2 db "Please enter the second digit", 0xA, 0xD 
    len2 equ $- msg2 
    msg3 db "The sum is :" 
    len3 equ $- msg3 

segment .bss 
    num1 resb 2 
    num2 resb 2 
    res resb 2 

segment .text 
global _start 
_start: 
    call _text1 
    call _getName1 
    call _text2 
    call _getName2 
    call _text3 

    mov rax, [num1] 
    sub rax, '0' 

    mov rbx, [num2] 
    sub rbx, '0' 

    add rax, rbx 
    add rax, '0' 
    mov [res], rax 
    mov rax, 1 
    mov rdi, 1 
    mov rsi, res 
    mov rdx, 2 
    syscall 

    mov rax, 60 
    mov rdi, 0 
    syscall 
_text1: 
    mov rax, 1 
    mov rdi, 1 
    mov rsi, msg1 
    mov rdx, len1 
    syscall 
    ret 

_getName1: 
    mov rax, 0 
    mov rdi, 0 
    mov rsi, num1 
    mov rdx, 2 
    syscall 
    ret 

_text2: 
    mov rax, 1 
    mov rdi, 1 
    mov rsi, msg2 
    mov rdx, len2 
    syscall 
    ret 

_getName2: 
    mov rax, 0 
    mov rdi, 0 
    mov rsi, num2 
    mov rdx, 2 
    syscall 
    ret 

_text3: 
    mov rax, 1 
    mov rdi, 1 
    mov rsi, msg3 
    mov rdx, len3 
    syscall 
    ret 
+1

寫入3個版本相同的功能,而不是隻是路過3個不同的參數傳遞給相同功能的完全違背了功能的目的而分配的存儲空間。 –

+0

無論如何,請注意「10」(兩個字符)和10 +「0」的ASCII碼之間的區別。這當然仍然是一位數的ASCII碼。你需要一個可以將一個整數轉換爲一個字符串的函數,並且這個問題已經在SO上被提出了數百次。 –

+0

要查看@PeterCordes點,請查看以集合編寫的'itoa'(整數到ascii)轉換例程 - 或 - 調用同名的C運行時函數。 –

回答

0

這是因爲在

segment .bss 
    num1 resb 2 
    num2 resb 2 
    res resb 2