x86指令编码:SIB字节

5
我目前正在尝试编写一个反汇编器。我找到了以下操作码及其含义的列表,因此决定在运行时解析它: http://web.archive.org/web/20150810224114/http://mprolab.teipir.gr/vivlio80X86/pentium.txt 但是我卡在了操作码0x00上: 它后面跟着一个reg/modbyte。对我来说,解析它并不是什么问题。
但是我在Scale-Index-Base字节上遇到了麻烦:
如果您实际上将esp指定为索引寄存器,则实际上意味着没有索引寄存器。
对于ebp的基址寄存器也是如此。但是我已经尝试过C ++内联汇编器:可以编译: add [ebp*2+ebp],cl 那么当使用ebp作为基址寄存器实际上意味着根本没有使用基址寄存器时,如何使用ebp作为基址寄存器呢?

1
只是一个小小的命名更正。SIB代表 "比例-索引-基址", 根据其在 SIB 字节中的位掩码编码而命名:0ssiiibbbb(按位)。 - ahmd0
1
类似于 [rbp not allowed as SIB base?] 的问题 - [EBP] 被编码为 [ebp + disp8=0] - Peter Cordes
1个回答

9
“缺少 EBP” 情况仅适用于 ModR/M.Mod 字段的二进制值为 00 的情况。如果您需要将 EBP 作为基址,则汇编器会将 Mod 更改为二进制值为 01,并添加一个值为零的 8 位位移:
004C6D00 add [ebp+ebp*2], cl

8位和32位位移值是否还有其他缺失的寄存器? 还有其他奇怪的异常吗? - Zotta
2
只有 EBP 是“缺失”的。请注意,由于“缺少 ESP 索引”和“缺少 EBP 基址”两种方式,您可以编码纯[位移]寻址:000D 78563412 add [12345678], cl 000C25 78563412 add [12345678], cl但是,在 64 位模式下,第一个操作码的意思是:000D 78563412 add [rip+12345678], cl编辑:糟糕,换行符被删除了,这使得注释不太可读。 - MazeGen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接