可以从英特尔的开发人员手册中的标准操作码映射(可选带有方向位)中扣除哪个操作数“拥有” ModR/M 字节中的 REG 部分,以及哪个操作数具有 Mod+RM 部分?方向位是否符合具有两个操作数的所有操作(方向可能不明确)?
关于我在哪里的一些信息
我从一字节操作码映射的顶部开始。在这里,我们有:
0 1 2 3 4 5 6 7
+--------|--------|--------|--------|--------|---------|---------|---------|
0 | ADD | PUSH | POP |
| Eb, Gb | Ev, Gv | Gb, Eb | Gv, Ev | AL, Ib | rAX, Iz | ES(i64) | ES(i64) |
+--------|--------|--------|--------|--------|---------|---------|---------|
1 | ADC
…
我正在查看ADD
操作码00h
和02h
.
信件说明:
Addressing methods:
…
E A ModR/M byte follows the opcode and specifies the operand. The
operand is either a general-purpose register or a memory address. If
it is a memory address, the address is computed from a segment
register and any of the following values: a base register, an index
register, a scaling factor, a displacement.
G The reg field of the ModR/M byte selects a general register.
Example: AX (000)
…
-------------------------------------------------------------------------
Operand types:
…
b Byte, regardless of operand-size attribute.
v Word, doubleword or quadword (in 64-bit mode), depending on
operand-size attribute.
…
如前所述,我正在查看ADD
操作码00h
和02h
. 此外,我只关注 32 位(目前)。操作说明表如下:
Opcode Instruction Op/en Description
00 /r ADD r/m8,r8 MR Add r8 to r/m8.
02 /r ADD r8,r/m8 RM Add r/m8 to r8.
一些测试用例:
00 05 e25a4600 add [0x465ae2], al
00 0d e25a4600 add [0x465ae2], cl
00 06 add [esi], al ; Eb, Gb
02 06 add al, [esi] ; Gb, Eb
00 c8 add al, cl ; Eb, Gb
02 c8 add cl, al ; Gb, Eb
00 05 e0514600 add [0x4651e0], al
02 05 e0514600 add al, [0x4651e0]
ModR/M 字节:
7 6 5 4 3 2 1 0 Bit
+------------+------------------+------------------+
| MOD | REG/Opcode | R/M |
+------------+------------------+------------------+
二进制测试用例中的操作码和 ModR/M:
Opcode Mod REG/opc R/M
0000 0000 00 000 101 add [0xNNNNNN], al
0000 0000 00 001 101 add [0xNNNNNN], cl
0000 0000 00 000 110 add [esi], al
0000 0010 00 000 110 add al, [esi]
0000 0000 11 001 000 add al, cl
0000 0010 11 001 000 add cl, al
0000 0000 00 000 101 add [0xNNNNNN], al
0000 0010 00 000 101 add al, [0xNNNNNN]
|
+-----> Direction bit?
问题部分:
(Ups,这个介绍越来越多,TLDR?)但是,最后:
- Opcode Map
E
(第一个表)中的描述指出“ModR/M 字节跟在操作码之后并指定操作数。操作数是通用寄存器或内存地址。” 所以我的问题变成了:什么定义它是寄存器还是内存地址?如:您一个一个地读取字节。操作码有符号。E
- 它是基于操作码的方向位吗?
- 可以从第二个操作数中扣除吗?– 如:通过这个具体的例子,第二个操作数具有表明“ModR/M 字节的 reg 字段选择一个通用寄存器”
G
的标志。这总是真的吗? - 那会覆盖方向位吗?
- 它是基于操作码的方向位吗?
附录 B有一个简短的部分说明:
B.1.4.8 方向(d)位
在许多双操作数指令中,方向位 (d) 指示哪个操作数被认为是源,哪个是目标。请参见表 B-11。
Table B-11. Encoding of Operation Direction (d) Bit
+---+-----------------------------+---------------------------------+
| d | Source | Destination |
+---+-----------------------------+---------------------------------+
| 0 | reg Field | ModR/M or SIB byte |
| 1 | ModR/M or SIB Byte | reg Field |
+---+-----------------------------+---------------------------------x
2. 这里多是什么意思?它在哪里定义了哪些适用,哪些不适用?
希望这不会变得太长。