我目前正在尝试编写一个反汇编程序。我找到了以下操作码列表及其含义,因此我决定在运行时解析它: http://web.archive.org/web/20150810224114/http://mprolab.teipir.gr/vivlio80X86/pentium.txt
但我被困在操作码 0x00 处: 其后是 reg/modbyte。解析它对我来说并不是什么大问题。
但是我在使用 Scale-Index-Base 字节时遇到了问题:
如果你真的指定esp作为索引寄存器,那么实际上意味着没有索引寄存器。
这同样适用于带有 ebp 的基址寄存器。但我已经用 C++ 内联汇编器尝试过:可以编译:
添加[ebp*2+ebp],cl
那么当使用ebp作为基址寄存器实际上意味着根本不使用基址寄存器时,如何将ebp用作基址寄存器!?
最佳答案
“缺少 EBP”情况仅适用于 ModR/M.Mod 字段的二进制值为 00 的情况。如果需要 EBP 作为基础,汇编器会将 Mod 更改为 01 二进制,并添加 8 位位移,其值为零:
004C6D00 添加[ebp+ebp*2], cl
关于assembly - x86 操作码编码 : sib byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3476541/