首页 > 解决方案 > 有没有办法让 gdb 给出详细的汇编指令?

问题描述

例如,而不是给予push $rbp。它显示了执行这样的指令的步骤

sub esp, 4 ; "allocate" space for the new stack item

mov [esp], X ; put new stack item value X in

标签: assemblygdb

解决方案


不,因为push 单个机器指令,所以它不会是准确的反汇编。如果您需要更多详细信息,请阅读相关说明的手册

让反汇编程序在注释中(或在 GUI 中的鼠标悬停工具提示上)用伪代码注释指令可能会很有趣,但我无法想象有人编写一个甚至可以选择push在它出现的任何地方默默地替换为 2 条其他指令。(这会使拆卸更加臃肿。)

顺便说一句,那个特定的仿真甚至都不正确。 sub修改 FLAGS,不像push. 对于(AT&T) / (Intel) rsp,它将是864 位模式。“PUSH”指令的操作可以用其他指令执行吗?指出了多指令仿真可能不完全等效的一些其他方式。push %rbppush rbp

任何其他序列都会有不同的代码大小,因此它不会与 GDB 反汇编中的地址对齐,所以这是不这样做的另一个重要原因。


如果您想要使用帮助注释的 asm 指令,请考虑在 Godbolt 编译器资源管理器上查看编译器的 asm 输出;对于 x86 指令,它在鼠标悬停时确实有 ISA 参考弹出​​窗口。我认为它是默认开启的。该选项位于更多 -> 设置 -> 悬停时显示 asm 描述。

例如,请参见我在 32 位模式下编译的示例,以便将其转换为push. (直到复制/粘贴链接后,我才想到在 64 位模式下禁用优化:P)

弹出窗口push是:

递减堆栈指针,然后将源操作数存储在堆栈顶部。地址和操作数大小按如下方式确定和使用

上下文菜单中提供了更多信息。

所以这是英特尔第 2 卷手册中描述部分的第一段。如果您右键单击推送指令,它会弹出英特尔文档中描述部分的全文,并带有指向http://www.felixcloutier.com/x86/PUSH.html的链接。

但不幸的是,它们只是冗长的描述部分,而不是用于具有隐式操作数(如idivor )的更复杂指令的快速伪代码cdq

此功能的先前迭代可能具有更紧凑的内容;IDK,如果您经常使用 asm,则不需要它来获得简单的说明,并且当您确实需要查找某些内容时,它通常比弹出帮助给您的内容更复杂。

您想象的功能可能对初学者有用,但在GDB中会使事情变得更加混乱,使用或开发 GDB 的人都不会想要您所描述的形式。

没有多少 x86 指令可以有效地扩展为“更简单”的指令。例如,您不想imul扩展为一个移位加循环,或者一个天真的简单的添加循环,我希望?但lea最多可以使用 4 条 mov/shift/add 指令进行模拟。

如果cdq写成mov edx,eax/真的会更容易理解sar edx,31吗?更有可能对它的作用进行描述会更有用。


推荐阅读