2013-07-16 49 views
0

我想添加2個數字,我沒有得到這個程序的輸出。請幫忙。NASM - 添加兩個數字 - 無輸出

section .text 
    global _start 

    _start: 

    mov eax, 20 
    mov ebx, 30 
    add eax, ebx 

    mov ecx, eax 

    mov eax, 4 
    mov ebx, 1 
    int 80h 

    mov eax, 1 
    mov ebx, 0 
    int 80h 
+0

系統調用4寫入字符串,而不是整數。您必須先將結果轉換爲字符串,或者使用libc中的'printf'函數。 – Michael

+0

@Michael我試圖堅持嚴格的彙編代碼。所以我不想使用printf。任何其他方式? – itsme

+0

是的,將整數轉換爲一個字符串,方法是反覆除以10,並將餘數+'0'以倒退的順序保存在緩衝區中。然後打印該字符串。 – Michael

回答

0

前面已經說過,你必須將這個數字字符串轉換爲字符串,然後輸出:

section .text 
global _start 

_start: 

    mov eax, 20 
    mov ebx, 30 
    add eax, ebx 

    mov edi, buffer 
    mov ecx, 10 
    call _NumToStr 
    xor eax, eax 
    stosb    ; null terminator 

    mov eax, 4 
    mov ebx, 1 
    mov ecx, buffer 
    int 80h 

    mov eax, 1 
    mov ebx, 0 
    int 80h   

buffer rb 64 ; I am not sure how this is in NASM simply reserve 64 bytes as buffer. 

; eax - number 
; ecx - radix 
; edi - buffer 

_NumToStr: 
    test eax,eax 
    jns _NumToStrU 
    neg eax 
    mov byte [edi],"-" 
    inc edi 

_NumToStrU 
    cmp eax,ecx 
    jb .lessA 

    xor edx,edx 
    div ecx 
    push edx 
    call _NumToStrU 
    pop eax 

.lessA: 
    cmp al, 10 
    sbb al, 69h 
    das 
    stosb 
    ret 
+0

謝謝約翰。代碼中有很多我不知道的術語。我是這裏的初學者。任何方式,我必須找到什麼測試,異或推。 – itsme

+0

[英特爾軟件開發人員手冊](http://download.intel.com/products/processor/manual/325462.pdf)涵蓋了這一點。 – Michael