【发布时间】:2015-01-05 15:00:16
【问题描述】:
1。 添加 0x4(%esp), %eax
这是否意味着将 4 加到 %esp 中的地址并将该数字加到 %eax 中,或者这是否意味着将 4 加到存储在 %esp 中的地址并将结果地址中的内容加到 %eax?
【问题讨论】:
1。 添加 0x4(%esp), %eax
这是否意味着将 4 加到 %esp 中的地址并将该数字加到 %eax 中,或者这是否意味着将 4 加到存储在 %esp 中的地址并将结果地址中的内容加到 %eax?
【问题讨论】:
后者:将4加到esp,取结果地址的内容,加到eax,存入eax。
在 GNU 语法汇编中,括号用于取消引用指针。您可以将它们视为类似于 C 中的一元 *。
在取消引用之前添加的偏移量在括号之前和之外;您可能还会看到其他参数,例如4(%esp, %ecx, 4),这意味着在应用偏移量之前,首先将ecx 乘以4 加到esp。所有三个额外参数(即除了寄存器本身被取消引用,除非指令是lea)都是可选的,可以省略,因此您找到了缩短的版本。这不是多机器指令的捷径 - 它改变了单个指令的操作,因此比数学计算偏移更有效。
有关更多信息,您可以阅读“寻址模式”。
【讨论】:
ADD EAX,[ESP+4]。我个人觉得这更具可读性。另一个示例参数是[ESP+4+ECX*4],IMO 也更具可读性。当然,仍然是 +1。