【问题标题】:My loop is not performing as I expect it to我的循环没有按预期执行
【发布时间】:2011-12-05 23:21:47
【问题描述】:

我正在运行一个调用外部汇编函数的 C 程序。出于学术目的,我正在尝试执行strcat。我将这两个字符串作为 char * 参数传递给我的汇编程序。我将 ebp 推入堆栈并将 string1 和 string2 分配给 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

我只是通过在 string1 的末尾添加 a 来测试它是否有效。如果我输入“hi”和“bye”,我希望 C 程序打印出 hiaaa(通过打印出 string1)。相反,我通常在 string1 之后得到 13 个 a,不管 string2 有多大。我会很感激任何意见,这真的让我难以置信..

【问题讨论】:

    标签: assembly x86 strcat


    【解决方案1】:

    你做了一个:

    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
    

    【讨论】:

    • +1 数据处理看起来不错(inc edx 除外)所以我怀疑这只是从正确位置获取这些指针的问题
    • 我不太明白,在 Visual Studio 中编译时执行 [ebp+C] 时出现语法错误。从右到左是指第二个参数首先被压入堆栈吗?
    • 我编辑了帖子 - C 是十六进制的,所以要么使用 12(十六进制 C 的值),要么附加一个 h。这个想法是正确的,只是语法错误。至于从右到左,是的,我的意思是第二个参数被推到第一个参数之前。这就是 C 调用约定,它允许可变数量的参数。
    • 耶!我很高兴。欢迎来到了解机器工作原理的美妙世界。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多