【问题标题】:Understanding of how for loops in C relate to IA32 machine code [closed]了解 C 中的 for 循环如何与 IA32 机器代码相关[关闭]
【发布时间】:2016-01-16 12:41:22
【问题描述】:
foo:
pushl %ebp
movl %esp,%ebp 
movl 12(%ebp),%ecx 
xorl %eax,%eax 
movl 8(%ebp),%edx 
cmpl %ecx,%edx
jle .L3

.L5:
addl %edx,%eax 
decl %edx
cmpl %ecx,%edx 
jg .L5

.L3: leave
ret

我知道 xorl 是 for 循环 (int i=0) 的指标,但我无法理解其余代码... 谁能给我一个提示?

谢谢!

【问题讨论】:

  • 没有提供原始C代码,目的是找出等效的C代码!
  • xor 只是归零,它本身并不一定意味着循环。此外,许多循环不是从零开始的。向后跳转可以更好地指示循环,即jg .L5。至于提示,请使用指令集参考和调用约定文档来注释每条指令的功能。
  • 你为什么不看看这个问题和答案?问题非常相似,答案中的所有步骤都得到了很好的解释,它应该可以帮助您理解。 reverseengineering.stackexchange.com/questions/2096/…

标签: c loops assembly disassembly x86


【解决方案1】:

函数foo有两个参数,我们称它们为xy

foo:                   # foo(x, y)
    pushl %ebp
    movl %esp,%ebp 
    movl 12(%ebp),%ecx # ecx = y
    xorl %eax,%eax     # eax = 0
    movl 8(%ebp),%edx  # edx = x
    cmpl %ecx,%edx     # while (ecx < edx) {
    jle .L3

.L5:
    addl %edx,%eax     #     eax += edx
    decl %edx          #     edx--
    cmpl %ecx,%edx     # }
    jg .L5

.L3:
    leave
    ret                # return eax

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2017-02-19
    相关资源
    最近更新 更多