x86操作码编码:sib字节

Zot*_*tta 4 x86 assembly disassembly

我目前正在尝试编写一个反汇编程序.我找到了以下操作码列表及其含义,所以我决定在运行时解析它:http: //mprolab.teipir.gr/vivlio80X86/pentium.txt

但我被困在操作码0x00:接下来是reg/modbyte.解析它对我来说不是什么大问题.但是我在使用Scale-Index-Byte时遇到问题:如果你实际上将esp指定为索引寄存器,它实际上意味着没有索引寄存器.这同样适用于ebp的基址寄存器.但我用c ++内联汇编程序尝试了它:可以编译:"add [ebp*2 + ebp],cl"

那么当使用ebp作为基址寄存器时,如何将ebp用作基址寄存器实际上意味着根本不使用基址寄存器!

Maz*_*Gen 7

"缺少EBP"情况仅适用于ModR/M.Mod字段具有值00二进制的情况.如果需要EBP作为基础,汇编器会将Mod更改为01二进制并添加值为零的8位位移:

004C6D00添加[ebp + ebp*2],cl

  • 只有 EBP 是“缺失”的。请注意,由于“缺少 ESP 索引”和“缺少 EBP 基数”两种方式,您可以对纯 [位移] 寻址进行编码:000D 78563412 add [12345678], cl 000C25 78563412 add [12345678], cl 但是,在 64 位模式下第一个操作码的意思是:000D 78563412 add [rip+12345678], cl 编辑:该死,换行符被吃掉了,这使得评论的可读性降低了。 (2认同)