【发布时间】:2020-03-16 07:01:08
【问题描述】:
即例如,而不是给push $rbp。它显示了执行这样的指令的步骤
sub esp, 4 ; "allocate" space for the new stack item
mov [esp], X ; put new stack item value X in
【问题讨论】:
即例如,而不是给push $rbp。它显示了执行这样的指令的步骤
sub esp, 4 ; "allocate" space for the new stack item
mov [esp], X ; put new stack item value X in
【问题讨论】:
不,因为push 是一条机器指令,所以它不会是准确的反汇编。如果您需要更多详细信息,请read the manual for the instruction in question。
在 cmets 中使用伪代码(或在 GUI 中的鼠标悬停工具提示上)有一个反汇编器 annotate 指令可能很有趣,但我无法想象有人会编写一个甚至可以选择静默替换的指令push 随处可见另外两条指令。 (而且会让反汇编更加臃肿。)
顺便说一句,那个特定的模拟甚至都不正确。 sub 修改 FLAGS,与 push 不同。对于push %rbp (AT&T) / push rbp (Intel),在 64 位模式下将是 rsp 和 8。 Can a “PUSH” instruction's operation be performed using other instructions? 指出了多指令仿真可能不完全等效的其他一些方式。
任何其他序列都会有不同的代码大小,因此它不会与 GDB 反汇编中的地址对齐,所以这是不这样做的另一个重要原因。
如果您想要使用帮助注释的 asm 指令,请考虑在 Godbolt 编译器资源管理器上查看编译器的 asm 输出;它确实有 ISA 参考弹出窗口在鼠标悬停上 用于 x86 指令。我认为它是默认开启的。该选项位于更多 -> 设置 -> 悬停时显示 asm 描述。
请参阅this for example,我在其中以 32 位模式编译,因此我可以将其发送到 push。 (直到复制/粘贴链接后,我才想到在 64 位模式下禁用优化:P)
push 的弹出窗口是:
递减堆栈指针,然后将源操作数存储在堆栈顶部。地址和操作数大小按如下方式确定和使用
上下文菜单中提供了更多信息。
所以这是英特尔第 2 卷手册中描述部分的第一段。如果您右键单击推送指令,它会弹出英特尔文档中描述部分的全文,并带有指向http://www.felixcloutier.com/x86/PUSH.html 的链接。
但不幸的是,它们只是冗长的描述部分,而不是用于具有隐式操作数(如 idiv 或 cdq)的更复杂指令的快速伪代码。
此功能的先前迭代可能具有更紧凑的内容; IDK,如果您经常使用 asm,则不需要它来获得简单的说明,而当您确实需要查找某些内容时,它通常比弹出帮助给您的内容更复杂。
您想象的功能可能对初学者有用作为弹出窗口,但在 GDB 中会使事情变得更加混乱,使用或开发 GDB 的人都不会想要您所描述的形式。
没有多少 x86 指令可以有效地扩展为“更简单”的指令。例如你不希望imul 扩展为一个移位加循环,或者一个简单的简单加循环,我希望?但是lea 最多可以使用 4 条 mov/shift/add 指令来模拟。
cdq 写成mov edx,eax / sar edx,31 真的更容易理解吗?对它的作用的描述更有可能更有用。
【讨论】: