返回介绍

附录 A i8086 - i80286 体系结构

发布于 2025-03-09 23:09:36 字数 21920 浏览 0 评论 0 收藏 0

附录 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文