了解反汇编程序:查看添加使用了多少字节

Posted

技术标签:

【中文标题】了解反汇编程序:查看添加使用了多少字节【英文标题】:Understanding disassembler: See how many bytes are used for add 【发布时间】:2014-05-20 16:03:47 【问题描述】:

我反汇编了一个程序(使用objdump -d a.out),现在我想了解一行中的不同部分是什么样的

400586:       48 83 c4 08             add    $0x8,%rsp

代表。更具体地说,我想知道如何查看添加两个寄存器使用了多少字节。我的想法是add $0x8,%rsp 中的0x8(十进制为 8)给了我 2 * 4 所以 2 个字节用于添加 2 个寄存器。对吗?

PS:编译器是gcc,操作系统是suse linux

【问题讨论】:

您应该阅读英特尔手册。它列出了所有指令和操作码 不同的指令形式有不同的操作码。并且 AX 上的操作具有特殊的更短的操作码 为自己节省大量时间。获取一本关于 x86 汇编语言的好书并学习它。该指令不添加两个寄存器。它将立即值 8 添加到堆栈指针。几乎所有 x86 指令都允许不同的寻址模式(寄存器、索引、索引偏移、基本索引偏移、直接等)。 add 指令中的字节数取决于其操作数的寻址方式。 【参考方案1】:

在第二列中您会看到48 83 c4 08。每个两位数的十六进制数代表一个字节,因此字节数为四个。最后一个08$0x8 相关,其他三个字节是“向RSP 添加一个8 位常量”的机器代码(对于迂腐的编辑器:英特尔将其寄存器写入大写)。解构机器码是相当困难的,但你的假设是完全错误的。

【讨论】:

感谢您的解释!所以如果我有类似的东西: 40048a: 48 01 d0 add %rdx,%rax - (那是添加两个寄存器,不是吗?)使用的字节数是三个? @eva:add %rdx,%rax:将 RDX 添加到 RAX(导致 RAX)。数量是三个,你明白了:-)

以上是关于了解反汇编程序:查看添加使用了多少字节的主要内容,如果未能解决你的问题,请参考以下文章

如何反汇编获知dll中函数的参数

在 Visual Studio 中查看反汇编代码

硬核!Python 四种变量的代码对象和反汇编分析

java反编译

如何使用 objdump 反汇编一个函数?

我想了解我的程序在 unix 中使用了多少资源但无法 [关闭]