2016-10-04 154 views
0

我想這一塊C代碼轉換爲64位NASM堆棧在NASM彙編

int gcd (int a, int b) 
{ 
    int c; 
    while (a != 0) { 
    c = a; 
    a = b%a; 
    b = c; 
    } 
    return b; 
} 

,但我不知道在那裏我的錯誤是,我想也許有一些關於棧組件我「M沒有意識到這 是我做的

調用

push word[max] 
push word[min] 
call gcf 
pop word[num1_ones] 

堆棧功能

gcf: 
    mov ebp, esp 
while: 
    cmp word[ebp+4], 0 
    je return 

    mov dx, 0 
    mov ax, word[ebp+6] 
    mov bx, word[ebp+4] 
    div bx         

    mov word[ebp+4], dx   
    mov word[ebp+6], bx   

    jmp while 

return: 
    ret 2 

當我運行它,我得到這個:
terminal output

+0

那麼當你運行它會發生什麼?它看起來應該組裝。但是你沒有描述問題是什麼,所以這不是[mcve]。 –

回答

0

唯一缺少的明顯的一點就是EBP的推/彈出。

另外,你在16位或32位模式下運行?這會影響CALL推送的返回地址的大小,從而影響您的偏移量......在您澄清如何構建/運行此操作之前,我無法說出更具體的內容。

我建議使用調試器來查看寄存器/內存。

+0

對不起,我編輯了我的問題,我希望現在更清楚一點。我正在使用64位nasm,並且我的代碼中沒有出現任何錯誤或分段錯誤,但我得到的輸出不正確。 – Samantha

+0

@Samantha:文字圖片比實際文字差得多;你應該從你的終端複製/粘貼到一個代碼塊來說明輸出。 –

+0

@Samantha:我很驚訝'mov ebp,esp'不會導致在64位模式下發生segfaults,因爲您將RSP截斷爲32位。通常情況下,堆棧不在低4GB的虛擬內存中。所以你可能實際上構建了32位代碼,但是你可以包含你用來確認的命令。同樣令人驚訝的是,你的程序在你的函數返回後不會崩潰,因爲你不保存你的調用者的RBP –