附录 A i8086 - i80286 体系结构
附录 A
i8086 - i80286 体系结构
Intel iAPX 8086, 8088, 80186 和 80286 机器体系结构有相同的寄存器类型、内存储器结构和输入/输出端口结构 [Int86,Int87]。这些体系结构是向下兼容的,因此 80286 支持被 8086 结构所支持的全部机器指令。这些 16 位字长机器的寄存器按照其用途分成五组不同类别:数据、指针、索引、控制和段寄存器;这个分类见图 A-1 所示。
类型 | 寄存器 | 功能 |
数据 | ax | 累加器 |
bx | 在某些寻址模式中作为基址寄存器 | |
cx | 计数器 | |
dx | 一般用途 | |
指针 | sp | 堆栈指针 |
bp | 基址指针 | |
索引 | si | 源 |
di | 目的 | |
控制 | ip | 指令指针 |
flags | 标志或状态字 | |
段 | cs | 代码段 |
ds | 数据段 | |
ss | 堆栈段 | |
es | 附加段 |
图 A-1: 寄存器分类
数据寄存器或通用寄存器能够被当作字寄存器或字节寄存器来存取。每个寄存器有一个高字节和一个低字节,遵循以下命名约定:用一个 h 代替寄存器名字中的 x 表示存取该寄存器的高字节;用一个 l 代替寄存器名字中的 x 表示存取该寄存器的低字节。标志寄存器是一个专用寄存器,它保持跟踪由各种不同指令设置的条件码。这个寄存器的结构见图 A-2 所示。从中可见,并非所有的位都被使用,未使用的位被 Intel 保留。
内存的结构是一个 8 位字节(8-bit bytes) 数组,按照小头约定进行存储 (little-endian 即,一个字中最重要的字节存放在最高的内存地址上)。内存被划分成几个段存储体,每个段是一个线性的 64K 字节序列;因此内存寻址是通过一对的段和偏移量。
图 A-2: 标志寄存器的结构
输入/输出端口结构由最多 64Kb 的 8 位端口或 32Kb 的 16 位端口组成,位于一个和内存空间分开的地址空间里。
A.1 指令格式
一个 80286 指令的长度从 1 字节到 6 字节不等。操作码有两种类型:单字节操作码和复合操作码。单字节操作码用一个指令的第一个字节保存操作码,其后依次是域字节、最多两字节的位移、和最多两字节的数据。域字节包含关于寄存器、立即操作数以及位移数据的信息。复合操作码在指令的第一个字节中存放操作码的一部分,而其余部分放在该指令第二个字节其中的 3 位(见图 A-3)。第一个字节决定指令属于哪一个组表(group table),而第二个字节的 3 位操作码决定在该表中的索引 (即,表中有 8 项)。第二个字节的其余位被用作域字节。指令其它部分的结构跟单字节操作码一样[LG86]。
图 A-3: 复合操作码的第 2 字节
在 80286 中,几乎所有的字节组合都是有效的操作码。有 229 个单字节操作码,29 个复合操作码和 6 个前缀指令。机器语言指令、助记符和操作数的一个完整列表在 A.2 节。
域字节被用来计算操作数的有效地址(EA)。这个字节由 3 个字段组成:reg 字段三位决定采取哪一个寄存器的值,r/m 字段三位指示第二寄存器或者内存操作数,mod 字段两位决定位移字节数(DISP),无论 r/m 被当作一个寄存器或内存操作数来使用,或者指令的有效地址既不是变址的也不是基址变址的。这个字节的结构见图 A-4 所示。一个解释域字节的算法见图 A-5 所示。
图 A-4: 域字节
case (mod) of { 0: if (r/m == 6) /* get 2 bytes displacement */ EA = dispHi:dispLo; else /* no extra bytes */ DISP = 0; 1: /* get 1 byte displacement */ DISP = dispLo sign-extended to 16 bits; 2: /* get 2 bytes displacement */ DISP = dispHi:dispLo; 3: /* Indexed */ r/m is treated as a register field; } |
图 A-5: 解释域字节的算法
变址和基址变址操作数的 EA 是根据 r/m 字段来计算;每个值被映射为一个变址寄存器、或者是一个变址寄存器与基址寄存器的组合,如图 A-6 所示。
r/m 的值 | 变址寄存器(组) |
0 | bx + si |
1 | bx + di |
2 | bp + si |
3 | bp + di |
4 | si |
5 | di |
6 | bp |
7 | bx |
图 A-6: r/m 字段的映射
最后的有效地址是位移(DISP) 和由 r/m 位指定的寄存器(组) 的相加计算结果。
mod 值与 r/m 值的每一个组合使用一个默认的段寄存器来定址,这些默认段见图 A-7 所示。一个操作数的有效地址是由 mod 字段与 r/m 字段共同决定的,但最后的实际地址是 EA 再加上乘以 16 的默认段寄存器的内容。通常,当使用 bp 寄存器的时候,默认段是 ss,否则默认段是 ds。
mod r / m | 0 | 1 | 2 |
0 | DS | DS | DS |
1 | DS | DS | DS |
2 | SS | SS | SS |
3 | SS | SS | SS |
4 | DS | DS | DS |
5 | DS | DS | DS |
6 | DS | SS | SS |
7 | DS | DS | DS |
图 A-7: 默认段
段覆盖前缀是一个单字节操作码,允许下一个指令例外地不使用默认的段寄存器(即,它只对跟随它后面的那一个指令是有效的)。段由这个前缀字节的两个位域(位 3 和位 4) 确定。其余所有域是固定值,如图 A-8 示例。
图 A-8: 段覆盖前缀
重复前缀操作码有两个:repne 和 repe。当寄存器 cx 不等于 0 或等于 0 的时候,这些操作码重复下一个指令的执行。它们通常与字符串指令一起使用,比如 movs 和 ins,以字符串未结束作为重复条件。
A.2 指令集
i80286 指令集依照机器操作码、汇编助记符和汇编操作数来描述指令,遵循下列约定:
l reg8: 8 位寄存器。
l reg16: 16 位寄存器。
l mem8: 8 位内存数值。
l mem16: 16 位内存数值。
l immed8: 8 位立即数值。
l immed16: 16 位立即数值。
l immed32: 32 位立即数值。
l segReg: 16 位段寄存器。
图 A-9 显示全部的单字节操作码。复合操作码通过一个表的索引参照,每个表有 8 个可能值。这些表在图 A-10、图 A-11、图 A-12 和图 A-13 中显示。它们是摘录自参考文献[Int86,Int87]中的图。
机器操作码 | 汇编助记符和操作数 |
00 | ADD reg8/mem8,reg8 |
01 | ADD reg16/mem16,reg16 |
02 | ADD reg8,reg8/mem8 |
03 | ADD reg16,reg16/mem16 |
04 | ADD AL,immed8 |
05 | ADD AX,immed16 |
06 | PUSH es |
07 | POP es |
08 | OR reg8/mem8,reg8 |
09 | OR reg16/mem16,reg16 |
0A | OR reg8,reg8/mem8 |
0B | OR reg16,reg16/mem16 |
0C | OR al,immed8 |
0D | OR ax,immed16 |
0E | PUSH cs |
0F | Not used |
10 | ADC reg8/mem8,reg8 |
11 | ADC reg16/mem16,reg16 |
12 | ADC reg8,reg8/mem8 |
13 | ADC reg16,reg16/mem16 |
14 | ADC al,immed8 |
15 | ADC ax,immed16 |
16 | PUSH ss |
17 | POP ss |
18 | SBB reg8/mem8,reg8 |
19 | SBB reg16/mem16,reg16 |
1A | SBB reg8,reg8/mem8 |
1B | SBB reg16,reg16/mem16 |
1C | SBB al,immed8 |
1D | SBB ax,immed16 |
1E | PUSH ds |
1F | POP ds |
20 | AND reg8/mem8,reg8 |
21 | AND reg16/mem16,reg16 |
22 | AND reg8,reg8/mem8 |
23 | AND reg16,reg16/mem16 |
24 | AND al,immed8 |
25 | AND ax,immed16 |
26 | Segment override |
27 | DAA |
28 | SUB reg8/mem8,reg8 |
29 | SUB reg16/mem16,reg16 |
2A | SUB reg8,reg8/mem8 |
2B | SUB reg16,reg16/mem16 |
2C | SUB al,immed8 |
2D | SUB ax,immed16 |
2E | Segment override |
2F | DAS |
30 | XOR reg8/mem8,reg8 |
31 | XOR reg16/mem16,reg16 |
32 | XOR reg8,reg8/mem8 |
33 | XOR reg16,reg16/mem16 |
34 | XOR al,immed8 |
35 | XOR ax,immed16 |
36 | Segment override |
37 | AAA |
38 | CMP reg8/mem8,reg8 |
39 | CMP reg16/mem16,reg16 |
3A | CMP reg8,reg8/mem8 |
3B | CMP reg16,reg16/mem16 |
3C | CMP al,immed8 |
3D | CMP ax,immed16 |
3E | Segment override |
3F | AAS |
40 | INC ax |
41 | INC cx |
42 | INC dx |
43 | INC bx |
44 | INC sp |
45 | INC bp |
46 | INC si |
47 | INC di |
48 | DEC ax |
49 | DEC cx |
4A | DEC dx |
4B | DEC bx |
4C | DEC sp |
4D | DEC bp |
4E | DEC si |
4F | DEC di |
50 | PUSH ax |
51 | PUSH cx |
52 | PUSH dx |
53 | PUSH bx |
54 | PUSH sp |
55 | PUSH bp |
56 | PUSH si |
57 | PUSH di |
58 | POP ax |
59 | POP cx |
5A | POP dx |
5B | POP bx |
5C | POP sp |
5D | POP bp |
5E | POP si |
5F | POP di |
60 | PUSHA |
61 | POPA |
62 | BOUND reg16/mem16,reg16 |
63 | Not used |
64 | Not used |
65 | Not used |
66 | Not used |
67 | Not used |
68 | PUSH immed16 |
69 | IMUL reg16/mem16,immed16 |
6A | PUSH immed8 |
6B | IMUL reg8/mem8,immed8 |
6C | INSB |
6D | INSW |
6E | OUTSB |
6F | OUTSW |
70 | JO immed8 |
71 | JNO immed8 |
72 | JB immed8 |
73 | JNB immed8 |
74 | JZ immed8 |
75 | JNZ immed8 |
76 | JBE immed8 |
77 | JA immed8 |
78 | JS immed8 |
79 | JNS immed8 |
7A | JP immed8 |
7B | JNP immed8 |
7C | JL immed8 |
7D | JNL immed8 |
7E | JLE immed8 |
7F | JG immed8 |
80 | Table2 reg8 |
81 | Table2 reg16 |
82 | Table2 reg8 |
83 | Table2 reg8, reg16 |
84 | TEST reg8/mem8,reg8 |
85 | TEST reg16/mem16,reg16 |
86 | XCHG reg8,reg8 |
87 | XCHG reg16,reg16 |
88 | MOV reg8/mem8,reg8 |
89 | MOV reg16/mem16,reg16 |
8A | MOV reg8,reg8/mem8 |
8B | MOV reg16,reg16/mem16 |
8C | MOV reg16/mem16,segReg |
8D | LEA reg16,reg16/mem16 |
8E | MOV segReg,reg16/mem16 |
8F | POP reg16/mem16 |
90 | NOP |
91 | XCHG ax,cx |
92 | XCHG ax,dx |
93 | XCHG ax,bx |
94 | XCHG ax,sp |
95 | XCHG ax,bp |
96 | XCHG ax,si |
97 | XCHG ax,di |
98 | CBW 99CWD |
9A | CALL immed32 |
9B | WAIT |
9C | PUSHF |
9D | POPF |
9E | SAHF |
9F | LAHF |
A0 | MOV al,[mem8] |
A1 | MOV ax,[mem16] |
A2 | MOV [mem8],al |
A3 | MOV [mem16],ax |
A4 | MOVSB |
A5 | MOVSW |
A6 | CMPSB |
A7 | CMPSW |
A8 | TEST al,[mem8] |
A9 | TEST ax,[mem16] |
AA | STOSB |
AB | STOSW |
AC | LODSB |
AD | LODSW |
AE | SCASB |
AF | SCASW |
B0 | MOV al,immed8 |
B1 | MOV cl,immed8 |
B2 | MOV dl,immed8 |
B3 | MOV bl,immed8 |
B4 | MOV ah,immed8 |
B5 | MOV ch,immed8 |
B6 | MOV dh,immed8 |
B7 | MOV bh,immed8 |
B8 | MOV ax,immed16 |
B9 | MOV cx,immed16 |
BA | MOV dx,immed16 |
BB | MOV bx,immed16 |
BC | MOV sp,immed16 |
BD | MOV bp,immed16 |
BE | MOV si,immed16 |
BF | MOV di,immed16 |
C0 | Table1 reg8 |
C1 | Table1 reg8, reg16 |
C2 | RET immed16 |
C3 | RET |
C4 | LES reg16/mem16,mem16 |
C5 | LDS reg16/mem16,mem16 |
C6 | MOV reg8/mem8,immed8 |
C7 | MOV reg16/mem16,immed16 |
C8 | ENTER immed16, immed8 |
C9 | LEAVE |
CA | RET immed16 |
CB | RET |
CC | INT 3 |
CD | INT immed8 |
CE | INTO |
CF | IRET |
D0 | Table1 reg8 |
D1 | Table1 reg16 |
D2 | Table1 reg8 |
D3 | Table1 reg16 |
D4 | AAM |
D5 | AAD |
D6 | Not used |
D7 | XLAT [bx] |
D8 | ESC immed8 |
D9 | ESC immed8 |
DA | ESC immed8 |
DB | ESC immed8 |
DC | ESC immed8 |
DD | ESC immed8 |
DE | ESC immed8 |
DF | ESC immed8 |
E0 | LOOPNE immed8 |
E1 | LOOPE immed8 |
E2 | LOOP immed8 |
E3 | JCXZ immed8 |
E4 | IN al,immed8 |
E5 | IN ax,immed16 |
E6 | OUT al,immed8 |
E7 | OUT ax,immed16 |
E8 | CALL immed16 |
E9 | JMP immed16 |
EA | JMP immed32 |
EB | JMP immed8 |
EC | IN al,dx |
ED | IN ax,dx |
EE | OUT al,dx |
EF | OUT ax,dx |
F0 | LOCK |
F1 | Not used |
F2 | REPNE |
F3 | REP |
F4 | HLT |
F5 | CMC |
F6 | Table3 reg8 |
F7 | Table3 reg16 |
F8 | CLC |
F9 | STC |
FA | CLI |
FB | STI |
FC | CLD |
FD | STD |
FE | Table4 reg8 |
FF | Table4 reg16 |
图 A-9: 单字节操作码
索引 | 汇编助记符 |
0 | ROL |
1 | ROR |
2 | RCL |
3 | RCR |
4 | SHL |
5 | SHR |
6 | Not used |
7 | SAR |
图 A-10: 表 1 操作码
索引 | 汇编助记符 |
0 | ADD |
1 | OR |
2 | ADC |
3 | SBB |
4 | AND |
5 | SUB |
6 | XOR |
7 | CMP |
图 A-11: 表 2 操作码
索引 | 汇编助记符 |
0 | TEST |
1 | Not used |
2 | NOT |
3 | NEG |
4 | MUL |
5 | IMUL |
6 | DIV |
7 | IDIV |
图 A-12: 表 3 操作码
索引 | 汇编助记符 |
0 | INC |
1 | DEC |
2 | CALL |
3 | CALL |
4 | JMP |
5 | JMP |
6 | PUSH |
7 | Not used |
图 A-13: 表 4 操作码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论