Assembly x86操作码编码:sib字节

Assembly x86操作码编码:sib字节,assembly,x86,disassembly,machine-code,addressing-mode,Assembly,X86,Disassembly,Machine Code,Addressing Mode,我目前正在尝试编写一个反汇编程序。我找到了以下操作码列表及其含义,因此决定在运行时对其进行解析: 但我被操作码0x00卡住了: 它后面跟着一个reg/modbyte。解析它对我来说不是什么大问题 但缩放索引基字节有问题: 如果您实际将esp指定为索引寄存器,则实际上意味着没有索引寄存器 这同样适用于带ebp的基址寄存器。但我已经尝试了C++内嵌汇编程序:编译是可能的: 添加[ebp*2+ebp],cl 那么,当使用ebp作为基址寄存器实际上意味着根本不使用基址寄存器时,ebp如何才能用作基址寄

我目前正在尝试编写一个反汇编程序。我找到了以下操作码列表及其含义,因此决定在运行时对其进行解析:

但我被操作码0x00卡住了: 它后面跟着一个reg/modbyte。解析它对我来说不是什么大问题

但缩放索引基字节有问题:
如果您实际将esp指定为索引寄存器,则实际上意味着没有索引寄存器

这同样适用于带ebp的基址寄存器。但我已经尝试了C++内嵌汇编程序:编译是可能的:
添加[ebp*2+ebp],cl

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

仅当ModR/M.Mod字段的值为00二进制时,“缺少EBP”情况才适用。如果需要EBP作为基础,汇编程序将Mod更改为01二进制,并添加8位位移值为零:


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

Ok是否还有8位和32位位移值的其他缺失寄存器?还有其他奇怪的异常吗?只有EBP“缺失”。注意,由于“缺少ESP索引”和“缺少EBP基”两种方式,您可以对纯[displacement]addresing进行编码:000D 78563412 add[12345678],cl 000C25 78563412 add[12345678],cl然而,在64位模式下,第一个操作码表示:000D 78563412 add[rip+12345678],cl EDIT:shit,断行被吃掉了,这使得评论不那么可读。只是一个小小的命名更正
SIB
代表“”,根据SIB字节中的位掩码编码命名:0
SSIIBBB
b(按位)。几乎重复的-
[EBP]
被编码为
[EBP+disp8=0]