【问题标题】:Why Does This C Code Produce This Assembly为什么这个 C 代码会产生这个程序集
【发布时间】:2016-04-04 23:06:31
【问题描述】:

关于问题答案的快速提问: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+4*ebxebp+4*edi-54 语句是什么为了。他在帖子中解释了它,但我仍然不明白。

ebp+12argv,但为什么要增加 12?

ebxj,但为什么要乘以 4 并加到 ebp 上?

他说“第三条指令使用edi乘以4并加上ebp偏移0x54srcp的位置)”;为什么它必须乘以4? 他还说添加偏移量;为什么代码中是-54 而不是+54

有点困惑。

【问题讨论】:

  • 我认为存在乘以 4 是因为 argv 的类型是 4 字节(例如 int)。
  • 你的问题已经解释过了here

标签: assembly x86 32-bit


【解决方案1】:

我认为我们有以下几点:

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

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

【讨论】:

  • 是的,这很有帮助,谢谢,有没有理由它是-54 到基地的开始?我知道堆栈中的变量是使用偏移量引用的。那么当括号围绕整个等式时,是否将 ebx 中的 J 的值乘以 4,然后将其添加到 edx 以存储在 ecx 中?
  • -54 来自堆栈的布局。由于代码的性质,这正是数组发生的地方。括号表示dereference the address,你可以认为它们类似于C中指针上的*运算符。mov这里的参数是目标然后是源,所以它是mov [ebp+4*edi-54],ecx的另一种方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2013-03-10
  • 1970-01-01
  • 2020-07-17
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多