我一直在研究x86架构的软件开发手册,试图提高我的反向工程技能。我知道这个架构很复杂,并且向后兼容以前的几代。随着新一代的出现,一些旧的文档部分被遗漏了。但是有些指令的解释和解读是令人困扰的,就像这个:
80 /2 ib
以下基于
80
操作码的指令将会被一个MOD/RM/REG字节跟随。忽略旧内容的一个副作用是,我对不同版本的MOD/RM/REG字节毫不知情。但我总是认为由于架构根源是8/16位,它们之间存在差异。幸运的是,在架构最初引入时,我偶然发现了MOD/RM/REG字节的解析。因此,像上面提供的指令后面跟着斜杠数字的指令表示,MOD/RM/REG字节中RM偏移量包含的八进制值将是
2
。我的实际问题如下:
在当前情况下,MOD/RM/REG字节中的MOD偏移量是否接受所有寻址模式,还是有任何强制限制?
另一件事是,有没有人知道为什么数字被指定为
/2
?这是否意味着在老一代ISA中使用较低的值,并因此保留向后兼容性。
/2
指的是ModRM
字节中的reg
字段的值。reg
字段的大小为 3 位(位 3 到位 5)。在 AMD 手册第三卷中:/n A ModRM-byte reg field or SIB-byte base field, where n is a value between zero (binary 000) and 7 (binary 111).
ib
表示立即字节。在 16 位代码中,80 00 00
是add byte [bx+si], 0x0
,80 08 00
是or byte [bx+si], 0x0
,**80 10 00
是adc byte [bx+si], 0x0
**,80 18 00
是sbb byte [bx+si], 0x0
,80 20 00
是and byte [bx+si], 0x0
,80 28 00
是sub byte [bx+si], 0x0
,80 30 00
是xor byte [bx+si], 0x0
,而80 38 00
是cmp byte [bx+si], 0x0
。 - nrz