为什么IDA在反汇编代码之间添加“db”语句

逆向工程 艾达 拆卸 x86 DOS-COM
2021-06-22 04:43:49

我正在尝试分析几年前使用 IDA Free 5.0 编写的 MS-DOS COM 文件,此后我将该段重code_and_data命名为常量并正确设置数据类型。但是,在查看反汇编时,我db在列表中得到了伪指令,如下所示:

code_and_data:0106 replacement_irq_handler: ; 数据外部参照:开始+81o
代码和数据:0106 cli
code_and_data:0107 推送 bx
代码和数据:0108 分贝 3Eh
code_and_data:0108 cmp 字节 ptr ds:3BEh, 'C'
code_and_data:010E jnz short call_original_dos_interrupt_handler
代码和数据:0110 分贝 3Eh
code_and_data:0110 cmp 字节 ptr ds:3C0h, 'A'
code_and_data:0116 jnz short call_original_dos_interrupt_handler
代码和数据:0118 分贝 3Eh
code_and_data:0118 cmp 字节 ptr ds:3C2h, 'K'
code_and_data:011E jnz short call_original_dos_interrupt_handler
代码和数据:0120 分贝 3Eh
code_and_data:0120 cmp 字节 ptr ds:3C4h, 'O'
code_and_data:0126 jnz short call_original_dos_interrupt_handler
代码和数据:0128 分贝 3Eh
code_and_data:0128 cmp 字节 ptr ds:3C6h, 'N'
code_and_data:012E jnz short call_original_dos_interrupt_handler
code_and_data:0130 推送 StartOfIndexTable
code_and_data:0133 pop bx

我知道那里没有额外的字节,因为db和之后的cmp指令从相同的地址开始(见左栏)。为什么 IDA 显示/添加这些db伪指令?

有什么方法可以告诉它不显示那些,或者有什么理由让它可能有用(我只能猜测,因为同一个段同时用于代码和数据,它试图“有用”并显示也编码为数据)?

但是如果是这样,为什么只显示指令的第一个字节(如果再看左边的地址,这些指令都长于1个字节)。

2个回答

该字节3Eh是段覆盖的编码DS:你在一个指令中观察它

cmp     byte ptr ds:3BEh, 'C'

该指令的十六进制编码是(我手动完成的,有些可能是错误的)

3E    - segement override prefix
80    - 8 bit ALU instruction
3E    - mod/rm byte (reg = 7 -> instruction is CMP, mod = 0/rm = 6 -> immediate address)
BE 03 - offset of data to compare
43    - immediate data byte

序列3E 80 3E BE 03 53长 6 个字节,与实际的 6 个字节 ( 010Eh - 0108h) 的指令长度相匹配如果您使用标准的 x86 汇编程序(如MASM组装 IDA 给出的汇编程序源代码,则DS:前缀将被省略,因为默认情况下寻址模式“立即地址”是相对于数据段IDA 显示了额外的DB指令来告诉您(或试图重新组装列表的汇编程序)冗余的、多余的段前缀实际上是在二进制文件中编码的。如果您想隐藏该信息,请检查选项 -> 常规 -> 分析 ->“特定于处理器的分析选项”->“不显示冗余指令前缀”。

编辑:感谢迈克尔的澄清,这些不是分支提示,而是段前缀。保留答案以供参考和来自搜索引擎的人们。


这些是 “分支提示”,旨在向处理器提供有关是否可能发生分支的“提示”。

分支预测

它用于称为分支预测的优化——处理器尝试预测代码将采用哪个分支。CPU 能够通过在条件解决之前对分支的方向进行假设来保持处理。否则,它会“坐下”并等待分支所依赖的条件得到解决。

来自维基百科

在计算机体系结构中,分支预测器是一个数字电路,它试图在确定之前猜测分支(例如,if-then-else 结构)将走向何方。分支预测器的目的是改善指令流水线中的流程。分支预测器在许多现代流水线微处理器体系结构(如 x86)中实现高效性能方面发挥着关键作用。

分支提示

您可以使用在条件跳转指令之前插入的提示字节来提示 CPU 进行分支的可能性。这是通过使用紧接在条件跳转指令之前插入的分支提示字节来完成的。

字节是3Eh2Eh分别表示如下:

2Eh- 暗示大部分时间不会发生分支。
3Eh- 暗示大部分时间都会发生分支。

更多信息:

您可以在此处(推荐)和此处阅读有关分支提示和优化的更多信息
如果您想了解更多关于分支预测,我建议这个文章关于动态分支预测。