2014-03-30 32 views
0

我正在嘗試在x86彙編中編寫一個簡單的sum函數 - 我將這個函數作爲參數傳遞給38。但是,代碼不打印總和。感謝任何幫助發現錯誤。我正在使用NASMx86彙編中的sum函數 - 無輸出

section .text 
global _start 

_sum: 
    push ebp 
    mov ebp, esp 
    push edi 
    push esi   ;prologue ends 
    mov eax, [ebp+8] 
    add eax, [ebp+12] 
    pop esi   ;epilogue begins 
    pop edi 
    mov esp, ebp 
    pop ebp 
    ret 8 

_start: 
    push 8 
    push 3 
    call _sum 
    mov edx, 1 
    mov ecx, eax 
    mov ebx, 1  ;stdout 
    mov eax, 4  ;write 
    int 0x80 
    mov ebx, 0 
    mov eax, 1  ;exit 
    int 0x80 
+0

你會期待什麼? stdout上的字符串「11」?自從我用匯編寫入任何東西已經很長時間了,但是對於我想要寫入stdout的內容,可以是ASCII字符11(不是字符串「11」),也可以是位於內存偏移量11(0xb)中的字符串。也許我錯了,但這是我的猜測。 –

+0

順便說一句,它是Windows還是Linux? –

+0

@XavierRubioJansana Linux。我試過'添加eax,'0''以防ascii 11,但是沒用。 –

回答

1

對我來說,這看起來像Linux彙編器。從this頁面,在實例部分,分段INT 0x80的,它看起來像ECX預計該字符串的地址:

_start: 
    movl $4, %eax ; use the write syscall 
    movl $1, %ebx ; write to stdout 
    movl $msg, %ecx ; use string "Hello World" 
    movl $12, %edx ; write 12 characters 
    int $0x80  ; make syscall 

所以,你必須得到一個內存塊備用,你的結果轉換成字符串,可能會終止該字符串,然後使用ecx中的字符串地址調用write。

有關如何將整數轉換爲字符串的示例,請參閱Printing an Int (or Int to String)您必須將每個數字存儲在一個字符串中,而不是將其打印出來,並將其終止。然後你可以打印字符串。

對不起,我沒有在程序集中多年,所以我不能給你一個更詳細的答案,但希望這將足以指向你在正確的方向。

+0

感謝您的幫助。我將值轉換爲ascii,將其放在.bss的內存位置,並將其地址作爲第三個參數。適用於打印1位數字。我想,必須使用兩個或更多個數字的循環。 –

+0

很高興幫助! –