为什么这个C代码产生这个程序集

时间:2015-12-30 23:01:28

标签: assembly x86 32-bit

关于问题答案的快速提问:Purpose of ESI & EDI registers?

srcp [srcidx++] = argv [j]; C code translates too

8B550C         mov    edx,[ebp+0C]
8B0C9A         mov    ecx,[edx+4*ebx]
894CBDAC       mov    [ebp+4*edi-54],ecx
47             inc    edi

我参加了一个集会课,并且知道了基础知识,而不是寻找mov的含义,但我大多感到困惑的是+0C,{{1 ,+4*ebx语句适用于。他在帖子中解释了这一点,但我还是不理解。

ebp+4*edi-54ebp+12,但为什么会增加12?

argvebx,但为什么会乘以4并添加到j

他说"第三条指令使用ebp乘以4,并edi偏移ebp0x54的位置)&#34 ;;为什么它必须乘以4? 他还说添加偏移量;为什么代码中有srcp而不是-54

有点困惑。

1 个答案:

答案 0 :(得分:5)

我认为我们有以下内容:

  • srcidx位于edi注册
  • argv位于距离帧开头的偏移量0xc处(因此[ebp+0C]
  • j确实在ebx中 - 我们有时间4的原因是我们正在使用4字节整数数组,因此偏移量必须乘以元素的大小(4 )获得正确的地址。
  • srcp是一个堆栈变量,位于偏离-54相对于帧的开头(ebp

我希望能回答你的问题。在调试器中加载代码并通过逐步执行一条指令并在每一步中转储寄存器和部分内存并将其与变量状态进行比较可能会有所帮助。