第3章 80 x86 的指令系统和寻址方式

150
1 第3第 80x86 第第第第 第第第第第 § 3.1 80x86 第第第第第 § 3.3 80x86 第第第第§ 3.4 80x86 第第第第第第第第第

description

第3章 80 x86 的指令系统和寻址方式. § 3.1 80 x86 的寻址方式 § 3.3 80 x86 的指令系统 § 3.4 80 x86 的机器语言指令概况. 基本概念—指令系统. 每一种计算机都有一组指令集供用户使用,这组指令集称为该计算机的指令系统。指令集中的每条指令在汇编语言中都是用助记符来表示的。. 操作码. 操作数. 基本概念—指令的构成. 指令由操作码和操作数两部分组成 操作码 说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数 是指令执行的参与者,即各种操作的对象 - PowerPoint PPT Presentation

Transcript of 第3章 80 x86 的指令系统和寻址方式

Page 1: 第3章  80 x86 的指令系统和寻址方式

1

第 3 章 80x86 的指令系统和寻址方式

§ 3.1 80x86 的寻址方式

§ 3.3 80x86 的指令系统

§ 3.4 80x86 的机器语言指令概况

Page 2: 第3章  80 x86 的指令系统和寻址方式

2

基本概念—指令系统

每一种计算机都有一组指令集供用户使用,这组指令集称为该计算机的指令系统。指令集中的每条指令在汇编语言中都是用助记符来表示的。

Page 3: 第3章  80 x86 的指令系统和寻址方式

3

基本概念—指令的构成

指令由操作码和操作数两部分组成 操作码说明计算机要执行哪种操作,如传送、运算、移位、

跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作

数,也有个别指令有 3 个甚至 4 个操作数

操作码 操作数

Page 4: 第3章  80 x86 的指令系统和寻址方式

4

基本概念— 80x86 指令的基本格式 操作码 [ 目的操作数 ][ ,源操作数 ]] [ ;注释 ]

DST SRC [ ] 内的内容可缺省 书写注意事项:

操作码与操作数至少有一个空格或制表符分隔 操作数之间必须用“ ,” 相分隔, DST 在前, SRC 在后

每种指令的操作码: 用一个唯一的助记符表示(指令功能的英文缩写) 对应着机器指令的一个二进制编码

指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址

Page 5: 第3章  80 x86 的指令系统和寻址方式

5

基本概念—寻址方式 在指令中为了取得操作数地址所使用的方式 寻找操作数的过程就是操作数的寻址 不同的指令系统都规定一些寻址方式供编程时选用 指令的寻址方式主要由操作数的形式表示出来

操作数采取哪一种寻址方式,会影响机器运行的速度和效率

Page 6: 第3章  80 x86 的指令系统和寻址方式

6

§ 3.1 80x86 的寻址方式一、与数据有关的寻址方式

二、与转移地址有关的寻址方式

1. 立即(数)寻址2. 寄存器寻址3. 直接寻址4. 寄存器间接寻址5. 寄存器相对寻址6. 基址变址寻址7. 相对基址变址寻址8. 比例因子寻址9. 串操作寻址10. 端口寻址

Page 7: 第3章  80 x86 的指令系统和寻址方式

7

操作数类型操作数 描述r8 8 位通用寄存器: AH、 AL、 BH、 BL、 CH、 CL、 DH、 DL

r16 16 位通用寄存器: AX、 BX、 CX、 DX、 SI、 DI、 SP、 BP

r32 32 位通用寄存器: EAX、 EBX、 ECX、 EDX、 ESI、 EDI、 ESP、 EBP

reg 任意的通用寄存器sreg 16 位段寄存器: CS、 DS、 SS、 ES、 FS、 GS

imm 8 、 16或 32 位立即数imm8 8 位立即数 ( 字节 )

imm16 16 位立即数 (字 )

imm32 32 位立即数 ( 双字 )

r/m8 8 位操作数 ( 可以是 8 位通用寄存器或内存字节 )

r/m16 16 位操作数 ( 可以是 16 位通用寄存器或内存字 )

r/m32 32 位操作数 ( 可以是 32 位通用寄存器或内存双字 )

mem 8 、 16或 32 位内存操作数

Page 8: 第3章  80 x86 的指令系统和寻址方式

8

1. 立即(数)寻址 指令中的操作数直接存放在机器代码中,紧跟在操作码之后

(操作数作为指令的一部分存放在操作码之后的主存单元中) 这种操作数被称为立即数 imm

它可以是 8 位数值 imm8( 00H~ FFH)

也可以是 16 位数值 imm16( 0000H~ FFFFH)

也可以是 32 位数值 imm32( 00000000H~ FFFFFFFFH)

立即数寻址方式常用来给 R/M 赋值 立即数只能用于源操作数

MOV AL,05H ; AL←05HMOV AX,0102H ; AX←0102HMOV EAX,12345678H ; EAX←12345678H

Page 9: 第3章  80 x86 的指令系统和寻址方式

9

立即数寻址的执行

Page 10: 第3章  80 x86 的指令系统和寻址方式

10

2. 寄存器寻址 操作数存放在 CPU 的内部寄存器 reg 中,可以是:

16 位寄存器:AX、 BX、 CX、DX、 SI、DI、 BP、 SP

8 位寄存器:AH、 AL、 BH、 BL、 CH、 CL、DH、DL

32 位寄存器:EAX、 EBX、 ECX、 EDX、 ESI、 EDI、 EBP、 ESP

段寄存器:CS、DS、 SS、 ES, FS,GS

MOV AX,1234H; AX←1234HMOV BX,AX ; BX←AX

Page 11: 第3章  80 x86 的指令系统和寻址方式

11

寄存器寻址的执行

Page 12: 第3章  80 x86 的指令系统和寻址方式

12

存储器操作数的寻址

当操作数存放在内存中时,寻找操作数归结为如何确定存储单元的地址

逻辑地址 段基值:偏移量

由段寄存器经计算给出 主要确定该部分的内容 (EA)

位移量:指令中给出 8/16/32 位数(常数、符号) EA 基地址:有基址寄存器 BX 或基址指针 BP 给出

变址: 由变址寄存器( SI或 DI )给出

EA= 位移量 + 基址 + 变址

EA= 位移量 + 基址 + (变址 * 比例因子)比例因子( 1/2/4/8 )

Page 13: 第3章  80 x86 的指令系统和寻址方式

13

16/32 位寻址时有效地址的组成成分 16 位寻址

(位 )32 位寻址(位 )

位移量 0 , 8 , 16 0 , 8 , 16, 32

基址寄存器 BX, BP 任何 32 位通用寄存器(包括 ESP )

变址寄存器 SI, DI 除 ESP 以外的 32 位通用寄存器比例因子 无 1 , 2 , 4 , 8

默认段选择规则访问类型 所用段及段寄存器 缺省选择规则指令 代码段 CS 用于取指堆栈 堆栈段 SS 所有的进栈和出栈操作;

任何用于 ESP、 EBP、 BP 为基址寄存器的访问

局部数据 数据段 DS 除对于堆栈及目的串以外的所有数据访问目的串 附加段 ES 串处理指令的目的串

Page 14: 第3章  80 x86 的指令系统和寻址方式

14

3. 直接寻址 有效地址只包含位移量

操作数的 16 位偏移量直接包含在指令中,与操作码一起放在代码段

用符号表示的位移量MOV BX,VAR

;表示将用符号 VAR 表示的字单元的内容→ AX

; 不声明段则默认为数据段,指明段寄存器则可实现段跨越

用常数表示的位移量

MOV AX,DS:[2000H]

;表示将数据段偏移 2000H字节的字单元的内容→ AX

Page 15: 第3章  80 x86 的指令系统和寻址方式

15

直接寻址的执行

MOV AX,DS:[2000H]

Page 16: 第3章  80 x86 的指令系统和寻址方式

16

4. 寄存器间接寻址 有效地址仅包含基址 /变址一种成分

16 位寻址可用寄存器: BX、 BP、 SI、 DI

32 位寻址可用寄存器:EAX、 EBX、 ECX、 EDX、 ESI、 EDI、 EBP、 ESP

所使用的寄存器相当于地址指针,当修改其内容后可指向不同的存储单元

书写时用 [] 括住寄存器名,以区别于寄存器寻址 若以 BP、 EBP、 ESP 间址,操作数默认在堆栈段,其他在数

据段;使用段超越前缀改变访问段MOV AX,[SI]MOV CL,[BX]MOV CX,[BP]MOV EBX,[EAX]

Page 17: 第3章  80 x86 的指令系统和寻址方式

17

寄存器间接寻址的执行( BX=2000H, DS=3000H )

Page 18: 第3章  80 x86 的指令系统和寻址方式

18

5. 寄存器相对寻址方式 直接基址寻址 /直接变址寻址 有效地址是寄存器内容与有符号的位移量之和

EA = BX/BP 或 SI/DI +位移量

段地址对应 BX/SI/DI 寄存器默认是 DS ,对应 BP 寄存器默认是 SS ;可用段超越前缀改变

该方式不仅可以修改指针,还可以修改位移量,对数组操作十分方便

基址寻址 变址寻址

MOV AX,10H[SI] MOV TABLE[DI],AL MOV TABZ[BP],BX MOV EAX,ARRAY[ESI]

Page 19: 第3章  80 x86 的指令系统和寻址方式

19

寄存器相对寻址的执行

Page 20: 第3章  80 x86 的指令系统和寻址方式

20

代码段

DS

数据段

操作码24H

00H

12H

34H

56H

78H

9AH

MOV AL,0024H[SI]

0024H

(SI)=0 (AL)=12H

(SI)=1 (AL)=34H

(SI)=2 (AL)=56H

(SI)=3 (AL)=78H

(SI)=4 (AL)=9AH

EA=24H+(SI)

(SI)

通过修改 SI 可遍历整个数组

可看作数据起始单元的偏移量

数组内某元素距数组起始单元的偏移量

Page 21: 第3章  80 x86 的指令系统和寻址方式

21

6. 基址变址寻址方式 有效地址由基址寄存器的内容加上变址寄存器的

内容构成 使用 BP、 EBP、 ESP 基址寄存器默认是 SS ,

其他为数据段;可用段超越前缀改变

MOV AX,[BX][SI]

MOV AX,[BP][DI]

MOV AX,DS:[BP][DI]

MOV EDX, [EBX][ESI]

Page 22: 第3章  80 x86 的指令系统和寻址方式

22

基址变址寻址的执行

请注意图中的错误!

Page 23: 第3章  80 x86 的指令系统和寻址方式

23

7. 相对基址变址寻址方式 有效地址是基址寄存器、变址寄存器与位移量之和 16 位寻址时, BX/BP 选一, SI/DI 选一 段为缺省选择,可用段超越前缀改变

MOV AX, 06H[BX+SI] ← → MOV AX, DS:[BX+SI+06H]

MOV AL,TAB[BX][DI] ← → MOV AL,DS:TABLE[BX][DI]

MOV DWORD[BP][SI],DX ← → MOV SS:DWORD[BP][SI],DX

MOV AX,ARRAY[BX][BP] ×

MOV AX,DA[SI][DI] ×

MOV EAX, ARRARY[EBX][ECX]

Page 24: 第3章  80 x86 的指令系统和寻址方式

24

31A00

3000:1A00

Page 25: 第3章  80 x86 的指令系统和寻址方式

25

BX、 SI 分别存放数组的脚标

MOV AL,ARRAY[BX][SI]

DS数据段

ARRAY

SI

BX

二维数组起始单元

EA

[ ] 之间表示相加的关系[BX][SI] ← → [BX+SI]

Page 26: 第3章  80 x86 的指令系统和寻址方式

26

8. 比例变址寻址、基址比例比例变址寻址、相对基址比例变址寻址方式

比例变址寻址有效地址是:位移量加变址寄存器与比例因子乘积之和

MOV EAX, COUNT[ESI*4]

基址比例比例变址寻址有效地址是:基址加变址寄存器与比例因子乘积之和

MOV CX, [EAX][EDX*2]

相对基址比例变址寻址方式有效地址是:位移量加基址加变址寄存器与比例因子乘积之和

MOV EAX , TABLE[EBP][EDI*4]

作用:方便字、双字等数组的操作

Page 27: 第3章  80 x86 的指令系统和寻址方式

27

二、与转移地址有关的寻址方式

程序代码亦存放在存储器中,如何控制程序的走向(转移位置的地址 CS:IP )是本部分所涉及的内容,由于它们与具体的指令相关,他们的介绍放在指令中讲解。

Page 28: 第3章  80 x86 的指令系统和寻址方式

28

§ 3.3 80x86 的指令系统 指令分类

功能

格式

数据传送指令 算术运算指令 逻辑指令 串操作指令 程序转移指令 处理器控制指令

双操作数指令( DEST,SRC) 单操作数指令( DEST) 无操作数指令(隐含,按约定寻找操作

数)

Page 29: 第3章  80 x86 的指令系统和寻址方式

29

一、数据传送指令 数据传送是计算机中最基本、最重要的一种操作 传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位

1. 通用数据传送指令 提供方便灵活的通用传送操作

MOV XCHG PUSH POP MOVSX MOVZX PUSHA/PUSHAD POPA/POPAD

Page 30: 第3章  80 x86 的指令系统和寻址方式

30

1) 传送指令 MOV (move)

格式: MOV DST,SRC

功能:将源操作数的内容传送至目的操作数中即 ( DST ) ← ( SRC)

说明: DST 可以是 8/16 位的 R( CS、 IP 除外) /M

SRC 可以是 8/16 位的 R/M/ 立即数 DST 可以是 8/16/32 位的 R( CS、 EIP 除外) /M

SRC 可以是 8/16/32 位的 R/M/ 立即数

只能出现在源操作数的位置

Page 31: 第3章  80 x86 的指令系统和寻址方式

31

MOV reg/mem,imm ;立即数送寄存器或主存

MOV AL,4 ; AL←4 ,字节传送

MOV AH,‘ E’ ; AH←‘E’的 ASCII码 45H

MOV CX,0FFH ; CX←00FFH ,字传送

MOV SI,200H ; SI←0200H ,字传送

MOV BYTE PTR [SI],0AH ; BYTE PTR 说明是字节操作

MOV WORD PTR [SI+2],0BH ; WORD PTR 说明是字操作

1) 传送指令 MOV— 立即数传送

注意立即数是字节量还是字量 明确指令是字节操作还是字操作

Page 32: 第3章  80 x86 的指令系统和寻址方式

32

1) 传送指令 MOV— 寄存器之间数据传送

MOV reg,reg

MOV AX,BX ; AX ← BX ,字传送

MOV AH,AL ; AH ← AL ,字节传送

MOV DS,AX ; DS ← AX ,字传送

CS 只能出现在 SRC 的位置

Page 33: 第3章  80 x86 的指令系统和寻址方式

33

1) 传送指令 MOV— 寄存器与存储器之间数据传送

MOV AL,D_BYTE

MOV DL,[SI] ; DL←DS:[SI]

MOV DX,Y[BP][SI] ; DX←SS:Y[BP][SI]

MOV EAX, [EBX][ECX*4]

Page 34: 第3章  80 x86 的指令系统和寻址方式

34

1) 传送指令 MOV— 使用该指令应注意的问题

SRC与 DST 的长度必须一致

错误示例: MOV AX,BL

MOV CL,3824H

DST 不能为 CS、 IP 及立即数

错误示例: MOV VAR1,VAR2 正确实现: MOV AL,VAR2

MOV VAR1,AL

SRC与 DST 不能同时为存储器操作数—不支持两个存储单元间数据的直接传送

SRC与 DST 不能同时为段寄存器

例: DS ← ES 错误: MOV DS,ES正确实现: MOV AX,ES

MOV DS,AX

不能将立即数直接传送到段寄存器

例: MOV AX,ESMOV DS,AX

Page 35: 第3章  80 x86 的指令系统和寻址方式

35

1) 传送指令 MOV— 数据传送方向示意

立即数

段寄存器CS DS ES SS

通用寄存器AX BX CX DXBP SP SI DI

存 储 器

Page 36: 第3章  80 x86 的指令系统和寻址方式

36

2) 零扩展传送指令 MOVZX 格式: MOVXZ DST, SRC 功能:将零扩展至源操作数的高位形成双倍长度传送至目的

操作数中即( DST ← ) ( SRC)

说明: DST 可以是 16/32 位的 R( CS、 EIP 除外) SRC 可以是 8/16 位的 R/M

MOVZX DX, AL ;原 AL=B0H ,则 DX=00B0H

MOVZX EAX, DATA

Page 37: 第3章  80 x86 的指令系统和寻址方式

37

3) 带符号扩展传送指令 MOVSX 格式: MOVSX DST, SRC 功能:将源操作数的符号位扩展至高位形成双倍长度传送至

目的操作数中即( DST ← ) ( SRC)

说明: DST 可以是 16/32 位的 R( CS、 EIP 除外) SRC 可以是 8/16 位的 R/M

MOVSX DX, AL ;原 AL=B0H ,则 DX=FFB0H

MOVSX EAX, [EDI]

Page 38: 第3章  80 x86 的指令系统和寻址方式

38

4) 交换指令 XCHG ( exchange)

指令格式: XCHG DST,SRC

指令功能: (DST ← →) ( SRC) 寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据

注意:不能在存储器与存储器之间对换

Page 39: 第3章  80 x86 的指令系统和寻址方式

39

4) 交换指令 XCHG— 寄存器间交换

MOV AX,1234H ; AX=1234H

MOV BX,5678H ; BX=5678H

XCHG AX,BX ; AX=5678H, BX=1234H

XCHG AH,AL ; AX=7856H

MOVZX CX, AL ; CX=0078H

MOVSX DX, AH; DX=0056H

XCHG CX, DX ; CX=0056H, DX=0078H

Page 40: 第3章  80 x86 的指令系统和寻址方式

40

4) 交换指令 XCHG— 寄存器与存储器交换

XCHG AX,DS:[2000H] ;字交换

XCHG DS:[2000H],AX

XCHG AL, DS:[2000H] ;字节交换 XCHG DS:[2000H],AL

Page 41: 第3章  80 x86 的指令系统和寻址方式

41

4) 交换指令 XCHG— 例题分析

例 : (BX)=6F30H, (BP)=0200H, (SI)=0046H, (SS)=2F00H,(2F246H)=4154H, 在指令 XCHG BX,[BP+SI] 执行后,相关寄存器和存储器的内容是什么?

分析:源操作数的物理地址 =(SS) × 16+(BP)+(SI)=

2F000H+0200H+0046H=2F246H

指令的功能: (BX) ← → (2F246H)

指令执行结果: (BX)=4154H,(2F246H)=6F30H

Page 42: 第3章  80 x86 的指令系统和寻址方式

42

5) 堆栈操作指令—进栈指令 PUSH

格式: PUSH SRC 功能:

SP←SP- 2,SS:[SP]←( r/m16)

例:PUSH AXPUSH DS:[2000H]

386+ESP←ESP- 2/4,SS:[ESP]←( r/m16) / ( r/m32) /imm32

Page 43: 第3章  80 x86 的指令系统和寻址方式

43

6) 堆栈操作指令—出栈指令 POP

格式: POP DST 功能:

( r/m16 ← ) SS:[SP]

SP ← SP+2

例:POP DXPOP DS:[2000H]

386+( r/m16) / ( r/m32 ← ) SS:[ESP]

ESP ← ESP+2/4

Page 44: 第3章  80 x86 的指令系统和寻址方式

44

堆栈操作指令—应用举例

PUSH AX ;进入子程序后

PUSH BX

PUSH DS

...

POP DS ;返回主程序前

POP BX

POP AX

Page 45: 第3章  80 x86 的指令系统和寻址方式

45

7) 所有寄存器进栈指令— PUSHA/PUSHAD

格式: PUSHA

功能:将所有 16 位寄存器压栈,顺序为:

AX、CX、DX、BX、SP、BP、SI、DI

ESP←ESP-16

如: AX=11H , BX=22H CX=33H , DX=44H SI =55H , DI =66H SP=80H , BP =84H

PUSHA 执行后有:

SP xxH

SP

00H

11H

33H

00H

00H

66H

00H

55H

00H

84H

00H

78H

00H

22H

00H

44H

20080H

20070H

格式: PUSHAD 功能:将所有 32 位寄存器压栈,顺序为:

EAX、 ECX、 EDX、 EBX、 ESP、 EBP 、 ESI、 EDI

ESP←ESP- 32

Page 46: 第3章  80 x86 的指令系统和寻址方式

46

8) 所有寄存器出栈指令— POPA/POPAD

格式: POPA

功能:将堆栈中的数据弹给 16 位寄存器,顺序与压栈指令相反 ESP←ESP+16

格式: POPAD 功能:将堆栈中的数据弹给 32 位寄存器,顺序与压栈指令相反

ESP←ESP+32

Page 47: 第3章  80 x86 的指令系统和寻址方式

47

累加器专用传送指令换码指令 XLAT( translate)

指令格式: XLAT

指令功能 : AL←DS:[BX+AL] ,将 BX 指定的缓冲区中、AL 指定的位移处的一个字节数据取出赋给 AL

换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码

表格首地址存放于 BX, AL 存放相对表格首地址的位移量

换码指令执行后:将 AL 寄存器的内容转换为目标代码

Page 48: 第3章  80 x86 的指令系统和寻址方式

48

MOV BX,100HMOV AL,03HXLAT

(BX)

(AL)

DS

数据段12H

34H

56H

78H

9AH

78H

(AL)=78H

3) 换码指令 XLAT— 例题

Page 49: 第3章  80 x86 的指令系统和寻址方式

49

3. 地址传送指令 地址传送指令将存储器单元的逻辑地址送至指定的

寄存器 有效地址传送指令 LEA

指针传送指令 LDS和 LES

指针传送指令 LFS、 LGS、 LSS

注意不是获取存储器单元的内容

Page 50: 第3章  80 x86 的指令系统和寻址方式

50

格式: LEA DST,SRC

3. 地址传送指令—有效地址传送指令 LEA( load EA)

功能: DST←SRC 的有效地址 EA

将存储器操作数的有效地址传送至指定的 16/32

位寄存器中

16/32 位寄存器

存储器操作数

Page 51: 第3章  80 x86 的指令系统和寻址方式

51

LEA BX,BUFR

9A78H

(BX)=9A78H

3. 地址传送指令—有效地址传送指令 LEA (例)

23H

093A0H

BUFR78H

9AH

093AHDS

093C3H (BX)=0023H

错误!

获得主存单元的有效地址;不是物理地址,也不是该单元的内容

可以实现计算功能

Page 52: 第3章  80 x86 的指令系统和寻址方式

52

3. 地址传送指令 —地址指针

存储单元的逻辑地址:

段基值( 16 位)

段内偏移量( 16 位)

地址指针( 32 位)M的逻辑地址在M中需 4 个连续的存储单元

段基值

AD_POINT

XX

XX

偏移量XX

XX

Page 53: 第3章  80 x86 的指令系统和寻址方式

53

格式: LES DST,SRC

功能: (DST)←(SRC) 段内偏移量 ES← (SRC+2 ) 段基值

LDS 指令将主存中 SRC 指定的字送至 16 位寄存器 DST ,并将 SRC 的下一字送 ES 寄存器

3. 地址传送指令 —指针传送指令

格式: LDS DST,SRC

功能: (DST)←(SRC) 段内偏移量 DS← (SRC+2 ) 段基值

LDS 指令将主存中 SRC 指定的字送至 16 位寄存器 DST ,并将 SRC 的下一字送 DS 寄存器

Page 54: 第3章  80 x86 的指令系统和寻址方式

54

例 : (DS)=B000H, (BX)=080AH, (0B080AH)=05AEH, (0B080CH)=4000H, (405AEH)=9634H,

在执行指令

LDS DI,[BX]

MOV AX,[DI]

后, (AX)=?BX=080AH

B0000H

0B080AH

40000H

34H

96H

AEH

05H

00H

40H

405AEH

05AEH

0B080CH

(DI)=05AEH

(DS)=4000H

结果 : (DS)=4000H (DI)=05AEH (AX)=9634H

Page 55: 第3章  80 x86 的指令系统和寻址方式

55

3. 地址传送指令 —地址指针 (32)

存储单元的逻辑地址段选择器( 16 位)

段内偏移量( 32 位)

地址指针( 48 位)M的逻辑地址在M中需 6 个连续的存储单元

段选择

AD_POINT

XX

XX

偏移量XX

XX

XX

XX

Page 56: 第3章  80 x86 的指令系统和寻址方式

56

3. 地址传送指令—指针传送指令 (32)

格式: LDS/LES/LFS/LGS/LSS DST,SRC

功能: (DST)←(SRC) 段内偏移量 32bit

DS/ES/FS/GS/SS← (SRC+4 ) 16bit

LDS 指令将主存中 SRC 指定的双字送至 32 位寄存器DST ,并将 SRC 的下一字送 DS 寄存器

LSS ESP,MEM

Page 57: 第3章  80 x86 的指令系统和寻址方式

57

4. 标志寄存器传送指令

标志寄存器传送指令用来传送标志寄存器 FLAGS的内容,方便进行对各个标志位的直接操作

指令 低 8 位传送: LAHF和 SAHF

16 位传送: PUSHF和 POPF

32 位传送: PUSHFD和 POPFD

Page 58: 第3章  80 x86 的指令系统和寻址方式

58

格式: SAHF

功能: FLAGS 的低字节← (AH)

SAHF将 AH 寄存器内容送 FLAGS 的低字节 用 AH 的第 7/6/4/2/0 位相应设置 SF/ZF/AF/

PF/CF标志

4. 标志寄存器传送指令—标志低字节进出 AH 指

令格式: LAHF

功能: (AH)←FLAGS 的低字节 LAHF 指令将标志寄存器的低字节送寄存器 AH

SF/ZF/AF/PF/CF状态标志位分别送入 AH 的第 7/6/4/2/0 位,而 AH 的第 5/3/1 位任意

Page 59: 第3章  80 x86 的指令系统和寻址方式

59

4.标志寄存器传送指令—标志寄存器进出堆栈指令

格式: PUSHF

功能: SP←SP-2 SS:[SP]←FLAGS

PUSHF 指令将标志寄存器的内容压入堆栈,同时栈顶指针 SP减 2

格式: POPF

功能: FLAGS←SS:[SP] SP←SP+ 2

POPF 指令将栈顶字单元内容送标志寄存器,同时栈顶指针 SP 加 2

Page 60: 第3章  80 x86 的指令系统和寻址方式

60

4. 标志寄存器传送指令—标志寄存器进出堆栈指令(置位单步标志)

PUSHF ;保存全部标志到堆栈

POP AX ;从堆栈中取出全部标志

OR AX,0100H ;设置 D8=TF=1, AX其它位不变

PUSH AX ;将 AX压入堆栈

POPF ; FLAGS←AX

;将堆栈内容取到标志寄存器

Page 61: 第3章  80 x86 的指令系统和寻址方式

61

4. 标志寄存器传送指令—标志寄存器进出堆栈指令 (32)

格式: PUSHFD

功能: SP←SP-4 SS:[ESP]←EFLAGS

PUSHFD 指令将标志寄存器的内容压入堆栈,同时栈顶指针 ESP减 4

格式: POPFD

功能: EFLAGS←SS:[ESP] ESP←ESP+ 4

POPF 指令将栈顶字单元内容送标志寄存器,同时栈顶指针 ESP加 4

Page 62: 第3章  80 x86 的指令系统和寻址方式

62

二、算术运算指令(部分) 四则运算是计算机经常进行的一种操作。算术运算

指令实现二进制(和十进制)数据的四则运算 请注意算术运算类指令对标志的影响

Page 63: 第3章  80 x86 的指令系统和寻址方式

63

格式: ADD DST,SRC

SUB DST,SRC

功能: (DST) ←(DST)+/-(SRC)

受影响标志: CF,PF,AF,ZF,SF,OF

说明: 操作数可以是字节或字 SRC 可以是通用 R、M、 imm

DST 可以是通用 R、M

DST 和 SRC 不能同时为 M

1. 加 / 减法指令

Page 64: 第3章  80 x86 的指令系统和寻址方式

64

ADD AX,BX

ADD AL,BL

SUB CX,20H

ADD DL,DA_BYTE

SUB DA_WORD,DX

ADD EAX, EBX

1. 加法指令—举例

若 (AL)=0E5H ,执行 ADD AL,0A4H

AL 及各标志位的情况?

1

1110 01011010 01001000 1001

+

CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0

若认为是无符号数,则为 229+164=393=256+137

若认为是有符号数,则为 (-27)+(-92)=-119

Page 65: 第3章  80 x86 的指令系统和寻址方式

65

2. 减法指令—举例

例:执行指令

MOV AL,-73

SUB AL,-87

后, AL 及个标志位的情况

1011 01111010 10010000 1110

CF=0,AF=1,PF=0,ZF=0,SF=0,OF=0

-73 的补码表示

14

-87 的补码表示

AL=0EH

Page 66: 第3章  80 x86 的指令系统和寻址方式

66

2. 带进 / 借位的加 / 减法指令 格式: ADC DST,SRC

SBB DST,SRC

功能: (DST) ←(DST)+/-(SRC)+/-CF

受影响标志: CF,PF,AF,ZF,SF,OF

说明: 操作数可以是字节或字 SRC 可以是通用 R、M、 imm

DST 可以是通用 R、M

DST 和 SRC 不能同时为M

Page 67: 第3章  80 x86 的指令系统和寻址方式

67

2. 带进 / 借位的加 / 减法指令—举例

例:实现 2F365H 和5E024H 的加法运算

MOV DX,2MOV AX,0F365HADD AX,0E024HADC DX,5

2 F3655 E024

8 D389

+手工计算 2 F365

5 E024

8 D389

+1

F365

E024

D389

+

CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0

00020005

0008+ 0001

CF=0,AF=0,PF=0,ZF=0,SF=0,OF=0

AX

DX

Page 68: 第3章  80 x86 的指令系统和寻址方式

68

格式: INC DST

DEC DST

功能: (DST) ←(DST)+/-1

受影响标志: PF,AF,ZF,SF,OF

说明: DST 可以是 R/M

功能与 ADD/SUB 相似,但占用字节少,且不影响标志位 CF 。常用于修改地址指针及循环计数器。

3. 加 / 减 1 指令

Page 69: 第3章  80 x86 的指令系统和寻址方式

69

格式:NEG DST

功能: (DST) ←0-(DST)

受影响标志: CF ,PF,AF,ZF,SF,OF

说明: DST 可以是 R/M

操作对象是有符号的数 当操作数取最小值( -128 或 -32768 )时,执行该指令后,操作数

无变化, OF=1

当操作数为 0 时,结果为 0 ,但 CF=0 ,其他情况 CF=1

4. 求补指令(求负数)

Page 70: 第3章  80 x86 的指令系统和寻址方式

70

4. 求补指令(举例)

例: AL=13H, 执行指令NEG AL

后 AL 的值

1

0000 00000001 00111110 1101

—AL

AL=-13H

0001 0011

负数求补

Page 71: 第3章  80 x86 的指令系统和寻址方式

71

5. 比较指令 CMP( compare)

格式: CMP DST,SRC

功能: (DST) -(SRC)

受影响标志: CF ,PF,AF,ZF,SF,OF

说明: DST ,SRC 可以是 R/M ,长度必须一致 SRC还可以是 imm

DST 和 SRC 不能同时为 M

该指令主要用于比较两数的关系

Page 72: 第3章  80 x86 的指令系统和寻址方式

72

5. 比较指令 CMP— 应用

ZF=1 ;两数相等 两个无符号数比较

CMP AX,BX ;0 AX≥ BX1 AX < BX

CF=

两个带符号的数的比较不能用单一的符号判断两个数的关系

指令执行后 SF与OF 相同, (DST)>SRCSF与OF 不同, (DST)<SRC

Page 73: 第3章  80 x86 的指令系统和寻址方式

73

5. 比较指令 CMP—(CMP AL,BL)

AL=-2

BL=127

1111 11100111 11110111 1111

-SF=0OF=1 相异, AL<BL

AL=-2BL=-1

1

1111 11101111 11111111 1111

-SF=1OF=0 相异, AL<BL

Page 74: 第3章  80 x86 的指令系统和寻址方式

74

5. 比较指令 CMP—(CMP AL,BL)

AL=-1

BL=-2

1111 11111111 11100000 0001

-SF=0OF=0 相同, AL>BL

AL=127BL=-2

1

0111 11111111 11101000 0001

-SF=1OF=1 相同, AL>BL

Page 75: 第3章  80 x86 的指令系统和寻址方式

75

IMUL r8/m8

;有符号字节乘法

; AX←AL×r8/m8

IMUL r16/m16

;有符号字乘法

; DX.AX←AX×r16/m16

6. 乘法指令

MUL r8/m8

;无符号字节乘法

; AX←AL×r8/m8

MUL r16/m16

;无符号字乘法

; DX.AX←AX×r16/m16

Page 76: 第3章  80 x86 的指令系统和寻址方式

76

6. 乘法指令—功能 乘法指令分无符号和有符号乘法指令 乘法指令的源操作数显式给出,隐含使用另一个操

作数 AX和 DX 字节相乘: AL与 r8/m8 相乘,得到 16 位的结果,存入 AX

字相乘: AX与 r16/m16 相乘,得到 32 位的结果,其高字存入 DX ,低字存入 AX

乘法指令利用 OF和 CF判断乘积的高一半是否具有有效数值

Page 77: 第3章  80 x86 的指令系统和寻址方式

77

6. 乘法指令—对标志的影响

乘法指令如下影响 OF和 CF标志: MUL 指令——若乘积的高一半( AH或 DX )为 0 ,则

OF=CF=0 ;否则 OF=CF=1

IMUL 指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0 ;否则均为 1

Page 78: 第3章  80 x86 的指令系统和寻址方式

78

6. 乘法指令—(例)

MOV AL,0B4H ; AL=B4H=180

MOV BL,11H ; BL=11H=17

MUL BL ; AX=OBF4H=3060,OF=CF=1, AX高 8 位不为0

MOV AL,0B4H ; AL=B4H=- 76

MOV BL,11H ; BL=11H=17

IMUL BL ; AX=FAF4H=- 1292, OF=CF=1, AX高8 位有效

Page 79: 第3章  80 x86 的指令系统和寻址方式

79

6. 除法指令—功能

除法指令分无符号和有符号除法指令 除法指令的除数显式给出,隐含使用另一个操作数 AX和 DX 作为被除数

字节量除法: AX 除以 r8/m8, 8 位商存入 AL, 8 位余数存入 AH

字量除法: DX.AX 除以 r16/m16, 16 位商存入 AX, 16位余数存入 DX

除法指令对标志没有影响 除法指令会产生结果溢出

Page 80: 第3章  80 x86 的指令系统和寻址方式

80

6. 除法指令

DIV r8/m8 ;无符号字节除法

;AL←AX÷r8/m8 的商, Ah←AX÷r8/m8 的余数

DIV r16/m16 ;无符号字除法

; AX←DX.AX÷r16/m16 的商, DX←DX.AX÷r16/m16 的余数

IDIV r8/m8 ;有符号字节除法

;AL←AX÷r8/m8 的商, Ah←AX÷r8/m8 的余数

IDIV r16/m16 ;有符号字除法:

; AX←DX.AX÷r16/m16 的商, DX←DX.AX÷r16/m16 的余数

Page 81: 第3章  80 x86 的指令系统和寻址方式

81

6. 除法指令—除法错中断 当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器 AL/AX 不能表达,便产生溢出, 80x86CPU 中就产生编号为 0 的内部中断——除法错中断

对 DIV 指令,除数为 0 ,或者在字节除时商超过 8 位,或者在字除时商超过 16 位,则发生除法溢出

对 IDIV 指令,除数为 0 ,或者在字节除时商不在 -128~ 127范围内,或者在字除时商不在 -32768~ 32767范围内,则发生除法溢

Page 82: 第3章  80 x86 的指令系统和寻址方式

82

6. 除法指令—(例)

MOV AX,0400H ; AX=400H=1024

MOV BL,0B4H; BL=B4H=180

DIV BL ;商 AL= 05H= 5 ,余数 AH= 7CH= 124

MOV AX,0400H ; AX=400H=1024

MOV BL,0B4H; BL=B4H=- 76

IDIV BL ;商 AL= F3H=- 13 ,余数 AH= 24H= 36

Page 83: 第3章  80 x86 的指令系统和寻址方式

83

7. 符号扩展指令—符号扩展的概念

符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全 0 (正数)或全 1(负数)。符号扩展不改变数据大小。

对于数据 64H (表示数据 100 ),其最高位 D7 为 0 ,符号扩展后高 8 位都是 0 ,成为 0064H (仍表示数据 100 )

对于数据 ff00H (表示有符号数- 256 ),其最高位 D15 为 1 ,符号扩展后高 16 位都是 1 ,成为 ffffff00H (仍表示有符号数- 256 )

Page 84: 第3章  80 x86 的指令系统和寻址方式

84

7. 符号扩展指令

CBW ; AL 的符号扩展至 AH

;如 AL 的最高有效位是 0 ,则 AH= 00

; AL 的最高有效位为 1 ,则 AH= FFH。 AL 不变

CWD ; AX 的符号扩展至 DX

;如 AX 的最高有效位是 0 ,则 DX= 00

; AX 的最高有效位为 1 ,则 DX= FFFFH。 AX 不变

符号扩展指令常用于获得双倍长的数据

Page 85: 第3章  80 x86 的指令系统和寻址方式

85

7. 符号扩展指令—(例: AX/BX)

CWD ; DX.AX←AX

IDIV BX ; AX←DX.AX÷BX

利用符号扩展指令得到除法指令所需要的倍长于除数的被除数

对无符号数除法应该采用直接使高 8 位或高 16 位清 0 的方法,获得倍长的被除数

Page 86: 第3章  80 x86 的指令系统和寻址方式

86

8. 十进制调整指令

十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果

分成压缩 BCD 码和非压缩 BCD 码调整

Page 87: 第3章  80 x86 的指令系统和寻址方式

87

( ADD AL,i8/r8/m8)

( ADC AL,i8/r8/m8)

DAA

; AL←将 AL 的加和调整为压缩 BCD码

8. 十进制调整指令—压缩 BCD 码加、减调整指令

( SUB AL,i8/r8/m8)

( SBB AL,i8/r8/m8)

DAS

; AL←将 AL 的减差调整为压缩 BCD码

使用 DAA或 DAS 指令前,应先执行以 AL 为目的操作数的加法或减法指令

DAA和 DAS 指令对 OF标志无影响,按结果影响其他标志

Page 88: 第3章  80 x86 的指令系统和寻址方式

88

8.十进制调整指令— 压缩 BCD 码加、减调整指令(例)

MOV AL,68H ; AL=68H ,压缩 BCD 码表示真值 68

MOV BL,28H ; BL=28H ,压缩 BCD 码表示真值 28

ADD AL,BL ;二进制加法: AL=68H+28H=90H

DAA ;十进制调整: AL=96H

;实现压缩 BCD 码加法: 68+ 28= 96

MOV AL,68H ; AL=68H ,压缩 BCD 码表示真值 68

MOV BL,28H ; BL=28H ,压缩 BCD 码表示真值 28

SUB AL,BL ;二进制减法: AL=68H-28H=40H

DAS ;十进制调整: AL=40H

;实现压缩 BCD 码加法: 68-28= 40

Page 89: 第3章  80 x86 的指令系统和寻址方式

89

8.十进制调整指令—非压缩 BCD 码加、减调整指令

( ADD AL,i8/r8/m8)

( ADC AL,i8/r8/m8)

AAA

; AL←将 AL 的加和调整为非压缩 BCD 码; AH←AH+调整的进位

( SUB AL,i8/r8/m8)

( SBB AL,i8/r8/m8)

AAS

; AL←将 AL 的减差调整为非压缩BCD 码 ; AH←AH-调整的借位

使用 AAA或 AAS 指令前,应先执行以 AL 为目的操作数的加法或减法指令

AAA和 AAS 指令在调整中产生了进位或借位,则 AH 要加上进位或减去借位,同时 CF=AF=1 ,否则 CF=AF=0 ;它们对其他标志无影响

Page 90: 第3章  80 x86 的指令系统和寻址方式

90

8. 十进制调整指令—非压缩 BCD 码加、减调整指令(例)

MOV AX,0608H ;AX=0608H ,非压缩 BCD 码表示真值 68

MOV BL,09H ;BL=09H ,非压缩 BCD 码表示真值 9

ADD AL,BL ;二进制加法: AL=08H+09H=11H

AAA ;十进制调整: AX=0707H

;实现非压缩 BCD 码加法: 68+ 9= 77

MOV AX,0608H ; AX=0608H ,非压缩 BCD 码表示真值 68

MOV BL,09H ; BL=09H ,非压缩 BCD 码表示真值 9

SUB AL,BL ;二进制减法: AL=08H-09H=FFH

AAS ;十进制调整: AX=0509H

;实现非压缩 BCD 码减法: 68-9= 59

Page 91: 第3章  80 x86 的指令系统和寻址方式

91

例:用乘法指令实现 32 位二进制数的相乘

c d

a b

ax

dx ax

dx

dx ax

dx ax

×

+

b×d

a×d

b×c

a×c

DSEG SEGMENT PARA 'DATA‘NUM1 DW 1220H,48A2HNUM2 DW 2398H,0AE41HPRODUDW 4 DUP(0)DSEG ENDS

a b

c d

NUM1NUM1+2

NUM2NUM2+2

produprodu+2produ+4produ+6

Page 92: 第3章  80 x86 的指令系统和寻址方式

92

三、逻辑指令

(逻辑 )位操作类指令以二进制位为基本单位进行数据的操作;这是一类常用的指令,都应该特别掌握

逻辑运算指令 测试指令 移位指令

Page 93: 第3章  80 x86 的指令系统和寻址方式

93

1. 逻辑运算指令 格式: AND DST,SRC

OR DST,SRC

XOR DST,SRC

NOT DST

功能: (DST) ← (EST) (SRC)∧∨∨

(DST) ← (EST)

受影响标志: CF=0, OF=0, PF, ZF,SF, NOT 对标志无影响

Page 94: 第3章  80 x86 的指令系统和寻址方式

94

1. 逻辑运算指令—应用

MOV AL,45H ;逻辑与 AL=01H

AND AL,31H ; CF=OF=0, SF=0、 ZF=0、 PF=0

MOV AL,45H ;逻辑或 AL=75HOR AL,31H ;

CF=OF=0, SF=0、 ZF=0、 PF=0MOV AL,45H ;逻辑异或 AL=74HXOR AL,31H ;

CF=OF=0, SF=0、 ZF=0、 PF=1

MOV AL,45H ;逻辑非 AL=0BAHNOT AL ;标志不变

Page 95: 第3章  80 x86 的指令系统和寻址方式

95

1.逻辑运算指令—应用 AND 指令可用于复位某些位(同 0 相与),不影响其他位:将 BL中D3和D0

位清 0 ,其他位不变

AND BL,11110110B

OR 指令可用于置位某些位(同 1 相或),不影响其他位:将 BL中D3和D0 位置 1 ,其他位不变

OR BL, 00001001B

XOR 指令可用于求反某些位(同 1 相异或),不影响其他位:将 BL中D3和D0 位求反,其他不变

XOR BL,00001001B

XOR AX,AX ;AX=0,CF=OF=0,ZF=1

XOR AL,43H ;ZF=0则AL≠ 43H;ZF=1AL=43H 则

Page 96: 第3章  80 x86 的指令系统和寻址方式

96

2. 测试指令 TEST

格式: TEST DST,SRC

功能: 将两个操作数进行逻辑“与”运算,结果只反映在标志位上,对操作数无影响

受影响标志: CF=0 , OF=0 , PF, ZF,SF

说明:该指令用于测试操作数的某位是否为 1 ,被测试的位与 1 相“与”

TEST AL,01H ;测试 D0 的值

ZF=0, D0=1

ZF=1, D0=0

Page 97: 第3章  80 x86 的指令系统和寻址方式

97

3. 移位指令 逻辑移位指令 算术移位指令 循环移位指令

Page 98: 第3章  80 x86 的指令系统和寻址方式

98

格式: SHL DST,CNT

SHR DST,CNT

功能:将 DST按 CNT 指定的次数左/右移位,移出的位→ CF ,空出的位补 0 ,结果→ DST

受影响标志: OF ( CNT=1 时 ), CF ,PF,ZF,SF

说明:

DST 可以是 R/M

CNT 为 1或CL (imm8)

只在 CNT=1 时。 CF与 SF 相同, OF=0 ; CF与 SF 不同, OF=1。

该指令可用于无符号数÷或× 2 的操作

1 )逻辑移位指令

Page 99: 第3章  80 x86 的指令系统和寻址方式

99

2) 算术移位指令 格式:SAL DST,CNT

SAR DST,CNT

功能: SAL与 SHL完全相同 SAR 每右移 1 位,最低位→ CF ,最高位保持不变(用于带符号数的除法),结果→ DST

受影响标志: OF ( CNT=1 时 ), CF ,PF,ZF,SF

说明: DST 可以是 R/M

CNT 为 1或 CL (imm8)

Page 100: 第3章  80 x86 的指令系统和寻址方式

100

逻辑移位指令的功能

Page 101: 第3章  80 x86 的指令系统和寻址方式

101

移位指令应用举例MOV CL,4

MOV AL,0FFH ; AL=FFH

SHL AL,1 ; AL=FEH

; CF=1, SF=1、 ZF=0、 PF=0, OF=0

SAR AL,1 ; AL=FFH; CF=0, SF=1、 ZF=0、 PF=1、 OF=0

SAR AL,CL ; AL=07H ; CF=1, SF=0、 ZF=0、 PF=1

SHR AL,1 ; AL=7FH; CF=1, SF=0、 ZF=0、 PF=0、 OF=0

Page 102: 第3章  80 x86 的指令系统和寻址方式

102

MOV SI,AX

SHL SI,1 ; SI←2×AX

ADD SI,AX ; SI←3×AX

MOV DX,BX

MOV CL,03H

SHL DX,CL ; DX←8×BX

SUB DX,BX ; DX←7×BX

ADD DX,SI ; DX←7×BX+ 3×AX

移位指令应用举例

Page 103: 第3章  80 x86 的指令系统和寻址方式

103

3 )循环移位指令 格式:ROL DST,CNT

ROR DST,CNT

RCL DST,CNT

RCR DST,CNT

功能:小循环:将 DST按 CNT 指定的次数左 /右移位,移出的位同时送 CF 和空出的位

大循环:将 DST按 CNT 指定的次数左 /右移位, CF →空出的位 , 移出的位→ CF

受影响标志: OF ( CNT=1 时 ), CF

说明:用大循环可完成多字节的移位操作

小循环

大循环

Page 104: 第3章  80 x86 的指令系统和寻址方式

104

不带进位循环移位指令(小循环)

Page 105: 第3章  80 x86 的指令系统和寻址方式

105

带进位循环移位指令(大循环)

Page 106: 第3章  80 x86 的指令系统和寻址方式

106

循环移位指令 —将 DX.AX 中 32 位数值左移一

SHL AX,1

RCL DX,1

DX AXCF

0

Page 107: 第3章  80 x86 的指令系统和寻址方式

107

循环移位指令—位传送

;把 AL最低位送 BL最低位,保持 AL 不变

ROR AL,1

RCL BL,1

ROL AL,1

AL CF

BL CF

ALCF

AL之 D0

Page 108: 第3章  80 x86 的指令系统和寻址方式

108

循环移位指令— BCD 码合并

; AH.AL 分别存放着非压缩 BCD 码的两位

;将它们合并成为一个压缩 BCD 码存 AL

AND AX,0F0FH ;保证高 4 位为 0

MOV CL,4

ROL AH,CL ;也可以用 SHL AH,CL

ADD AL,AH ;也可以用 OR AL,AH

Page 109: 第3章  80 x86 的指令系统和寻址方式

109

四、串操作指令

串操作指令是 80x86 指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域的数据时,特别好用

串操作指令的操作数是主存中连续存放的数据串( String ——) 即在连续的主存区域中,字节或字(或双字)的序列

串操作指令的操作对象是以字( W )为单位的字串,或是以字节( B )为单位的字节串 (D).

Page 110: 第3章  80 x86 的指令系统和寻址方式

110

四、串操作指令—串寻址方式

源操作数用寄存器 SI 寻址,默认在数据段 DS 中,但允许段超越: DS:[SI]

目的操作数用寄存器 DI 寻址,默认在附加段 ES 中,不允许段超越: ES:[DI]

每执行一次串操作指令, SI和 DI 将自动修改: ±1 (对于字节串)或±2 (对于字串)或 ± 4

执行指令 CLD 指令后, DF = 0 ,地址指针增 1 或 2(4)

执行指令 STD 指令后, DF = 1 ,地址指针减 1 或 2(4)

Page 111: 第3章  80 x86 的指令系统和寻址方式

111

1. 串传送 MOVS(move string) 把字节或字(双字)操作数从主存的源地址传送至目的

地址

MOVSB ;字节串传送: ES:[DI]←DS:[SI]; SI←SI±1, DI←DI±1

MOVSW ;字串传送: ES:[DI]←DS:[SI]; SI←SI±2, DI←DI±2

MOVSD ;双字串传送: ES:[DI]←DS:[SI]; SI←SI±4, DI←DI±4

Page 112: 第3章  80 x86 的指令系统和寻址方式

112

串传送 MOVSB (正向 DF= 0 )

Page 113: 第3章  80 x86 的指令系统和寻址方式

113

串传送 MOVSW (反向 DF=1)

Page 114: 第3章  80 x86 的指令系统和寻址方式

114

1. 串传送 MOVS— 字节串传送(例)mov si,offset sourcemov di,offset destinationmov cx,100 ; cx← 传送次数

cld ;置 DF=0 ,地址增加

again:movsb ;传送一个字节

dec cx ;传送次数减 1

jnz again ;判断传送次数 cx 是否为 0;不为 0 ,则到 again 位置执行指令;否则,结束

Page 115: 第3章  80 x86 的指令系统和寻址方式

115

2. 串存储 STOS( store string)

把 AL或 AX 数据传送至目的地址

STOSB ;字节串存储: ES:[DI]←AL; DI←DI±1

STOSW ;字串存储: ES:[DI]←AX; DI←DI±2

Page 116: 第3章  80 x86 的指令系统和寻址方式

116

2. 串存储—串存储(例)mov ax,0mov di,0mov cx,8000h ; cx← 传送次数

cld ; DF=0 ,地址增加

again:stosw ;传送一个字

dec cx ;传送次数减 1

jnz again ;传送次数 cx 是否为 0

Page 117: 第3章  80 x86 的指令系统和寻址方式

117

3. 串读取 LODS( load string)

把指定主存单元的数据传送给 AL或 AX

LODSB ;字节串读取: AL←DS:[SI]; SI←SI±1

LODSW ;字串读取: AX←DS:[SI]; SI←SI±2

Page 118: 第3章  80 x86 的指令系统和寻址方式

118

mov si,offset blockmov di,offset dplusmov bx,offset dminusmov ax,dsmov es,ax ;数据都在一个段中,所以设置 es=ds

mov cx,count ; cx← 字节数cld

go_on:lodsb ;从 block 取出一个数据test al,80h ;检测符号位,判断是正是负jnz minus ;符号位为 1 ,是负数,转向minus

stosb ;符号位为 0 ,是正数,存入dplus

jmp again ;程序转移到 again 处继续执行minus:xchg bx,di

stosb ;把负数存入 dminus

xchg bx,diagain:loop go_on ;字节数减 1

Page 119: 第3章  80 x86 的指令系统和寻址方式

119

4. 串比较 CMPS( compare string)

将主存中的源操作数减去至目的操作数,以便设置标志(ZF) ,进而比较两操作数之间的关系

CMPSB ;字节串比较: DS:[SI]- ES:[DI]; SI←SI±1, DI←DI±1

CMPSW ;字串比较: DS:[SI]- ES:[DI]; SI←SI±2, DI←DI±2

Page 120: 第3章  80 x86 的指令系统和寻址方式

120

4. 串比较 CMPS (例)mov si,offset string1mov di,offset string2mov cx,countcldmov al,0ffh ;标记初始为不同

again:cmpsb ;比较两个字符jnz output ;有不同字符,转移

dec cxjnz again ;进行下一个字符比较mov al,0 ;字符串相等,设置 00h

output:mov result,al ;输出结果标记

Page 121: 第3章  80 x86 的指令系统和寻址方式

121

5. 串扫描 SCAS( scan string) 将 AL/AX减去至目的操作数,以便设置标志 (ZF) ,进而

比较 AL/AX 与操作数之间的关系

SCASB ;字节串扫描: AL- ES:[DI]; DI←DI±1

SCASW ;字串扫描: AX- ES:[DI]; DI←DI±2

Page 122: 第3章  80 x86 的指令系统和寻址方式

122

5. 串扫描 SCAS— (例)

mov di,offset string

mov al,20h

mov cx,count

cld

again:scasb ;搜索

jz found ;为 0( ZF=1),发现空格

dec cx ;不是空格

jnz again ;搜索下一个字符

... ;不含空格,则继续执行

found: ...

Page 123: 第3章  80 x86 的指令系统和寻址方式

123

重复前缀指令( repeat)

串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在 CX 寄存器中

重复前缀分 2 类, 3 条指令: 配合不影响标志的 MOVS、 STOS (和 LODS )指令的 REP前缀 配合影响标志的 CMPS和 SCAS 指令的 REPZ和 REPNZ前缀

Page 124: 第3章  80 x86 的指令系统和寻址方式

124

REP重复前缀指令

REP ;每执行一次串指令, CX减 1;直到 CX= 0 ,重复执行结束

REP 前缀可以理解为:当数据串没有结束( CX≠0),则继续传送

例 2 中,程序段的最后 3 条指令,可以分别替换为:

REP MOVSB 和 REP STOSW

Page 125: 第3章  80 x86 的指令系统和寻址方式

125

mov si,offset source

mov di,offset destination

mov cx,100 ; cx← 传送次数

cld ;置DF=0 ,地址增加

again:

movsb ;传送一个字节

dec cx ;传送次数减 1

jnz again ;判断传送次数 cx 是否为 0

;不为 0 ,则到 again 位置执行指令

;否则,结束

rep movsb

REP重复前缀指令—字节串传送(例)

Page 126: 第3章  80 x86 的指令系统和寻址方式

126

REPZ/REPNZ重复前缀指令

REPZ ;每执行一次串指令, CX减 1;并判断 ZF 是否为 0 ,;只要 CX= 0 或 ZF= 0 ,重复执行结束

REPNZ ;每执行一次串指令, CX减 1;并判断 ZF 是否为 1 ,;只要 CX= 0 或 ZF= 1 ,重复执行结束

当数据串没有结束( CX≠0),并且串相等( ZF= 1),则继续串操作

当数据串没有结束( CX≠0),并且串不相等( ZF= 0),则继续串操作

Page 127: 第3章  80 x86 的指令系统和寻址方式

127

mov si,offset string1mov di,offset string2mov cx,countcldmov al,0ffh ;标记初始为不同

again:cmpsb ;比较两个字符jnz output ;有不同字符,转移dec cxjnz again ;进行下一个字符比较mov al,0 ;字符串相等,设置 00h

output:mov result,al ;输出结果标记

REPZ/REPNZ重复前缀指令—串比较 CMPS (例)

repz cmpsb jnz output

Page 128: 第3章  80 x86 的指令系统和寻址方式

128

REPZ/REPNZ重复前缀指令—串扫描(例)

mov di,offset stringmov al,20hmov cx,countcld

again:scasb ;搜索jz found ;为 0( ZF=1),发现空格dec cx ;不是空格jnz again ;搜索下一个字符... ;不含空格,则继续执行

found: ...

repnz scasb jz found

Page 129: 第3章  80 x86 的指令系统和寻址方式

129

例:在 STRBUF 字符串中寻找 STRING 中指定的二字符出现的个数

DSEG SEGMENT PARA 'Data'

STRBUF DB 'ASASAASASSASSAASASAS'COUNT EQU $-STRBUFSTRING DB 'AS'MESSG DB "THE NUMBER OF 'AS' IS : "NUM DB ?

DB 0AH,0DH,'$‘

DSEG ENDS

Page 130: 第3章  80 x86 的指令系统和寻址方式

130

例:在 STRBUF 字符串中寻找 STRING 中指定的二字符出现的个数

采用逐个比较的方法 因目的串为 2 个字符,故使用 CMPSW

应注意的问题: 若某次比较不同时, SISI+2 ,但有可能出现‘ AAS’

的情况,应做 SISI-1 的处理 执行 CMPSW亦做 DI DI+2 ,而目的串应始终指向

STR ,故 DI DI-2 比较相同时,循环计数器 -2

Page 131: 第3章  80 x86 的指令系统和寻址方式

131

SI 源串首地址 STRBUFDI 目的串首地址 STRINGCX 源串长度 -1方向标志 DF 0

计数器 BL 0

CMPSW

ZF=1

BL BL+1

CX CX-1

DI DI-2

CX CX-1

CX=0

(NUM) BL

SISI-1

Y

Y

N

N

LOP

NEXT1

NEXT

Page 132: 第3章  80 x86 的指令系统和寻址方式

132

LEA SI,STRBUFLEA DI,STRINGMOV CX,COUNT-1CLDMOV BL,0

LOP: CMPSWJNZ NEXT1INC BLDEC CXJMP NEXT

NEXT1: DEC SINEXT: DEC DI

DEC DICMP CX,0 ;防止 CX已为 0 ,仍使其继续进行 -1 操作

的情况JZ OUTPUTLOOP LOP

OUTPUT: ADD BL,30HMOV NUM,BLMOV AH,9LEA DX,MESSGINT 21H

Page 133: 第3章  80 x86 的指令系统和寻址方式

133

五、控制转移指令

Page 134: 第3章  80 x86 的指令系统和寻址方式

134

六、处理器控制指令 标志位操作指令 其他处理器控制指令

Page 135: 第3章  80 x86 的指令系统和寻址方式

135

1. 标志位操作指令

DFCLD ; DF ← 0

STD ; DF ← 1

IFCLI ; IF ← 0

STI ; IF ← 1

CF

CLC ; CF ← 0

STC ; CF ← 1

CMC ; CF ← CF

不影响其他标志位

Page 136: 第3章  80 x86 的指令系统和寻址方式

136

其他处理器控制指令—空操作

格式: NOP

功能:完成一次空操作,除使 IP ← IP+1 外不做任何操作。占用 CPU3 个时钟周期,在程序中可做少量延时调整。

Page 137: 第3章  80 x86 的指令系统和寻址方式

137

其他处理器控制指令—停机指令

格式: HLT

功能:使 CPU暂停工作,处于等待状态,等待外部中断到来以结束停机状态,继续下面指令的执行。

该指令对标志位无影响

Page 138: 第3章  80 x86 的指令系统和寻址方式

138

其他处理器控制指令—等待指令

格式: WAIT

功能:使 CPU 处于等待状态,等待协处理器完成当前的工作。

Page 139: 第3章  80 x86 的指令系统和寻址方式

139

其他处理器控制指令—换码(处理器交权)指令

格式: ESC 6 位 imm,R/M

功能:浮点协处理器 8087 指令是与 8086 的整数指令组合在一起的,当 8086 发现是一条浮点指令时,就利用 ESC指令将浮点指令交给 8087 执行

实际编写程序时,一般采用易于理解的浮点指令助记符格式ESC 6,[SI]

;实数除法指令: FDIV dword ptr [SI]

ESC 20H,AL

;整数加法指令: FADD ST(0),ST

Page 140: 第3章  80 x86 的指令系统和寻址方式

140

其他处理器控制指令—总线封锁前缀 LOCK

功能:与其他指令联合以维持总线的封锁信号直到与其联合的控制指令执行完成。

用于保证指令的完整执行。

Page 141: 第3章  80 x86 的指令系统和寻址方式

141

§ 3.4 80x86 的机器语言指令概况

介绍指令编码是为了说明 CPU 指令系统的机器码是如何构成的

双操作数指令编码格式 2-6 字节组成单操作数指令编码格式与 AX、 AL 有关的指令编码格式其它指令编码格式

Page 142: 第3章  80 x86 的指令系统和寻址方式

142

一、双操作数指令编码格式

MOV ADD SUB AND

data_lowdata_highD_highD_lowop code

7 0

dwMODREGR/M

7 0 7 07 0210543767 2 1 0

操作特征 寻址特征 位移量 立即数

Page 143: 第3章  80 x86 的指令系统和寻址方式

143

1 、操作特征部分

1) 操作码字段:说明指令规定的操作种类和操作数的来源(是否使用 AX\AL或 imm)

2) 方向字段:表示操作数由寻址特征的哪部分表示

1 DEST 由 REG 字段确定, SRC由MOD和 R/M确定0 DEST 由MOD和 R/M 字段确定, SRC由 REG确定

d=

R或M3) w字段:

1 字操作0 字节操作

w=

Page 144: 第3章  80 x86 的指令系统和寻址方式

144

2 、寻址特征部分

表示两个操作数所使用的寻址方式1) REG D5D4D3 共 3 位, 8 种组合具体确定哪个 R

REG w=1 w=0

000 AX AL

001 CX CL

010 DX DL

011 BX BL

100 SP AH

101 BP CH

110 SI DH

111 DI BH

Page 145: 第3章  80 x86 的指令系统和寻址方式

145

2 、寻址特征部分

2) MOD (寻址方式)字段 : D7D6 共 2 位

3) R/M 字段 : D2D1D0 共 3 位

2) 3) 共同确定 1 个操作数R/M

直接R间址基址、变址基址加变址

Page 146: 第3章  80 x86 的指令系统和寻址方式

146

MOD

R/M

EA 的计算公式 11

00 01 10 w=0 W=1

000 ( BX+SI)

DS

( BX+SI) +D8

DS

( BX+SI ) +D16

DS

AL AX

001 ( BX+DI)

DS

( BX+DI)+D8

DS

( BX+DI)+D16

DS

CL CX

010 ( BP+SI )

SS

( BP+SI ) +D8

SS

( BP+SI )+D16

SS

DL DX

011 ( BP+DI )

SS

( BP+DI ) +D8

SS

( BP+DI ) +D16

SS

BL BX

100 ( SI )

DS

(SI) +D8

DS

(SI) +D16

DS

AH SP

101 (DI)

DS

(DI) +D8

DS

(DI) +D16

DS

CH BP

110 (BP)SS

(BP) +D8

SS

(BP) + D16

SS

DH SI

111 (BX)

DS

(BX) +D8

DS

(BX) + D16

DS

BH DI

Page 147: 第3章  80 x86 的指令系统和寻址方式

147

3 、位移量部分

由寻址特征决定了是否包含该部分

MOD=11/00 , 不包含该部分MOD=01, 第 3 字节MOD=10, 第 3 、 4 字节

Page 148: 第3章  80 x86 的指令系统和寻址方式

148

4 、立即数部分

如有立即数则位于指令的最后两字节

如有段超越时,在指令编码前加 1 字节

Page 149: 第3章  80 x86 的指令系统和寻址方式

149

二、指令的执行时间

取指取操作数执行指令传送结果

各阶段所需时间的总和

Page 150: 第3章  80 x86 的指令系统和寻址方式

150

指令 寻址方式 时钟周期加法 ADD R-R 3

传送 MOV R-R 2

整数乘法 IMUL R16 128-154

整数除法 IDIV R16 165-184

移位 R ,1 2

转移 JMP 直接 15

条件转移 不转移 4

转移 16

不仅不同指令的执行时间差别很大,而且同一种指令使用不同的寻址方式执行时间的差别也很大。