第3章 80 x86 的指令系统和寻址方式
-
Upload
zenia-chan -
Category
Documents
-
view
153 -
download
0
description
Transcript of 第3章 80 x86 的指令系统和寻址方式
![Page 1: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/1.jpg)
1
第 3 章 80x86 的指令系统和寻址方式
§ 3.1 80x86 的寻址方式
§ 3.3 80x86 的指令系统
§ 3.4 80x86 的机器语言指令概况
![Page 2: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/2.jpg)
2
基本概念—指令系统
每一种计算机都有一组指令集供用户使用,这组指令集称为该计算机的指令系统。指令集中的每条指令在汇编语言中都是用助记符来表示的。
![Page 3: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/3.jpg)
3
基本概念—指令的构成
指令由操作码和操作数两部分组成 操作码说明计算机要执行哪种操作,如传送、运算、移位、
跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作
数,也有个别指令有 3 个甚至 4 个操作数
操作码 操作数
![Page 4: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/4.jpg)
4
基本概念— 80x86 指令的基本格式 操作码 [ 目的操作数 ][ ,源操作数 ]] [ ;注释 ]
DST SRC [ ] 内的内容可缺省 书写注意事项:
操作码与操作数至少有一个空格或制表符分隔 操作数之间必须用“ ,” 相分隔, DST 在前, SRC 在后
每种指令的操作码: 用一个唯一的助记符表示(指令功能的英文缩写) 对应着机器指令的一个二进制编码
指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址
![Page 5: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/5.jpg)
5
基本概念—寻址方式 在指令中为了取得操作数地址所使用的方式 寻找操作数的过程就是操作数的寻址 不同的指令系统都规定一些寻址方式供编程时选用 指令的寻址方式主要由操作数的形式表示出来
操作数采取哪一种寻址方式,会影响机器运行的速度和效率
![Page 6: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/6.jpg)
6
§ 3.1 80x86 的寻址方式一、与数据有关的寻址方式
二、与转移地址有关的寻址方式
1. 立即(数)寻址2. 寄存器寻址3. 直接寻址4. 寄存器间接寻址5. 寄存器相对寻址6. 基址变址寻址7. 相对基址变址寻址8. 比例因子寻址9. 串操作寻址10. 端口寻址
![Page 7: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/7.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/8.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/9.jpg)
9
立即数寻址的执行
![Page 10: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/10.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/11.jpg)
11
寄存器寻址的执行
![Page 12: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/12.jpg)
12
存储器操作数的寻址
当操作数存放在内存中时,寻找操作数归结为如何确定存储单元的地址
逻辑地址 段基值:偏移量
由段寄存器经计算给出 主要确定该部分的内容 (EA)
位移量:指令中给出 8/16/32 位数(常数、符号) EA 基地址:有基址寄存器 BX 或基址指针 BP 给出
变址: 由变址寄存器( SI或 DI )给出
EA= 位移量 + 基址 + 变址
EA= 位移量 + 基址 + (变址 * 比例因子)比例因子( 1/2/4/8 )
![Page 13: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/13.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/14.jpg)
14
3. 直接寻址 有效地址只包含位移量
操作数的 16 位偏移量直接包含在指令中,与操作码一起放在代码段
用符号表示的位移量MOV BX,VAR
;表示将用符号 VAR 表示的字单元的内容→ AX
; 不声明段则默认为数据段,指明段寄存器则可实现段跨越
用常数表示的位移量
MOV AX,DS:[2000H]
;表示将数据段偏移 2000H字节的字单元的内容→ AX
![Page 15: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/15.jpg)
15
直接寻址的执行
MOV AX,DS:[2000H]
![Page 16: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/16.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/17.jpg)
17
寄存器间接寻址的执行( BX=2000H, DS=3000H )
![Page 18: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/18.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/19.jpg)
19
寄存器相对寻址的执行
![Page 20: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/20.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/21.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/22.jpg)
22
基址变址寻址的执行
请注意图中的错误!
![Page 23: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/23.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/24.jpg)
24
31A00
3000:1A00
![Page 25: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/25.jpg)
25
BX、 SI 分别存放数组的脚标
MOV AL,ARRAY[BX][SI]
DS数据段
ARRAY
SI
BX
二维数组起始单元
⊕
EA
[ ] 之间表示相加的关系[BX][SI] ← → [BX+SI]
![Page 26: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/26.jpg)
26
8. 比例变址寻址、基址比例比例变址寻址、相对基址比例变址寻址方式
比例变址寻址有效地址是:位移量加变址寄存器与比例因子乘积之和
MOV EAX, COUNT[ESI*4]
基址比例比例变址寻址有效地址是:基址加变址寄存器与比例因子乘积之和
MOV CX, [EAX][EDX*2]
相对基址比例变址寻址方式有效地址是:位移量加基址加变址寄存器与比例因子乘积之和
MOV EAX , TABLE[EBP][EDI*4]
作用:方便字、双字等数组的操作
![Page 27: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/27.jpg)
27
二、与转移地址有关的寻址方式
程序代码亦存放在存储器中,如何控制程序的走向(转移位置的地址 CS:IP )是本部分所涉及的内容,由于它们与具体的指令相关,他们的介绍放在指令中讲解。
![Page 28: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/28.jpg)
28
§ 3.3 80x86 的指令系统 指令分类
功能
格式
数据传送指令 算术运算指令 逻辑指令 串操作指令 程序转移指令 处理器控制指令
双操作数指令( DEST,SRC) 单操作数指令( DEST) 无操作数指令(隐含,按约定寻找操作
数)
![Page 29: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/29.jpg)
29
一、数据传送指令 数据传送是计算机中最基本、最重要的一种操作 传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位
1. 通用数据传送指令 提供方便灵活的通用传送操作
MOV XCHG PUSH POP MOVSX MOVZX PUSHA/PUSHAD POPA/POPAD
![Page 30: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/30.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/31.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/32.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/33.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/34.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/35.jpg)
35
1) 传送指令 MOV— 数据传送方向示意
立即数
段寄存器CS DS ES SS
通用寄存器AX BX CX DXBP SP SI DI
存 储 器
![Page 36: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/36.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/37.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/38.jpg)
38
4) 交换指令 XCHG ( exchange)
指令格式: XCHG DST,SRC
指令功能: (DST ← →) ( SRC) 寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据
注意:不能在存储器与存储器之间对换
![Page 39: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/39.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/40.jpg)
40
4) 交换指令 XCHG— 寄存器与存储器交换
XCHG AX,DS:[2000H] ;字交换
XCHG DS:[2000H],AX
XCHG AL, DS:[2000H] ;字节交换 XCHG DS:[2000H],AL
![Page 41: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/41.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/42.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/43.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/44.jpg)
44
堆栈操作指令—应用举例
PUSH AX ;进入子程序后
PUSH BX
PUSH DS
...
POP DS ;返回主程序前
POP BX
POP AX
![Page 45: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/45.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/46.jpg)
46
8) 所有寄存器出栈指令— POPA/POPAD
格式: POPA
功能:将堆栈中的数据弹给 16 位寄存器,顺序与压栈指令相反 ESP←ESP+16
格式: POPAD 功能:将堆栈中的数据弹给 32 位寄存器,顺序与压栈指令相反
ESP←ESP+32
![Page 47: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/47.jpg)
47
累加器专用传送指令换码指令 XLAT( translate)
指令格式: XLAT
指令功能 : AL←DS:[BX+AL] ,将 BX 指定的缓冲区中、AL 指定的位移处的一个字节数据取出赋给 AL
换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码
表格首地址存放于 BX, AL 存放相对表格首地址的位移量
换码指令执行后:将 AL 寄存器的内容转换为目标代码
![Page 48: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/48.jpg)
48
MOV BX,100HMOV AL,03HXLAT
(BX)
(AL)
DS
数据段12H
34H
56H
78H
9AH
78H
(AL)=78H
3) 换码指令 XLAT— 例题
![Page 49: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/49.jpg)
49
3. 地址传送指令 地址传送指令将存储器单元的逻辑地址送至指定的
寄存器 有效地址传送指令 LEA
指针传送指令 LDS和 LES
指针传送指令 LFS、 LGS、 LSS
注意不是获取存储器单元的内容
![Page 50: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/50.jpg)
50
格式: LEA DST,SRC
3. 地址传送指令—有效地址传送指令 LEA( load EA)
功能: DST←SRC 的有效地址 EA
将存储器操作数的有效地址传送至指定的 16/32
位寄存器中
16/32 位寄存器
存储器操作数
![Page 51: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/51.jpg)
51
LEA BX,BUFR
9A78H
(BX)=9A78H
3. 地址传送指令—有效地址传送指令 LEA (例)
23H
093A0H
BUFR78H
9AH
093AHDS
093C3H (BX)=0023H
错误!
获得主存单元的有效地址;不是物理地址,也不是该单元的内容
可以实现计算功能
![Page 52: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/52.jpg)
52
3. 地址传送指令 —地址指针
存储单元的逻辑地址:
段基值( 16 位)
段内偏移量( 16 位)
地址指针( 32 位)M的逻辑地址在M中需 4 个连续的存储单元
段基值
AD_POINT
XX
XX
偏移量XX
XX
![Page 53: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/53.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/54.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/55.jpg)
55
3. 地址传送指令 —地址指针 (32)
存储单元的逻辑地址段选择器( 16 位)
段内偏移量( 32 位)
地址指针( 48 位)M的逻辑地址在M中需 6 个连续的存储单元
段选择
AD_POINT
XX
XX
偏移量XX
XX
XX
XX
![Page 56: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/56.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/57.jpg)
57
4. 标志寄存器传送指令
标志寄存器传送指令用来传送标志寄存器 FLAGS的内容,方便进行对各个标志位的直接操作
指令 低 8 位传送: LAHF和 SAHF
16 位传送: PUSHF和 POPF
32 位传送: PUSHFD和 POPFD
![Page 58: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/58.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/59.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/60.jpg)
60
4. 标志寄存器传送指令—标志寄存器进出堆栈指令(置位单步标志)
PUSHF ;保存全部标志到堆栈
POP AX ;从堆栈中取出全部标志
OR AX,0100H ;设置 D8=TF=1, AX其它位不变
PUSH AX ;将 AX压入堆栈
POPF ; FLAGS←AX
;将堆栈内容取到标志寄存器
![Page 61: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/61.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/62.jpg)
62
二、算术运算指令(部分) 四则运算是计算机经常进行的一种操作。算术运算
指令实现二进制(和十进制)数据的四则运算 请注意算术运算类指令对标志的影响
![Page 63: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/63.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/64.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/65.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/66.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/67.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/68.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/69.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/70.jpg)
70
4. 求补指令(举例)
例: AL=13H, 执行指令NEG AL
后 AL 的值
1
0000 00000001 00111110 1101
—AL
AL=-13H
0001 0011
负数求补
![Page 71: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/71.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/72.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/73.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/74.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/75.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/76.jpg)
76
6. 乘法指令—功能 乘法指令分无符号和有符号乘法指令 乘法指令的源操作数显式给出,隐含使用另一个操
作数 AX和 DX 字节相乘: AL与 r8/m8 相乘,得到 16 位的结果,存入 AX
字相乘: AX与 r16/m16 相乘,得到 32 位的结果,其高字存入 DX ,低字存入 AX
乘法指令利用 OF和 CF判断乘积的高一半是否具有有效数值
![Page 77: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/77.jpg)
77
6. 乘法指令—对标志的影响
乘法指令如下影响 OF和 CF标志: MUL 指令——若乘积的高一半( AH或 DX )为 0 ,则
OF=CF=0 ;否则 OF=CF=1
IMUL 指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0 ;否则均为 1
![Page 78: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/78.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/79.jpg)
79
6. 除法指令—功能
除法指令分无符号和有符号除法指令 除法指令的除数显式给出,隐含使用另一个操作数 AX和 DX 作为被除数
字节量除法: AX 除以 r8/m8, 8 位商存入 AL, 8 位余数存入 AH
字量除法: DX.AX 除以 r16/m16, 16 位商存入 AX, 16位余数存入 DX
除法指令对标志没有影响 除法指令会产生结果溢出
![Page 80: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/80.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/81.jpg)
81
6. 除法指令—除法错中断 当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器 AL/AX 不能表达,便产生溢出, 80x86CPU 中就产生编号为 0 的内部中断——除法错中断
对 DIV 指令,除数为 0 ,或者在字节除时商超过 8 位,或者在字除时商超过 16 位,则发生除法溢出
对 IDIV 指令,除数为 0 ,或者在字节除时商不在 -128~ 127范围内,或者在字除时商不在 -32768~ 32767范围内,则发生除法溢
![Page 82: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/82.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/83.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/84.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/85.jpg)
85
7. 符号扩展指令—(例: AX/BX)
CWD ; DX.AX←AX
IDIV BX ; AX←DX.AX÷BX
利用符号扩展指令得到除法指令所需要的倍长于除数的被除数
对无符号数除法应该采用直接使高 8 位或高 16 位清 0 的方法,获得倍长的被除数
![Page 86: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/86.jpg)
86
8. 十进制调整指令
十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果
分成压缩 BCD 码和非压缩 BCD 码调整
![Page 87: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/87.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/88.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/89.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/90.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/91.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/92.jpg)
92
三、逻辑指令
(逻辑 )位操作类指令以二进制位为基本单位进行数据的操作;这是一类常用的指令,都应该特别掌握
逻辑运算指令 测试指令 移位指令
![Page 93: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/93.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/94.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/95.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/96.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/97.jpg)
97
3. 移位指令 逻辑移位指令 算术移位指令 循环移位指令
![Page 98: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/98.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/99.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/100.jpg)
100
逻辑移位指令的功能
![Page 101: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/101.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/102.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/103.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/104.jpg)
104
不带进位循环移位指令(小循环)
![Page 105: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/105.jpg)
105
带进位循环移位指令(大循环)
![Page 106: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/106.jpg)
106
循环移位指令 —将 DX.AX 中 32 位数值左移一
位
SHL AX,1
RCL DX,1
DX AXCF
0
![Page 107: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/107.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/108.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/109.jpg)
109
四、串操作指令
串操作指令是 80x86 指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域的数据时,特别好用
串操作指令的操作数是主存中连续存放的数据串( String ——) 即在连续的主存区域中,字节或字(或双字)的序列
串操作指令的操作对象是以字( W )为单位的字串,或是以字节( B )为单位的字节串 (D).
![Page 110: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/110.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/111.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/112.jpg)
112
串传送 MOVSB (正向 DF= 0 )
![Page 113: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/113.jpg)
113
串传送 MOVSW (反向 DF=1)
![Page 114: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/114.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/115.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/116.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/117.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/118.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/119.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/120.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/121.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/122.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/123.jpg)
123
重复前缀指令( repeat)
串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在 CX 寄存器中
重复前缀分 2 类, 3 条指令: 配合不影响标志的 MOVS、 STOS (和 LODS )指令的 REP前缀 配合影响标志的 CMPS和 SCAS 指令的 REPZ和 REPNZ前缀
![Page 124: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/124.jpg)
124
REP重复前缀指令
REP ;每执行一次串指令, CX减 1;直到 CX= 0 ,重复执行结束
REP 前缀可以理解为:当数据串没有结束( CX≠0),则继续传送
例 2 中,程序段的最后 3 条指令,可以分别替换为:
REP MOVSB 和 REP STOSW
![Page 125: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/125.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/126.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/127.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/128.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/129.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/130.jpg)
130
例:在 STRBUF 字符串中寻找 STRING 中指定的二字符出现的个数
采用逐个比较的方法 因目的串为 2 个字符,故使用 CMPSW
应注意的问题: 若某次比较不同时, SISI+2 ,但有可能出现‘ AAS’
的情况,应做 SISI-1 的处理 执行 CMPSW亦做 DI DI+2 ,而目的串应始终指向
STR ,故 DI DI-2 比较相同时,循环计数器 -2
![Page 131: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/131.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/132.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/133.jpg)
133
五、控制转移指令
![Page 134: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/134.jpg)
134
六、处理器控制指令 标志位操作指令 其他处理器控制指令
![Page 135: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/135.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/136.jpg)
136
其他处理器控制指令—空操作
格式: NOP
功能:完成一次空操作,除使 IP ← IP+1 外不做任何操作。占用 CPU3 个时钟周期,在程序中可做少量延时调整。
![Page 137: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/137.jpg)
137
其他处理器控制指令—停机指令
格式: HLT
功能:使 CPU暂停工作,处于等待状态,等待外部中断到来以结束停机状态,继续下面指令的执行。
该指令对标志位无影响
![Page 138: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/138.jpg)
138
其他处理器控制指令—等待指令
格式: WAIT
功能:使 CPU 处于等待状态,等待协处理器完成当前的工作。
![Page 139: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/139.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/140.jpg)
140
其他处理器控制指令—总线封锁前缀 LOCK
功能:与其他指令联合以维持总线的封锁信号直到与其联合的控制指令执行完成。
用于保证指令的完整执行。
![Page 141: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/141.jpg)
141
§ 3.4 80x86 的机器语言指令概况
介绍指令编码是为了说明 CPU 指令系统的机器码是如何构成的
双操作数指令编码格式 2-6 字节组成单操作数指令编码格式与 AX、 AL 有关的指令编码格式其它指令编码格式
![Page 142: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/142.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/143.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/144.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/145.jpg)
145
2 、寻址特征部分
2) MOD (寻址方式)字段 : D7D6 共 2 位
3) R/M 字段 : D2D1D0 共 3 位
2) 3) 共同确定 1 个操作数R/M
直接R间址基址、变址基址加变址
![Page 146: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/146.jpg)
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 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/147.jpg)
147
3 、位移量部分
由寻址特征决定了是否包含该部分
MOD=11/00 , 不包含该部分MOD=01, 第 3 字节MOD=10, 第 3 、 4 字节
![Page 148: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/148.jpg)
148
4 、立即数部分
如有立即数则位于指令的最后两字节
如有段超越时,在指令编码前加 1 字节
![Page 149: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/149.jpg)
149
二、指令的执行时间
取指取操作数执行指令传送结果
各阶段所需时间的总和
![Page 150: 第3章 80 x86 的指令系统和寻址方式](https://reader036.fdocuments.net/reader036/viewer/2022081415/568130ed550346895d970f44/html5/thumbnails/150.jpg)
150
指令 寻址方式 时钟周期加法 ADD R-R 3
传送 MOV R-R 2
整数乘法 IMUL R16 128-154
整数除法 IDIV R16 165-184
移位 R ,1 2
转移 JMP 直接 15
条件转移 不转移 4
转移 16
不仅不同指令的执行时间差别很大,而且同一种指令使用不同的寻址方式执行时间的差别也很大。