2011-12-05 73 views
1

我正在運行一個調用外部彙編函數的C程序。爲了學術目的,我試圖執行strcat。我將這兩個字符串作爲char *參數傳遞給我的彙編程序。我推EBP堆棧,並指定字符串1和字符串到EDX和EBX像這樣:我的循環沒有按照我期望的那樣運行

mov edx, [ebp+8] 
mov ebx, [ebp+4] 

現在剩下的就是如下:

procStr1: 
    cmp BYTE PTR [edx], 0 
    jne readStr1 
procStr2: 
    cmp BYTE PTR [ebx], 0 
    jne readStr2 
    jmp bottom 
readStr1: 
    inc edx 
    jmp procStr1 
readStr2: 
    mov BYTE PTR [edx], 'a' 
    inc edx 
    inc ebx 
    jmp procStr2 

bottom: 
    inc edx 
    mov BYTE PTR [edx], 0 
    pop ebx 
    pop edx 
    pop ebp 
    ret 

我只是測試,看看它的工作原理是將a到string1的結尾。如果我輸入「hi」和「bye」,我希望通過C程序打印出hiaaa(打印出字符串1)。相反,我通常在string1之後得到13個a,無論string2有多大。我將不勝感激任何投入,這確實是令人難以置信的我的心..

回答

3

你做一個:

push ebp 
mov ebp, esp 

頂部?

如果是這樣,你的論點,現在發現在:

mov edx, [ebp+8] 
mov ebx, [ebp+Ch] ; 0xC, not 4 -- C-language passes args right-to-left 

此外,

bottom: 
    inc edx  ; This inc should be removed -- edx already points one 
        ; byte beyond the ultimate copied byte. 
    mov BYTE PTR [edx], 0 
+0

+1數據處理看起來很好(除了'INC edx'),所以我懷疑這只是從正確的位置獲取這些指針的問題 – Martin

+0

我不太明白,當我在Visual Studio中編譯時執行[ebp + C]時出現語法錯誤。從右到左,你的意思是第二個參數先被壓入棧中? – Rythven

+0

我編輯了後 - C是十六進制的,所以要麼使用12(十六進制C的值),要麼追加一個h。這個想法是正確的,只是一個語法錯誤。至於從右到左,是的,我的意思是第二個參數在第一個參數之前被推送。這是C調用約定,它允許可變數量的參數。 –

相關問題