2011-12-05 44 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调用约定,它允许可变数量的参数。 –

相关问题