第 3章 寻址方式和指令系统第 3章 寻址方式和指令系统
3.1 寻址方式
3.2 指令系统第 3章 寻址方式和指令系统
3.1 寻 址 方 式
3.1.1 寻址方式和有效地址概念操作数地址的表示有 3种情况:
(1) 直接放在指令中。指令的操作数部分就是操作数本身。
这种操作数叫做立即数,对应的指令寻址方式称为立即数寻址。
(2) 放在 CPU的某个内部寄存器中。指令的操作数部分是 CPU
的一个寄存器。这种指令寻址方式称为寄存器寻址。
(3) 放在某个存储单元中,指令的操作数部分包含着该操作数所在的内存地址。这种指令寻址方式称为存储器寻址。
第 3章 寻址方式和指令系统每个存储单元在存储器中所具有的地址称为存储单元的物理地址,段基地址 (简称段地址 )是指每一段的起始地址,单元与段基地址的距离称为段内偏移地址,也叫偏移量。物理地址是由存储单元所在段的基地址和段内偏移地址这两个部分组成。以 MOV
指令为例,若有:
MOV DS∶BUFFER,AL
这里,DS∶BUFFER 表示内存的某一单元地址,称为逻辑地址。 DS
对于实地址方式就是段基址,对于保护方式则可通过段管理部件形成段基址。 BUFFER为段内偏移地址,段内偏移地址有 16位和 32
位两种。段基址和段内偏移地址相加,形成线性地址,对实地址方式而言,该线性地址就是物理地址。对保护方式而言,线性地址经管理部件再变换成 32位物理地址。
第 3章 寻址方式和指令系统段内偏移地址可以由基址寄存器内容、变址寄存器内容、
比例因子和位移量这 4个基本部分组合而成。由 4个基本部分组合而成的偏移地址称为有效地址 EA(Effective Address),比例因子可取 1,2,4,8中的任一个,基址寄存器内容、变址寄存器内容和位移量可为正数也可为负数。有效地址 EA的组合及计算方法是:
有效地址 EA=基址+ (变址 × 比例因子 )+位移量第 3章 寻址方式和指令系统可用作基址、变址的寄存器和比例因子、位移量的取值规定是:
● 工作于实地址方式下的 16位寻址:基址寄存器可以是 BX
或 BP寄存器,变址寄存器可以是 SI或 DI寄存器,比例因子或者没有或者为 1。位移量可以是 0,8位或 16位。
● 工作于保护方式下的 32位寻址:基址寄存器可以是任何
32位通用寄存器中的一个,变址寄存器可以是除 ESP外的任何 32
位通用寄存器中的一个,比例因子可以是 1,2或 4或 8,位移量可以是 0,8位或 32位。
第 3章 寻址方式和指令系统
3.1.2 数据寻址方式
1.立即数寻址直接出现在指令中的操作数称为立即数,它紧跟在操作码的后面,其本身就是代码的一部分,这种寻址方式叫做立即数寻址。
立即数可以是 8位,16位或 32位。
例 3-1
MOV AL,20
MOV BX,2568H
MOV ECX,25685678H
这 3条指令中的立即数依次是 8位,16位和 32位,对应的寄存器也分别是 8位的 AL,16位的 BX和 32位的 ECX。执行指令 MOV BX,
2568H的结果是 (BX)=2568H,执行过程见图 3-1。
第 3章 寻址方式和指令系统说明:
① 立即数只能作源操作数,不能作为目的操作数,一般用于给寄存器赋初值;
② 立即数既可以是二进制数、十进制数,也可以是十六进制数;
③ 低位字节数存放在存储单元的低地址字节,高位字节数存放在存储单元的高地址字节,如,MOV AX,im中的立即数 im,
其低 8位字节 iml存储在低地址字节单元中,高 8位字节 imh存储在高地址字节单元中,指令的存储与执行过程如图 3-2所示。
第 3章 寻址方式和指令系统图 3-1 例 3-1立即数寻址示意图
2 5 H 6 8 H
操作码
6 8 H
2 5 H
BX


CS 段低高第 3章 寻址方式和指令系统图 3-2 立即数寻址及数据存储示意图
AH AL
操作码
i m l
i m h
AX


CS 段低高第 3章 寻址方式和指令系统
2.寄存器寻址寄存器寻址又称寄存器直接寻址。操作数直接存放在寄存器中,由指令指定的寄存器进行寻址,即操作数包含在指令规定的 8位,16位或 32位寄存器中。如:
INC DL
MOV DS,AX
MOV EBX,ECX
三条指令表明操作数分别存于 8位 DL,16位的 AX和 32位的 ECX中。
第 3章 寻址方式和指令系统例 3-2 设 (CX)=1234H,(AX)=5678H,执行指令
MOV CX,AX
其结果是,(CX)=5678H,(AX)不变,仍为 5678H,执行过程见图 3-3。
说明:虽然操作数可使用 CPU内部通用寄存器中的任意一个,
且它们都能参与算术 /逻辑运算和存放运算结果。由于 AX和 EAX
是累加器,若结果是存放在 AX或 EAX中,通常指令执行的时间要短一些。
第 3章 寻址方式和指令系统图 3-3 例 3-2寄存器寻址执行情况
56 78
CX
56 78
AX
第 3章 寻址方式和指令系统
3.直接寻址指令中的操作数部分直接给出的是操作数的有效地址 EA的寻址方式称为存储器直接寻址,简称直接寻址。有效地址 EA是和操作码一起放在存储器代码段中,它可以是 16位或 32位整数。但操作数一般在数据段 DS中。
设要访问的数据存放在 DS所指向的数据段中,实地址模式下物理地址的计算方法是:
物理地址 =10H(DS)+有效地址第 3章 寻址方式和指令系统图 3-4 例 3-3直接寻址执行情况操作码
00H
10H


CS 段低高
12H 34H 34H
12H
BX


DS 段低高
2 1 0 0 0 H
2 1 0 0 1 H
2 0 0 0 0 H
1 0 0 0 H

2 1 0 0 0 H
第 3章 寻址方式和指令系统例 3-3 设操作数存放在 DS所指向的数据段中,(DS)=2000H,
(21000H)=34H,(21001H)=12H,(BX)=5678H,执行指令 MOV
BX,[1000H]后的结果为,(BX)=1234H,指令中的 16位地址偏移量是低位字节在低地址存储单元中,高位字节在高地址存储单元中。执行过程如图 3-4所示。
例 3-4 执行指令 MOV AX,BEGIN的结果是:将内存中从
BEGIN开始的连续两个单元内容送入 AX中。
第 3章 寻址方式和指令系统说明:
① 直接寻址方式,是以数据段的地址为基础,可在多达 64
KB的范围内寻找操作数。
② 缺省情况下,认为操作数有效地址的作用域是 DS所指向的数据段,但允许使用段超越前缀指定为其他段,即对于寻找操作数来说,还允许操作数在以代码段、堆栈段或附加段为基准的区域中,即只要在指令中指明是段超越的,则 16位地址偏移量可以与 CS,SS,ES,FS或 GS相加,作为操作数的地址,如 MOV AX,
ES∶[2000H] 。
第 3章 寻址方式和指令系统
③ 指令中操作数的有效地址既可以是一个数字,也可以是一个符号地址,如例 3-4中的 BEGIN就是一个符号地址。
④ 直接寻址主要用于单个操作数的相对寻址场合,如简单的标量操作数寻址和静态分配的数组的起始地址寻址等。
第 3章 寻址方式和指令系统
4.寄存器间接寻址操作数在存储器中,但操作数地址的偏移量包含在寄存器中,这种寻址方式称为寄存器间接寻址。寄存器间接寻址可以是 16位寻址,也可以是 32位寻址。若使用 BX,SI,DI,BP 4个寄存器中的一个,则为 16位寻址;若使用的是 EAX,EBX,ECX、
EDX,ESI,EDI,EBP,ESP中的一个,则为 32位寻址。以 BX,SI、
DI,EAX,EBX,ECX,EDX,ESI,EDI间接寻址时,则默认操作数在 DS段中;以 BP,EBP,ESP间接寻址时,则默认操作数在 SS
段中。
寄存器的使用规定对 16位寻址和 32位寻址是不一样的。
第 3章 寻址方式和指令系统图 3-5 寄存器间接寻址示意图
DS 2 0 0 0 0 H
SI 1000H+
2 1 0 0 0 H
操作码


低高
CS 段
34H
12H


DS 段低
2 1 0 0 0 HAH AL

AX
第 3章 寻址方式和指令系统
(1) 16位寻址时,偏移地址放在 SI,DI,BP或 BX中,段默认有两种情况:
① 若以 SI,DI,BX间接寻址,通常操作数在现行数据段区域中,即数据段寄存器 DS左移 4位后加上 SI,DI,BX中的 16位偏移量作为操作数的地址。例如,MOV AX,[SI],操作数在数据段寄存器 DS中,16位偏移量在 SI中。设 (DS)= 2000H,
(SI)=1000H,21000H单元的内容为 34H,21001H单元的内容为
12H,执行 MOV AX,[ SI]后,AX的内容为 1234H。指令的执行过程如图 3-5所示。
第 3章 寻址方式和指令系统
② 若是以寄存器 BP间接寻址,则操作数在堆栈段区域中,
即堆栈段寄存器 SS左移 4位后与 BP相加作为操作数的地址。例如,
MOV AX,[BP],操作数在数据段寄存器 SS中,16位偏移量在 BP中。
设 (SS)= 3000H,(BP)=2000H,32000H单元的内容为 34H,32001H
单元的内容为 12H,执行 MOV AX,[ BP]后,AX的内容为 1234H。
指令的执行过程如图 3-6所示。
第 3章 寻址方式和指令系统图 3-6 BP寄存器间接寻址示意图
SS3 0 0 0 0 H
BP2000H+
3 2 0 0 0 H
操作码


低高
CS 段
34H
12H


SS 段低
3 2 0 0 0 HAH AL

AX
第 3章 寻址方式和指令系统
(2) 32位寻址时,偏移地址放在以 EAX,EBX,ECX,EDX、
ESI,EDI,EBP,ESP寄存器中,段默认有两种情况:
① 通用寄存器 EAX,EBX,ECX,EDX,ESI,EDI默认段寄存器为 DS。
② 通用寄存器 ESP,EBP默认段寄存器为 SS。
第 3章 寻址方式和指令系统例 3-5
MOV EBX,[EAX];默认 DS为段基址,传送双字给 EBX
MOV DX,[EBX];默认 DS为段基址,传送字给 DX
MOV CH,[EAX];默认 DS为段基址,传送字节给 CH
第 3章 寻址方式和指令系统说明:
① 如果操作数在默认段之外,指令中必须加段超越前缀。如
MOV AX,ES∶[SI] ;操作数在数据段寄存器 ES中,
不在默认段 DS中
MOV AX,DS∶[BP] ;操作数在数据段寄存器 DS中,
不在默认段 SS中所以,,ES∶,和,DS∶,分别是两指令的段超越前缀。
② 若在指令中规定是段超越的,则 BP也可以与其它的段寄存器相加,形成操作数地址,如 MOV AX,DS∶[BP],BP不是与 SS段寄存器形成操作数地址,而是与 DS段寄存器形成操作数地址。
③ 寄存器间接寻址的应用场合与直接寻址的应用场合相似。
④ 源操作数与目的操作数的位数要匹配。
第 3章 寻址方式和指令系统例 3-6 设 (DS)=2000H,(SI)=1200H,(21200H)=56H,执行指令 MOV AH,[SI]的结果是,(AH)=56H,执行过程见图 3-7。
图 3-7 例 3-6寄存器间接寻址执行情况
2 0 0 0 H
1 2 0 0 H +
DS
SI
× 1 0 H
56H


低高
DS 段
56H
AH
2 1 2 0 0 H
第 3章 寻址方式和指令系统例 3-7 设 (DS)=2000H,(DI)=2100H,(22100H)=68H,
(22101H)=41H,执行指令 MOV BX,[DI]的结果是:
(BX)=4168H。
第 3章 寻址方式和指令系统
5.基址寻址由指定的基址寄存器内容,加上指令中给定的偏移量 (要由一个段寄存器作为地址基准 )作为操作数的地址的寻址方式称为基址寻址。
在基址寻址方式下,EA= [基址寄存器 ]+位移量,位移量是常数且紧跟在操作码之后,与操作码一起存放在代码段中。基址寄存器的使用规定对 16位寻址和 32位寻址是不一样的。
第 3章 寻址方式和指令系统
(1) 16位寻址情况下,SX和 BP作为基址寄存器。在缺省段超越前缀时,BX以 DS作为默认段寄存器,BP以 SS作为默认段寄存器。
位移量可为 8位或 16位。
(2) 32位寻址情况下,8个 32位通用寄存器均可作基址寄存器,
其中 ESP,EBP以 SS为默认段寄存器,其余 6个通用寄存器均以 DS为默认段寄存器。位移量为 8位或 32位。
基址寻址适于对一维数组的数组元素进行检索操作。位移量表示数组起始地址偏移量,基址表示的是可以变化的数组元素下标。
EA的书写形式可以是,[基址寄存器 ]+位移量,,也可以是
,位移量 [基址寄存器 ]”。基址寻址的执行过程示例如图 3-8所示
(以例 3-8中的 MOV DX,[EAX+ 1500]为例,默认段基址是 DS)。
第 3章 寻址方式和指令系统图 3-8 基址寻址的执行过程示意图
4 0 0 0 0 0 0 0 H
2 5 0 0 0 0 0 0 H

6 5 0 0 1 5 0 0 H
操作码


低高
CS 段
xxH
yyH


DS 段低
6 5 0 0 1 5 0 0 HDH DL

DX
0 0 0 0 1 5 0 0 H
DS 段基址
E A X
00H
15H
6 5 0 0 1 5 0 1 H
第 3章 寻址方式和指令系统例 3-8
MOV EAX,[BX+ 24] ;或 MOV EAX,24[BX]
MOV ECX,[ EBP+ 50] ;或 MOV ECX,50[EBP]
MOV DX,[EAX+ 1500] ;或 MOV DX,1500[EAX]
第 3章 寻址方式和指令系统例 3-9 设 (DS)=2000H,(SI)=1200H,(21206H)=56H,执行指令 MOV AH,[SI+6]的结果是,(AH)=56H,执行过程见图 3-9。
图 3-9 例 3-9寄存器相对寻址执行情况
1 2 0 0 0 H
6 +
SI
位移量
× 1 0 H
56H


低高
DS 段
56H
AH
2 1 2 0 6 H
2 0 0 0 HDS

第 3章 寻址方式和指令系统
6.变址寻址由指定的变址寄存器内容,加上指令中给定的偏移量 (要由一个段寄存器作为地址基准 )作为操作数的地址的寻址方式称为变址寻址。
在变址寻址方式下,EA= [变址寄存器 ]+位移量,位移量跟在操作码之后,与操作码一起存放在代码段中。变址寄存器的使用规定对 16位寻址和 32位寻址是不一样的。
(1) 16位寻址时,仅 SI,DI可作变址寄存器,默认 DS作为段基址寄存器。如:
MOV AX,COUNT[SI]
第 3章 寻址方式和指令系统
(2) 32位寻址时,除 ESP外的任何通用寄存器均可作变址寄存器,EBP默认 SS作段基址寄存器,其余的以 DS作段基址寄存器。如:
MOV EAX,5[EBP]
MOV ECX,DATA[EAX]
EA的书写形式可以是,[变址寄存器 ]+位移量,,也可以是,位移量 [变址寄存器 ]”,即位移量可以写在 [ ]里,也可以写在 [ ]外面;也可以是一个数字,或一个符号地址。以 MOV AX,
COUNT[SI]为例,默认段基址是 DS,变址寻址的执行过程如图 3-
10所示。
第 3章 寻址方式和指令系统图 3-10 变址寻址示意图
SI 2 0 0 0 H
C O U N T 3 0 0 0 H+
3 5 0 0 0 H
操作码
…低高
CS 段


D S 段低
3 5 0 0 0 HAH AL

AX
00H 偏移量 H
30H 偏移量 L

DS 3 0 0 0 0 H
3 5 0 0 1 H
第 3章 寻址方式和指令系统变址寻址适用于对一维数组的数组元素进行检索操作。位移量表示数组起始地址偏移量,变址表示的是可以变化的数组元素下标。
例 3-10 执行指令 MOV CX,LIST[DI]的结果是将内存中从
DS∶[DI+LIST] 处开始的连续两个单元内容送入 CX中,其中 LIST
是用符号表示的位移量,变址寄存器使用的是 DI,所以默认段为 DS。
第 3章 寻址方式和指令系统
7.基址加变址寻址由指令中的基址寄存器内容和变址寄存器内容相加得到操作数的有效地址 EA的寻址方式称为基址加变址寻址,即
EA= [基址寄存器 ]+ [变址寄存器 ]
如:
MOV AX,[BX+ SI] ;或 MOV AX,[BX][SI]
MOV EAX,[EDX][EBP] ;或 MOV EAX,[EDX+ EBP]
第 3章 寻址方式和指令系统基址加变址寻址有 16位和 32位寻址两种情况,每种情况下基址、变址寄存器的使用规定和段寄存器的默认规定与基址寻址、
变址寻址相同。但当一种寻址方式中既有基址寄存器又有变址寄存器,而两个寄存器默认的段寄存器又不相同时,一般规定由基址寄存器来决定默认哪一个段寄存器作段基址指针。缺省时操作数所在段由指令中的基址寄存器决定,若使用 BP,ESP或 EBP,则默认操作数在 SS段中;若使用其他基址或变址寄存器,则默认操作数在 DS段中。如:
MOV AX,[BX][SI] ; 基址寄存器是 BX,默认 DS为段基址寄存器
MOV EAX,[EBP][ECX] ;基址寄存器是 EBP,默认 SS为段基址寄存器基址加变址寻址可用于二维数组操作 (如检索数组元素 )和二重循环等。
第 3章 寻址方式和指令系统例 3-11 设 (DS)=2000H,(SI)= 200H,(BX)= 1000H,
(21200H)=21H,执行指令 MOV AL,[SI+BX]的结果是:
(AL)=21H,执行过程如图 3-11所示。
图 3-11 例 3-11基址加变址寻址示意图
2 0 0 H
1 0 0 0 H +
SI
BX
× 1 0 H
21H


低高
DS 段
21H
AL
2 1 2 0 0 H
2 0 0 0 HDS

第 3章 寻址方式和指令系统例 3-12 执行 MOV BX,[EDI+EAX]的结果是将内存中
DS∶[EDI+EAX] 处开始的连续两个单元内容送 BX中。
第 3章 寻址方式和指令系统
8.比例变址寻址变址寄存器的内容乘以比例因子再加上位移量得到操作数有效地址 EA的寻址方式称为比例变址寻址,即
EA= [变址寄存器 ]× 比例因子+位移量比例变址寻址只有 32位寻址一种情况。如:
MOV EAX,TABLE[ESI*4] ; TABLE是位移量,4是比例因子其中,乘比例因子的操作是在 CPU内部由硬件完成的。
第 3章 寻址方式和指令系统例 3-13 指令 MOV EAX,50[ESI*4]的位移量是 50,比例因子是 4,执行该指令时,默认 DS为段基址,执行过程如图 3-12所示。
图 3-12 比例变址寻址过程示意图
4 0 0 0 0 0 0 0 H
4 4 8 0 0 0 0 0 H
5 0 H
DS 段基址

4 4 8 0 0 0 5 0 H
1 1 2 0 0 0 0 0 H
4
E S I
×
4 4 8 0 0 0 0 0 H
5 0 H

低高
DS 段操作码

CS 段
E A X

x x H
x x H
y y H
y y H

低高
4 4 8 0 0 0 5 3 H
4 4 8 0 0 0 5 0 H
第 3章 寻址方式和指令系统例 3-14 执行指令 MOV AX,LIST[2*ESI]的结果是将内存中从 DS:[2*ESI+IST]处开始的连续两个单元内容送 AX中;执行指令 MOV CL,[ESI+4*EAX]的结果是将内存中 DS:[ESI+4*EAX]
处的单元内容送 CL中;执行指令 MOV DX,[EBP+4*ECX+9]的结果是将内存中从 DS:[EBP+4*ECX+9]处开始的连续两个单元内容送入 DX中。
第 3章 寻址方式和指令系统
9.基址加比例变址寻址由变址寄存器的内容乘以比例因子再加上基址寄存器的内容而得到操作数有效地址 EA的寻址方式称为基址加比例变址寻址方式,即
EA= [变址寄存器 ]× 比例因子+ [基址寄存器 ]
基址加比例变址寻址只有 32位寻址一种情况。如:
MOV ECX,[EDX*8][EAX] ;或 MOV ECX,[EDX*8+EAX]
MOV AX,[EBX*4][ESI] ;或 MOV AX,[ EBX*4+ ESI]
基址加比例变址寻址方式主要用于数组元素大小为 2,4,8
字节时的二维数组检索操作等场合。
第 3章 寻址方式和指令系统例 3-15 设 (DS)=2000H,(DI)= 200H,(AX)= 1000H,
(21204H)=32H,执行指令 MOV AL,[DI+AX+4]的结果是:
(AL)=32H,执行过程见图 3-13。
图 3-13 例 3-15基址加比例变址寻址执行过程示意图
2 0 0 H
4 +
DI
位移量
× 1 0 H
32H


低高
DS 段
32H
AL
2 1 2 0 4 H
1 0 0 0 HAX

2 0 0 0 HDS

第 3章 寻址方式和指令系统例 3-16 执行指令 MOV BX,LIST[ESI+EAX]的结果是将内存中从 DS,[ESI+EAX+LIST]处开始的连续两个单元内容送入 BX中。
第 3章 寻址方式和指令系统
10.带位移的基址加变址寻址由变址寄存器、基址寄存器内容和位移量一同相加而得到操作数有效地址的寻址方式称为带位移的基址加变址寻址,即
EA= [变址寄存器 ]+ [基址寄存器 ]+位移量带位移的基址加变址寻址分为 16位寻址和 32位寻址两种情况。
变址、基址寄存器的使用约定和对段寄存器的默认约定与前面所述相同。如:
MOV AX,[BX+DI+MASK] ;或 MOV AX,MASK [BX][DI]
ADD EDX,[ESI][EBP+ 0FFFF000H] ;或 ADD EDX,0FFFF000H[ESI][EBP]
以执行指令 MOV AX,MASK [BX][DI]为例,默认 DS为段基址,图
3-14是带位移的基址加变址寻址过程示意图。
第 3章 寻址方式和指令系统图 3-14 带位移的基址加变址寻址过程示意图
1 0 0 0 H
3 0 0 0 H

2 6 5 0 0 H
操作码


低高
CS 段
xx
yy


DS 段低
2 6 5 0 0 HAH AL

AX
2 5 0 0 HM A S K
0 0 H
2 5 H
2 6 5 0 1 H
2 0 0 0 0 H
DI
BX
DS


M A S K
第 3章 寻址方式和指令系统
11.带位移的基址加比例变址寻址由变址寄存器内容乘以比例因子、基址寄存器内容和位移量一同相加而得到操作数有效地址的寻址方式称为带位移的基址加比例变址寻址,即
EA= [变址寄存器 ]× 比例因子+ [基址寄存器 ]+位移量带位移的基址加比例变址寻址只有 32位寻址一种情况,这与比例变址寻址、基址加比例变址寻址方式一样,各种约定和默认情况同前所述。寻址过程中,变址寄存器内容乘比例因子的操作是在 CPU内部由硬件完成的,其他操作与图 3-14所示相同。
第 3章 寻址方式和指令系统例 3-17 INC [EDI*8][ECX+ 40] ;或 INC[ EDI*8+ ECX+ 40]
当二维数组的数组元素大小为 2,4,8字节,且数组起始地址不为 0时,适于用带位移的基址加比例变址寻址方式进行数组检索操作。
第 3章 寻址方式和指令系统
3.1.3 程序存储器寻址方式
1.段内相对寻址在此寻址方式下,转移后的指令与转移指令本身在同一代码段中,指令中的地址是一个相对于当前 IP内容的位移量,它是一个带符号数,而转移后指令的有效地址为有效地址 =(IP)+位移量其中位移量是一个字节称为短转移,转移的范围是 -128~
+127,可用 SHORT表示;位移量是两个字节称为近转移,转移范围是 32 KB,可用 NEAR表示。
第 3章 寻址方式和指令系统例 3-18 指令 JMP SHORT AIM1是短转移,SHORT表示为短转移,AIM1为目的地址;指令 JMP NEAR PTR AIM2是近转移,
NEAR表示为近转移,AIM2为目的地址。
转移后的目的地址,汇编语言在汇编时,能自动计算目的地址相对于当前 IP的内容的位移量,然后替换目的地址。此寻址方式不影响代码段寄存器 CS的值,只影响指令指针 IP的值。
第 3章 寻址方式和指令系统
2.段间直接寻址在段间直接寻址方式下,转移后的指令与转移指令本身不在同一代码段中,汇编语言在汇编时,自动将指令中的目的地址的段基址和偏移量替换掉 CS和 IP原先的内容。段间直接寻址方式也称为远转移,可用 FAR表示。
例 3-19 指令 JMP FAR PTR AIM是远转移,FAR表示为远转移,AIM为目的地址。
第 3章 寻址方式和指令系统
3.存储器间接寻址在存储器间接寻址下,目的地址不直接出现在指令中,而是存储在一个寄存器或者一个内存单元中,因此,要先使用除立即数寻址以外的任意一种数据寻址方式获取目的地址,然后判断转移到该目的地址是段内转移还是段间转移,根据判断结果按照段内相对寻址和段间直接寻址两种寻址方式的规则替换 CS,IP 的内容。
例 3-20 指令 JMP BX中的 BX为目的地址,它将替代 IP的内容,为段内转移;指令 JMP WORD PTR LIST[SI+DI]是用
DS:[SI+DI+LIST]处开始的连续两个单元内容作目的地址,并用它替代 IP的内容,为段内转移;指令 JMP EAX中的 EAX为目的地址,高 16位送 CS,低 16位送 IP,为段间转移。
第 3章 寻址方式和指令系统
3.2 指 令 系 统
80x86的指令系统可以分为以下 13个功能组。
(1) 数据传送指令;
(2) 算术运算指令;
(3) 逻辑运算与移位指令;
(4) 串操作指令;
(5) 位操作指令;
(6) 控制转移指令;
(7) 标志操作指令;
(8) 按条件设置字节指令;
(9) 操作系统型指令;
(10) 处理器控制指令;
(11) 高级语言指令;
(12) Cache管理指令;
(13) 数字处理指令。
第 3章 寻址方式和指令系统标志操作指令、栈操作的相关指令已在第 2章作过介绍。本节要介绍的指令包括:数据传送指令、算术运算指令、逻辑运算与移位指令、位操作指令、按条件设置字节指令 SET、操作系统型指令、处理器控制指令、高级语言指令,Cache管理指令和数字处理指令,串操作指令、控制转移指令和高级语言指令将在第 5章中介绍,CALL/RET指令将在第 6章中介绍,输入 /输出指令将在第 10章中介绍。
需要说明的是,汇编语言对于指令的大小写是不敏感的。
第 3章 寻址方式和指令系统
3.2.1 数据传送指令数据传送指令可分为通用传送指令、地址传送指令、输入 /
输出指令、查表转换指令 XLAT和扩展传送指令 MOVSX和 MOVZX
1.通用传送指令这类指令可分为一般传送指令 MOV、入出栈指令和交换指令
XCHG。入出栈指令包括:压栈 /弹栈指令 PUSH/POP、全部通用寄存器内容压栈和弹栈指令 PUSHA/PUSHAD及 POPA/POPAD。
第 3章 寻址方式和指令系统
1) 传送指令 MOV
格式,MOV OPRD1,OPRD2
功能:将 OPRD2的内容传送到 OPRD1中,并替换 OPRD1中原来的内容。
说明,MOV是操作码,OPRD1和 OPRD2分别是目的操作数和源操作数。源操作数可以是累加器、寄存器、存储器以及立即操作数,而目的操作数可以是累加器、寄存器和存储器。数据传送方向的示意图如图 3-15所示。
第 3章 寻址方式和指令系统图 3-15 MOV指令数据传送方向的示意图
DS
FS
CS
ES
SS
GS
段寄存器存储器
BX
SP
AX
BP
CX
SI
通用寄存器
DX
DI
立即数各寄存器之间互传第 3章 寻址方式和指令系统
(1) 除了代码段寄存器 CS和指令指针 IP以外,可在 CPU内部寄存器之间任意传送数据。
例 3-21
MOV AL,BL
MOV DL,CH
MOV AX,DX
MOV CX,BX
MOV DS,BX
MOV DX,ES
MOV BX,DI
MOV SI,BP
第 3章 寻址方式和指令系统
(2) 立即数传送至 CPU内部的通用寄存器组,给这些寄存器赋初值。
例 3-22
MOV CL,4
MOV AX,03FFH
MOV SI,057BH
第 3章 寻址方式和指令系统
(3) 除了 CS和 IP以外,可实现 CPU内部寄存器与存储器 (所有寻址方式 )之间的数据传送,传送的数据可以是一个字节、一个字或者一个双字。
例 3-23
MOV AL,BUFFER
MOV AX,[SI]
MOV EAX,[EBX]
MOV [DI],CX
MOV SI,BLOCK[BP]
MOV DS,DATA[SI+BX]
MOV DEST[BP+DI],ES
第 3章 寻址方式和指令系统但是,MOV指令不能实现存储单元之间的数据传送。若需要把地址即段内的地址偏移量为 AREA1的存储单元的内容,传送至同一段内的地址为 AREA2的存储单元中去,MOV指令不能直接完成这样的传送。若要实现两个存储单元之间的数据传送,必须借助 CPU的内部寄存器来实现。例 3-24给出了传送方法。
第 3章 寻址方式和指令系统例 3-24
MOV AL,AREA1
MOV AREA2,AL (以累加器 AL为例 )
例 3-25 若传送的数据不是 —个字节,而是一个数据块,如
100个数据,给出所描述的程序段。
分析 解决的方法有两个:
方法 1:采用与例 3-24类似的 200条指令来完成 100个数据的传送,这些指令的操作是重复的,每条指令的地址又是变化的。
第 3章 寻址方式和指令系统方法 2:为简化程序的编制,利用循环程序,方法是:每次循环都要修改源地址和目的地址,这就需要把源、目的地址分别放在两个寄存器中,用寄存器间接寻址来寻找操作数,修改了寄存器的内容,就可以实现对地址的修改。再把循环次数的控制部分考虑进去,就可得如下程序:
第 3章 寻址方式和指令系统
MOV SI,OFFSET AREA1 ;目的地址存于 SI寄存器中
MOV DI,OFFSET AREA2 ;源地址存于 DI寄存器中
MOV CX,100 ;计数器存于 CX中
AGAIN,MOV AL,[DI]
MOV [SI],AL
INC SI ;修改目的地址
INC DI ;修改源地址
DEC CX ;修改计数器的值
JNZ AGAIN
第 3章 寻址方式和指令系统说明:
① 程序段中的 AREA1和 AREA2是立即数还是存储单元地址,
汇编程序是根据对符号的定义来加以区别的;
② 指令 INC和 DEC分别是增量、减量指令,JNZ为转移指令,
将在第 5章中作介绍。
③ OFFSET AREA1是指地址单元 AREA1在段内的地址偏移量。
如前所述,在 80x86中要寻找内存操作数时,必须以段地址 (在某个段寄存器中 )加上此单元的段内地址偏移量,才能确定某一内存单元的物理地址。
上述关于 MOV指令的使用说明,是判断 MOV指令使用正确与否的依据。例 3-26均为正确使用 MOV指令的例子,而例 3-27均为使用 MOV指令不正确的例子。
第 3章 寻址方式和指令系统例 3-26 下列的指令均为正确的指令。
MOV AX,BX
MOV DS,DX
MOV AH,[CX]
MOV BX,WORD PTR [DX]
MOV AL,21H
MOV [1000H],BX
MOV [2000H],54H
第 3章 寻址方式和指令系统例 3-27 下列的指令均为错误的指令。
MOV 47H,AX ;目的地址不可为立即数
MOV CS,BX ;为 CS赋值的方法不对
MOV IP,DX ;为 IP赋值的方法不对
MOV [CX],[1000H] ;两个存储单元的数据不可直接传送
MOV DS,SS
第 3章 寻址方式和指令系统
2) 地址传送指令地址传送指令主要用于传送操作数的地址,包括:装入有效地址指令 LEA、装入 DS,ES,FS,GS,SS指令 LDS,LES,LFS、
LGS,LSS。
(1) 装入有效地址指令 LEA。
格式,LEA reg,mem
功能,将有效地址 (偏移地址 )mem而不是 mem的内容装入到一指定寄存器 reg中。
第 3章 寻址方式和指令系统说明:
① 源操作数必须是一个内存操作数,目的操作数必须是一个 16位的通用寄存器。
② 该指令通常用来建立串操作指令所必须的寄存器指针。
第 3章 寻址方式和指令系统例 3-28
LEA BX,LIST
将变量 LIST的地址偏移量部分送到 BX。
例 3-29 若 BX寄存器的内容是 0400H,SI寄存器的内容是
003CH,执行指令 LEA BX,[BX+SI+0F62H]后,BX的内容是什么?
执行这条指令是将 BX,SI的内容与 0F62H相加的结果送 BX,
即将 0400H+003CH+0F62H=139EH送 BX,所以,执行完该条指令后
(BX)= 139EH。它与 MOV BX,[BX+SI+0F62H]的区别是执行这条
MOV指令,是将 139EH表示的单元的内容送 BX。
第 3章 寻址方式和指令系统例 3-30 设 EDX= 30H,ESI= 32H,DOLLAR=7580H,执行 LEA
ECX,[ EDX] [4*ESI]DOLLAR的结果是将有效地址 7678H(= 30H
+ 4× 32H+ 7580H)传送给 ECX。
需指出的是,在很多场合下,LEA指令可以用相应的源操作数为立即数的 MOV指令代替。例如,指令 MOV BX,OFFSET
VARWORD与指令 LEA BX,VARWORD的执行效果是完全一样的。区别在于前者是用伪指令运算符 OFFSET(将在第 4章中作介绍 )取得源操作数,在程序执行前,由汇编程序汇编时赋值;而后者是在执行指令时赋值; LEA的源操作数可以用各种寻址方式,
OFFSET运算符的操作数只能是一个直接的存储器符号。例如,
指令 LEA DX,TABLE[SI]等效于下列两条指令:
MOV DX,OFFSET TABLE
ADD DX,SI
第 3章 寻址方式和指令系统
(2) 加载 DS/ES/FS/GS/SS指令 LDS/LES/LFS/LGS/LSS。
格式,OPRD1,OPRD2
LDS reg,mem
LES reg,mem
LFS reg,mem
LGS reg,mem
LSS reg,mem
这里的 mem是 32位或 48位远指针,reg是 16位或 32位任意通用寄存器。
第 3章 寻址方式和指令系统功能:这 5条指令的作用是将一个 32位或 48位的全地址指针 (包括一个 16位段选择符和一个 16位或 32位偏移值 )装入一个段寄存器和一个通用寄存器。段寄存器由指令操作码 LDS,LES、
LFS,LGS,LSS分别指定为 DS,ES,FS,GS,SS,通用寄存器由目的操作数 OPRD1指定。
第 3章 寻址方式和指令系统说明:
① 对实地址方式和虚拟 8086方式,这类指令取的是双 16位全地址指针。
例 3-31
EXDWORD DD 12345678H
LDS SI,EXDWORD
执行 LDS指令后,将高 16位 1234H送 DS,低 16位 5678H送 SI。
② 对 16位和 32位保护方式,是将选择符送操作码指定的段寄存器,有效地址送指令指定的通用寄存器。
第 3章 寻址方式和指令系统例 3-32
EXDWORD DD 12345678H ;定义偏移值
DW 0010H ;定义选择符
LDS ESI,EXDWORD
执行 LDS指令后,将低 32位偏移值 12345678H送令中指定的通用寄存器 ESI,将高 16位选择符 0010H送 DS。
③ LFS/LGS/LSS只能在 80386以上的 CPU中使用,主要用于处理不在当前数据段中的数据。
例 3-33 执行 LSS SP,LIST[DI]的结果是把 DS:[DI+LIST]
所指向单元内容前两个字节送到 SP中,接下来的两个字节送 SS中,
此时即可访问栈单元。
第 3章 寻址方式和指令系统
3) 交换指令 XCHG与字节交换指令 BSWAP
(1) 交换指令 XCHG。
格式,XCHG OPRD1,OPRD2
功能:将源操作数 OPRD2与目的操作数 OPRD1相交换。
说明:
① 交换可在通用寄存器与累加器之间,通用寄存器之间,
通用寄存器与存储器之间进行,但段寄存器不能作为一个操作数。两个操作数可以是两个寄存器操作数,或一个寄存器与一个存储器操作数,相当于三条指令,XCHG reg,reg,XCHG
mem,reg和 XCHG reg,mem。这里,reg是寄存器操作数,mem
是存储器操作数。
② OPRD1和 OPRD2可以是字节、字或者双字,但长度应相等。
第 3章 寻址方式和指令系统例 3-34
XCHG AL,CL
XCHG AX,DI
XCHG BX,SI
XCHG AX,BUFFER ;设 BUFFER为字单元
XCHG BX,DATA[SI]
XCHG AX,WORD PTR [SI]
XCHG BL,[1000H]
第 3章 寻址方式和指令系统
(2) 字节交换指令 BSWAP。
格式,BSWAP reg32
功能:将 32位通用寄存器中的双字以字节为单位进行高、
低字节交换。即对指定寄存器的 32位操作数,将位 31~ 24与位
7~ 0、位 23~ 16与位 15~ 8进行交换,也就是将第一个字节与第四个字节交换,第二个字节与第三个字节交换。
说明:
① 这是一条 80486扩展的指令。
第 3章 寻址方式和指令系统
② 可用于在两种不同结构的微处理器之间进行数据的交换。
多字节结构的数据有两种存储方式:一种是 Intel系列 CPU采用的低位结尾的内存字节排序方法,在这种方法中,多字节结构数据的高位字节存放在内存的高地址单元中;另一种是
Motorola系列 CPU采用高位结尾的内存字节排序方法,数据存放顺序正好与第一种相反。
例 3-35 设 (EAX)=12345678H,执行指令 BSWAP EAX的结果是,(EAX)=78563412H。
第 3章 寻址方式和指令系统
4) 查表转换指令 XLAT
格式,XLAT
功能:完成一个字节的查表转换。在 DS∶EBX 处建立了一个 256字节的表,用寄存器 EBX作为基址,寄存器 AL作为表的无符号下标 (即表指针 ),将 AL指向的那个字节的内容送回 AL,即
((EBX)+ (AL))→AL 。
第 3章 寻址方式和指令系统说明:
① 在使用该指令之前,存储器内需有一个代码转换表,表首地址要送到 EBX中,相对于表首的位移量送到 AL中,则转换后数据的有效地址为有效地址 =表首地址 +位移量即以 EBX寄存器内容作为表首,AL寄存器内容作为位移量所对应的表中数据送入寄存器 AL中,并替换掉 AL原先的内容。
第 3章 寻址方式和指令系统
② 该指令无显式操作数,操作数是隐含的。指令默认段是数据段 DS,而偏移量总是从寄存器 EBX中得到。
③ 指令执行前 AL是下标,执行后 AL是查表的结果。若要在其他段中查表,可加段前缀。
④ XLAT指令用于一些无规律的代码转换。
第 3章 寻址方式和指令系统图 3-16 例 3-36查表转换指令执行过程
DS 段

0 1 H
0 4 H
0 9 H
1 0 H

低高
1 9 H
2 4 H
3 1 H
4 0 H
5 1 H

BX
AL
第 3章 寻址方式和指令系统例 3-36 通过查表转换指令,求 0~ 9中任意一个数的平方。
程序段描述如下:
TAB DB 1,4,9,16,25,36,49,64,81
MOV AX,SEG TAB
MOV DS,AX
MOV BX,OFFSET TAB
MOV AL,5
XLAT
执行该程序段后,(AL)=25,执行过程见图 3-16。
第 3章 寻址方式和指令系统
5) 扩展传送指令 MOVSX和 MOVZX
格式,MOVSX OPRD1,OPRD2
MOVZX OPRD1,OPRD2
功能,MOVSX为带符号扩展传送指令,将寄存器或存储器中的 8位符号数带符号扩展成 16位或 32位,16位符号数带符号扩展成 32位,然后传送给 16位或 32位寄存器。
MOVZX为零扩展传送指令,将寄存器或存储器中的 8位无符号数通过在高位加 0扩展成 16位或 32位,16位无符号数通过加 0
扩展成 32位,然后传送给 16位或 32位寄存器。
第 3章 寻址方式和指令系统说明:
① 对带符号数补码,经 MOVSX扩展后的结果与扩展前真值是相等的,只是补码位数不同而已;经 MOVZX扩展后,无符号数的真值不变。这两条指令常被用于作除法时对被除数位数的扩展。
例如,MOVSX ECX,AL是将 AL内容带符号扩展为 32位送入 ECX;
MOVZX EAX,CX是将 CX中 16位数高位加 0扩展为 32位送 EAX。
② 扩展规则:对 MOVSX而言,若 OPRD2内容是正数,则扩展后的高 8位或 16位全填 0;若 OPRD2内容是负数,则扩展后的高 8位或 16位全填 1;对 MOVZX而言,扩展后的高 8位或 16位全填 0。
第 3章 寻址方式和指令系统
③ 在 MOVSX OPRD1,OPRD2和 MOVZX OPRD1,OPRD2中,
OPRD1可以是 16位或 32位的寄存器,而 OPRD2可以是 16位的寄存器或是 8位的存储单元,OPRD1的长度必须是 OPRD2的长度的一倍。
④ 该指令仅限于 80386以上的 CPU。
例 3-37 设 (AL)= 42H,(CX)=9687H,(DS)=2000H,
(22000H)=0A8H,分别执行,MOVSX BX,AL,MOVSX EDX,CX、
MOVSX DX,[2000H],MOVZX BX,AL和 MOVZX DX,[2000H] 5
条指令,5条指令的执行结果如表 3-1所示 (带下划线的数据是指令执行后按指令的要求应填补的内容 )。
第 3章 寻址方式和指令系统表 3-1 例 3-37执行结果示意指 令 名 称 执 行 结 果
MOVSX BX,AL (BX)=0042H=0000000001000010B
MOVSX EDX,CX (EDX)=0FFFF9687H=11111111111111111001011010000111B
MOVSX DX,[2000H] (DX)=0FFA8H=1111111110101000B
MOVZX BX,AL (BX)=0042H=0000000001000010B
MOVZX DX,[2000H] (DX)=00A8H=0000000010101000B
第 3章 寻址方式和指令系统
3.2.2 算术运算指令这类指令的源操作数与目的操作数均为二进制数,可以是 8
位,16位或 32位的带符号数或无符号数 (如果是带符号数,则最高位为符号位 ),也可以是无符号的组合、未组合 BCD码数。算术运算指令还支持十进制调整和数据宽度变换指令等。这类指令如加、减、比较等是双操作数指令、加 1或减 1指令等是单操作数指令、有符号整数乘法指令 IMUL等是三操作数指令,而十进制调整和数据宽度交换等指令则为无操作数指令。
第 3章 寻址方式和指令系统除数据宽度变换指令外,算术运算指令的操作结果一般会影响 EFLAGS寄存器中的状态标志位,主要是影响进位标志 CF、
辅助进位标志 AF、符号标志 SF、零标志 ZF、奇偶标志 PF、溢出标志 OF。
80X86提供了各种校正操作,故可进行十进制算术运算。
参与加、减运算的操作数如图 3-17所示。从图 3-17可看出,加法和减法指令的目的操作数可以是累加器、任一通用寄存器或存储单元,但不能为立即数。
第 3章 寻址方式和指令系统图 3-17 加减运算操作示意图存 储 器 通用寄存器


通用寄存器


立 即 数


立 即 数 存 储 器


通用寄存器


通用寄存器 存 储 器第 3章 寻址方式和指令系统
1.加法 /减法指令 ADD/SUB
格式,ADD OPRD1,OPRD2
SUB OPRD1,OPRD2
功能:
(1) ADD是将 OPRD2的内容与 OPRD1的内容相加,并将相加结果送到 OPRD1中,替换掉 OPRD1原来的内容,即
OPRD1←OPRD1+OPRD2 。
(2) SUB是用 OPRD1的内容减去 OPRD2的内容,并将相减结果送到 OPRD1中,替换掉 OPRD1原来的内容,即 OPRD1←OPRD1 -
OPRD2。
第 3章 寻址方式和指令系统说明:
① 实现累加器与立即数,累加器与任一通用寄存器,累加器与存储单元内容相加 /减,和 /差放在累加器中。
例 3-38
ADD AL,30
ADD AX,3000H
ADD AX,SI
ADD AL,DATA[BX]
SUB AX,BX
SUB EAX,EDX
第 3章 寻址方式和指令系统
② 实现任一通用寄存器与立即数相加 /减,与累加器或另一个通用寄存器相加 /减,与存储单元的内容相加 /减,和 /差放在寄存器中。
例 3-39
ADD BX,3FFH
ADD SI,AX
ADD DI,CX
ADD DX,DATA[BX+SI]
SUB DX,3FFH
SUB DI,AX
SUB BX,CX
SUB BX,BUF[BX+SI]
第 3章 寻址方式和指令系统
③ 实现存储器操作数与立即数相加 /减,与累加器或别的寄存器相加 /减,和 /差放至此存储单元中。
例 3-40
ADD BETA[SI],100
ADD BETA[SI],AX
ADD BETA[SI],DX
SUB BUF[SI],200
SUB BUF[SI],AX
SUB BUF[SI],DX
第 3章 寻址方式和指令系统
④ 段寄存器 CS和指令指针 IP不能作为 OPRD1。 OPRD1和
OPRD2可以是字节、字或者双字,但是长度应当相等。
⑤ 加减指令对标志位 CF,OF,PF,SF,ZF和 AF的影响如下:
X - - - X X - X - X - X
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
2.带进位的加法指令 ADC/带借位的减法指令 SBB
格式,ADC OPRD1,OPRD2
SBB OPRD1,OPRD2
功能:这两条指令与 ADD和 SUB指令类似,只是在两个操作数相加 /减时,要加 /减进位标志 CF的现行值,结果送至目的操作数:
(1) ADC是将 OPRD2的内容,OPRD1的内容和进位标志 CF内容相加,并将相加结果送到 OPRD1,即 OPRD1←OPRD1+OPRD2+CF 。
(2) SBB是用 OPRD1的内容减去 OPRD2的内容再减去进位标志 CF内容,并将相减结果送到 OPRD1,即 OPRD1←OPRD1 -OPRD2-
CF。
第 3章 寻址方式和指令系统例 3-41 指令 ADC ECX,EAX实现的功能是将 ECX内容,EAX
的内容与 CF内容相加,相加结果送到 EAX中;
指令 SBB [DI],100实现的功能是用 DS∶[DI] 所指单元的内容减去 100再减去 CF内容,结果送到 DS∶[DI] 指向的字节单元中。
说明,ADC/SBB指令主要用于多字节运算中。在 80x86中可以进行 8位运算,16位运算,也可以进行 32位运算,但是 32位二进制数的表达范围仍然是很有限的。为了扩大数的范围,仍然需要多字节运算。
第 3章 寻址方式和指令系统例 3-42 在 8086中可以进行 8位运算和 16位运算,若要进行
32位的运算,直接使用加减法指令就不行了。现有两个四字节的数相加,加法要分两次进行,先进行低两字节相加,然后再做高两字节相加。在高两字节相加时要把低两字节相加以后的进位考虑进去,就要用到带进位的加法指令 ADC。
设这两个四字节的数已分别放在自 FIRST和 SECOND开始的存储区中,每个数占四个存储单元,存放时低字节存放在低地址处,实现这两个四字节的数相加的程序段描述如下:
第 3章 寻址方式和指令系统
MOV AX,0
MOV BX,OFFSET FIRST
ADD AX,[BX]
MOV DX,OFFSET SECOND
ADD AX,[DX]
MOV THIRD,AX
MOV AX,[BX+2]
ADC AX,[DX+2]
MOV THIRD+2,AX
第 3章 寻址方式和指令系统例 3-43 在 80486中,若要完成 64位加、减法运算,可用下述程序段:
ADD EAX,ECX ; EBX∶EAX←(EBX∶EAX)+(EDX∶ECX)
ADC EBX,EDX
SUB EAX,ECX ; EBX∶EAX←(EBX∶EAX) -(EDX∶ECX)
SBB EBX,EDX
由此可看出,在 80486中,64位加、减法运算的实现,通常要综合使用 ADD/SUB和 ADC/SBB指令。
第 3章 寻址方式和指令系统
② ADC和 SBB指令对标志位的影响如下:
X - - - X X - X - X - X
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
3.加 1/减 1指令 INC/DEC
格式,INC OPRD
DEC OPRD
功能,完成对指定的操作数 OPRD加 /减 1,然后返回此操作数:
INC是将 OPRD的内容加 1,并将结果送回到 OPRD中,即
OPRD←OPRD +1 ;
DEC是将 OPRD的内容减 1,并将结果送回到 OPRD中,即
OPRD←OPRD -1。
第 3章 寻址方式和指令系统说明:
① 这是单操作数的指令,常用于在循环程序中修改地址指针和循环次数等。
例 3-44 在例 3-25中,实现 100个数据的传送时,使用了指令,INC SI和 INC DI,其功能是每传送完一个字节的数据后,
源、目的地址均要增 1,而 DEC CX是每传送完一个字节的数据后,计数器的值减 1。
第 3章 寻址方式和指令系统
② INC指令和 DEC指令对标志位的影响如下:
由此可看出,INC/DEC指令影响标志位 AF,SF,ZF,PF,OF,
但不影响 CF。所以用 INC/DEC进行循环计数时,试图以判断 CF=
1来结束循环是不行的,而且还会导致程序运行进入死循环。这点要特别注意。
③ INC/DEC指令的操作数可以是通用寄存器,也可以是存储单元。
X - - - X X - X - X - -
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
4.互换相加指令 XADD
格式,XADD OPRD1,OPRD2
功能:将 OPRD1(8位,16位或 32位寄存器或存储单元 )与
OPRD2(8位,16位或 32位寄存器 )的值相加,结果存于 OPRD1中,
同时将相加前 OPRD1的内容送到 OPRD2中。
说明:
① XADD实现的交换是在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间进行,但段寄存器不能作为一个操作数。
第 3章 寻址方式和指令系统例 3-45
XADD AL,CL
XADD AX,DI
XADD BX,SI
XADD EAX,ECX
XADD NUMBLE,EBX
第 3章 寻址方式和指令系统
② XADD是 80486新增的指令,它对标志位的影响与
ADD/SUB指令的相同,即影响的标志位有,CF,AF,SF,ZF、
PF,OF。
③ 该指令可带 LOCK前缀,前缀的概念将在 5.5节中介绍。
例 3-46 设 (CL)=13H,(AH) = 34H,执行指令
XADD CL,AH
的结果是,(CL)= 13H+34H = 47H,(AH)= 13H。
第 3章 寻址方式和指令系统
5.求补指令 NEG
格式,NEG OPRD
功能:对 OPRD取补,即相当于执行,OPRD←0 - OPRD”操作。
说明:
① NEG指令实质上执行的是减法操作。它改变的是操作数的符号,即将正数变成负数或将负数变成正数,但绝对值不变。
第 3章 寻址方式和指令系统例 3-47 若 (AH)= 13H,执行 NEG AH指令后,
(AH)=0EDH;若 (BX)= 03H,执行 NEG BX指令后,
(BX)=0FFFFDH。
② OPRD可以是字节或字操作数。
③ NEG指令对标志位的影响与 SUB指令相同,即影响的标志位有,CF,AF,SF,ZF,PF,OF。
第 3章 寻址方式和指令系统
6.比较指令 CMP
格式,CMP OPRD1,OPRD2
功能:用 OPRD1的内容减去 OPRD2的内容,结果反映在标志位上但相减结果并不送到 OPRD1。
说明:
① 累加器与立即数、任一通用寄存器或任一内存操作数相比较。
例 3-48
CMP AL,100
CMP AX,SI
CMP AX,DATA[BX]
第 3章 寻址方式和指令系统
② 任一寄存器与立即数、另一个寄存器或任一内存操作数相比较。
例 3-49
CMP BX,04FEH
CMP DX,DI
CMP CX,COUNT[BP]
第 3章 寻址方式和指令系统
③ 内存操作数与立即数、任一寄存器相比较。
例 3-50
CMP DATA,100
CMP COUNT[SI],AX
CMP POINTER[DI],BX
第 3章 寻址方式和指令系统
④ 比较指令的用途:用于比较两个数之间的关系,即两者是否相等,或两个中哪一个大。在比较指令之后,根据 ZF标志即可判断两者是否相等。若两者相等,相减以后结果为零,ZF
标志为 1,否则为 0。若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。如果是两个无符号数进行比较,则在比较指令之后,可以根据 CF标志的状态判断两数大小。方法如下:
方法 1 如果是两个无符号数进行大小的比较,在比较指令执行完后,可根据 CF标志的状态判断这两个数的大小。
第 3章 寻址方式和指令系统例 3-51 CMP AX,BX
根据 CMP指令的功能,应做 AX-BX的操作。若结果没有产生借位 (CF=0),则 AX≥BX ;若产生了借位 (CF=1),则 AX<BX。
方法 2 带符号数的比较。此时无法根据某一标志或 SF标志或 CF标志来判断两数的大小。例如,在例 3-51中,令 AX=-2,
BX=127,执行 CMP AX,BX,即进行 -2与 127的比较,这里 -2<127。
比较指令使两数相减:
11111110 (-2)
- 01111111 (127)
01111111
第 3章 寻址方式和指令系统结果的符号为 0。若用 SF标志判别两数大小,则认为两数相减后结果为正,从而得出 -2>127的错误结果。这就是说,在带符号数的比较中,根据单一标志 (或 SF标志或 CF标志 )来判断两数的大小是不行的。实际上,对两个带符号数作减运算时,有可能产生溢出,使 SF标志或 CF标志不能正确地反映运算的真实结果。那么,应如何判断两个带符号数的大小呢? 可作如下分析:
在 CMP AX,BX中,若 AX与 BX中的数同符号,即 AX>0,BX>0或
AX<0,BX<0,则 AX-BX不会产生溢出,此时可用 SF标志判断两数大小,即 SF=0,则 AX>BX; SF=1则 AX<BX。若 AX与 BX中的数不同符号,即 AX>0,BX<0或 AX<0,BX>0,那么 AX-BX则可能会产生溢出。
若 AX-BX 没有产生溢出,则仍然可用 SF标志判断两数大小,符合上述规律;但是若 AX-BX产生了溢出,则是当 SF=1时,AX>BX;
SF=0时 AX<BX。
第 3章 寻址方式和指令系统综上所述,可得如下结论 (设待比较的两个数分别是 A,B):
当没有溢出 (OF=0)时,若 SF=0,则 A>B
若 SF=1,则 A<B
当产生溢出 (OF=1)时,若 SF=0,则 A<B
若 SF=1,则 A>B
进而:若 OF“异或,SF=0,则 A>B
若 OF“异或,SF=1,则 A<B
正是考虑了上述的情况,在 80x86转移指令中,设置了两组转移指令,分别用于无符号数比较和有符号数的比较。转移指令将在第 5章中讲述。
第 3章 寻址方式和指令系统例 3-52 编制一求最大值的汇编程序段。
分析:若自 BLOCK开始的内存缓冲区中,有 100个带符号数,
若要找出其中的最大值,把它存放到 MAX单元中。可先把数据块的第一个数取至 AX中,然后从第二个存储单元开始,依次与 AX中的内容相比较,若 AX中的值大,接着进行下一次比较;若 AX中的值小,则把内存单元的内容送至 AX中。这样,经过 99次比较,在
AX中的必然是数据块中的最大值,再把它存至 MAX单元中。
因为要进行 99次比较,应使用循环程序。在每一循环中要用比较指令,然后用转移指令来判断大小,循环开始前要置初值。
第 3章 寻址方式和指令系统求最大值的程序段描述如下:
MOV BX,OFFSET BLOCK ;将数据区中的第一个数的地址送 BX
MOV AX,[BX] ;将要比较的第一个数送 AX
INC BX ;地址增 1
INC BX ;地址再增 1
MOV CX,99 ;比较的循环次数送 CX
AGAIN,CMP AX,[BX] ;比较两数,另一比较的数在 BX指示的单元中
JG NEXT ; AX中的数大
MOV AX,[BX] ; [BX]中的数大,当前最大数送 AX
NEXT,INC BX ;地址增 1
INC BX ;地址再增 1
DEC CX ;循环次数减 1
JNE AGAIN ;比较未结束,进行比较
MOV MAX,AX ;为 0,AX中的数最大,送 MAX单元
HLT
第 3章 寻址方式和指令系统
7.比较交换指令 CMPXCHG
格式,CMPXCHG OPRD1,OPRD2
功能:先将目的操作数 OPRD1与累加器 AL,AX或 EAX的内容相比较,若相等则将源操作数 OPRD2存于 OPRD1中,否则将 OPRD1
或者送到 AL或者送到 AX或者送到 EAX。这里累加器是隐含的第三个操作数。
第 3章 寻址方式和指令系统例 3-53
CMPXCHG CX,DX ; CX与 AX比较,若 (CX)=(AX),
CX←(DX),否则 AX←(CX)
说明:
① CMPXCHG是 80486新增的指令。
② CMPXCHG指令对标志位的影响与 ADD/SUB的相同,即影响的标志位,CF,AF,SF,ZF,PF,OF。
例 3-54 设 (AL)=79H,(CH) = 13H,(DL) = 22H,执行指令 CMPXCHG CH,DL的结果是,(AL)= 13H,(CH) = 13H,(DL)
= 22H。
第 3章 寻址方式和指令系统
8.无符号 /带符号乘法指令 MUL/IMUL
格式,MUL OPRD
IMUL OPRD
IMUL OPRD1,OPRD2
IMUL OPRD1,OPRD2,OPRD3
第 3章 寻址方式和指令系统功能:
MUL:实现两个无符号数相乘,AL,AX或 EAX的内容和 OPRD
的内容是两个无符号数,且如果 OPRD长度为 8位,则与 AL内容相乘,相乘结果送到 AX中;如果 OPRD长度为 16位,则与 AX内容相乘,相乘结果送到 DS,AX中;如果 OPRD长度为 32位,则与 EAX内容相乘,相乘结果送到 EDX,EAX中。
IMUL:实现了两个带符号数相乘,AL,AX或 EAX的内容和
OPRD的内容是两个带符号数,操作方法与 MUL指令相同。
第 3章 寻址方式和指令系统说明:
① 32位乘法指令只能用于 80386以上 CPU; OPRD只能是寄存器或者存储器操作数,不能是立即数。
② MUL指令用于完成无符号整数乘法,被乘数隐含在 A累加器 (AL,AX或 EAX)中,操作数 OPRD1为乘数。字节运算时乘积返回到 AX,字运算时乘积返回到 DX,AX,双字运算时乘积返回到 EDX,EAX。
第 3章 寻址方式和指令系统例 3-55
MUL CL ; AX←(AL)*(CL)
MUL BX ; DX,AX←(AX)*(BX)
MUL BYTE PTR[DI] ; AL中的数与 (DI)所指字节单元数相乘,乘积在 AX中
MUL DWORD[ESI] ; EAX中 32位数与 (ESI)
所指双字单元中的 32位数相乘,;结果在 EDX,EAX中第 3章 寻址方式和指令系统
③ IMUL指令有单操作数、双操作数、三操作数三种格式,
即,IMUL OPRD,IMUL OPRD1,OPRD2和 IMUL OPRD1,OPRD2,
OPRD3,用于完成有符号数的乘法运算。不同格式下,被乘数、
乘数和乘积的存放,约定如下:
(i) 在单操作数格式下,被乘数是累加器 (AL,AX或 EAX),
乘以指定的操作数;字节运算时乘积返回到 AX,字运算时乘积返回到 DX,AX,双字运算时乘积返回到 EDX,EAX。
(ii) 在双操作数格式下,用 OPRD1乘以 OPRD2,返回的积存放在 OPRD1指定的寄存器中。
(iii) 在三操作数格式下,用 OPRD2乘以 OPRD3,返回的积存放在 OPRD1指定的寄存器中。
第 3章 寻址方式和指令系统例 3-56
IMUL DL ; AX←(AL)*(DL)
IMUL EBX ; EDX,EAX← (EAX)*(EBX)
IMUL BL,CH ; BL←(BL)*(CH)
IMUL BL,CH,8 ; BL←(CH)*8
第 3章 寻址方式和指令系统
④ 影响的标志位,CF,AF,SF,ZF,PF,OF。
MUL指令和 IMUL指令对标志位的影响如下:
如果乘积的高阶字节、字或双字是 0,则 CF和 OF清 0,否则置 1。
例 3-57 执行 MUL DX是将 AX内容与 DX内容相乘,相乘结果送到 DX∶AX 中。执行 IMUL [SI]是将 AL内容与 DS∶[SI] 相乘,
相乘结果送到 AX中。
X - - - U U - U - U - X
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
9.无符号 /带符号除法指令 DIV/IDIV
格式,DIV OPRD
IDIV OPRD
功能:
(1) DIV 无符号数除法指令,OPRD内容作为除数,如果
OPRD长度为 8位,则 AX内容作为被除数,运算后商送到 AL中,余数送到 AH中;如果 OPRD长度为 16位,则 DX,AX内容作为被除数,
运算后商送到 AX中,余数送到 DX中;如果 OPRD长度为 32位,则
EDX∶EAX 内容作为被除数,运算后商送到 EAX中,余数送到 EDX中。
(2) IDIV 带符号数除法指令,操作方法与 DIV 指令相同。
第 3章 寻址方式和指令系统说明:
① 32位除法只能用于 80386以上的 CPU。
② OPRD只能是寄存器或存储器操作数,不能是立即数。作除法运算时,除数由 OPRD指定;被除数由 A累加器隐含决定,
OPRD为字节数据时使用 AX,OPRD为字数据时使用 DX,AX,OPRD
为双字数据存入时使用 EDX∶EAX 。商则根据上述数据宽度分别返回到 AL,AX或 EAX中,余数则相应存入 AH,DX或 EDX中。
第 3章 寻址方式和指令系统例 3-58
DIV CL ; (AX)/(CX),商在 AL中,余数在 AH中
DIV WORD PTR[SI] ; (DX∶AX) 中的 32位数除以 (SI)所指字单元中的 16位数;商在 AX中,余数在 DX中
IDIV ECX ; (EDX∶EAX)/(ECX),商在 EAX中,余数在 EDX中若除数为 0或商过大 (超过保存商的累加器的容量 )时,将产生 0号异常。
第 3章 寻址方式和指令系统
③ 无符号数除法,商和余数均为无符号数;带符号数除法,
商和余数均为带符号数。
④ 若被除数长度不够,则需使用符号位扩展指令进行扩展。
⑤ 乘法、除法指令的执行周期较长,影响代码执行效率,
因此常用循环相加、循环相减的方法间接实现乘法、除法功能,
以提高代码执行效率。
第 3章 寻址方式和指令系统
⑥ DIV和 IDIV指令对标志位的影响如下:
即影响的标志位,CF,AF,SF,ZF,PF,OF。
U - - - U U - U - U - U
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
10.符号位扩展指令 CBW/CWD/CDQ/CWDE
格式,CBW
CWD
CDQ ;均无显式操作数
CWDE
第 3章 寻址方式和指令系统功能:
(1) CBW,CWD,CWDE和 CDQ指令用于将源操作数的宽度加倍,又称数据宽度变换指令。 CBW指令称为字节扩展成字指令,
CWD指令称为字扩展成双字指令,CDQ指令称为双字节扩展成四字指令,CWDE指令称为 AX符号位扩展到 EAX指令。
(2) CBW指令将 AL中的 8位有符号数带符号扩展为 16位放入
AX中。 AH中各位取与 AL中数的符号位相同的值,即对负数进行 1
扩展,正数进行 0扩展。
(3) CWD指令将 AX中的 16位有符号数带符号扩展成 32位,
扩展后的高 16位存放在 DX中,各位值与原 AX中符号位相同。
第 3章 寻址方式和指令系统
(4) CDQ指令将 EAX中的 32位有符号数带符号扩展为 64位数,扩展后的高 32位放在 EDX中,且都与原符号位值相同。
(5) CWED指令将 AX中的 16位有符号数带符号扩展成 32位存放在 EAX中,高 16位与原符号位值相同。
第 3章 寻址方式和指令系统说明:
(1) 符号位扩展指令常被用于有符号数除法运算时对被除数位数的扩展。当两个有符号的字节 /字 /双字数相除时,必须先执行符号位扩展指令,产生一个双倍长度的被除数,否则不能正确执行除法操作。
第 3章 寻址方式和指令系统
(2) 扩展规则:
① CBW 如果 AL内容为正数,则 AL内容不变,AH各位全填 0;
如果 AL内容为负数,则 AL内容不变,AH各位全填 1。
② CWD 如果 AX内容为正数,则 AX内容不变,DX各位全填 0;
如果 AX内容为负数,则 AX内容不变,DX各位全填 1。
③ CDQ 如果 EAX内容为正数,则 EAX内容不变,EDX各位全填 0;如果 EAX内容为负数,则 EAX内容不变,EDX各位全填 1。
④ CWDE 如果 AX内容为正数,则 EAX31~ EAX16= 0,AX内容不变;如果 AX内容为负数,则 EAX31~ EAX16= 0FFFFH,AX内容不变。
第 3章 寻址方式和指令系统
(3) 无符号数的扩展使用 MOVZX指令。
(4) 这四条指令均无操作数,32位符号位扩展只能用于
80386以上的 CPU。
(5) 符号位扩展指令 CBW/CWD/CWDE/CDQ执行后对标志位无影响。
第 3章 寻址方式和指令系统例 3-59 执行下述 4个程序段,给出执行完指令 CBW,CWD、
CWDE和 CDQ后的结果。
① MOV AX,5 ② MOV AX,5
CBW CWD
MOV AL,80H MOV AX,9098H
CBW CWD
③ MOV EAX,5 ④ MOV AX,5
CDQ CWDE
MOV EAL,909880000H MOV AX,9098H
CDQ CWDE
第 3章 寻址方式和指令系统表 3-2 例 3-59指令执行结果示意序 号 指 令 名 称 执 行 结 果

MOV AX,5
CBW
MOV AL,80H
CBW
执行完第一个 CBW后 (AH)=0,AL值不变;
执行完第二个 CBW后 (AH)=0FFH,AL值不变

MOV AX,5
CWD MOV AX
,9098H
CWD
执行完第一个 CWD后 (DX)=0,AX值不变;
执行完第二个 CWD后 (DX)=0FFFFH,AX值不变

MOV EAX,5
CDQ
MOV EAL,909880000H
CDQ
执行完第一个 CDQ后 (EDX)=0,EAX值不变;
执行完第二个 CDQ后 (EDX)=0FFFFFFFFH,EAX值不变

MOV AX,5
CWDE
MOV AX,9098H
CWDE
执行完第一个 CWDE后 (EAX31~ EAX16)= 0,AX值不变;
执行完第二个 CWDE后 (EAX31~ EAX16)= 0FFFFH,
AX值不变第 3章 寻址方式和指令系统例 3-60 要求编写带符号数 789AH与 4321H作除运算的程序段 (被除数是 789AH)。
分析:设被除数、除数存放在数据段中起始地址为 BUFFER
的区域中,按低字节存储在低地址单元、高字节存储在高地址单元的方式进行存储,并在其后保留 4个字节供存放商和余数用。
程序段描述如下:
第 3章 寻址方式和指令系统
MOV BX,OFFSET BUFFER
MOV AX,[BX] ;将被除数送至 AX
CWD ;被除数先带符号扩展至 32位
IDIV 2[BX] ;执行带符号除法,商存 AX,余数存 DX中
MOV 4[BX],AX ;保存商到 (BUFFER+ 4)字单元
MOV 6[BX],DX ;保存余数到 (BUFFER+ 6)字单元如果不是带符号数而是无符号数相除,则被除数扩展应使用指令,MOVZX或用 MOV指令将被除数高半部分直接赋 0值,即
MOV DX,0。
第 3章 寻址方式和指令系统
3.2.3 十进制算术运算指令在计算机中,十进制数据是用 BCD码表示的,它分为组合
BCD码和未组合 BCD码,但是 CPU的算术运算指令仅适用于二进制数,因此 CPU又提供了一些十进制调整指令,用于将运算后的二进制数调整为 BCD码。
1,AAA/AAS/AAM/AAD 未组合 BCD码加法 /减法 /乘法 /除法调整指令格式,AAA
AAS
AAM
AAD
第 3章 寻址方式和指令系统功能:
(1) AAA:未组合的 BCD码加法调整指令 AAA,是将 AL中两个未组合 BCD码的二进制加法结果,调整为未组合 BCD码,放在二进制加法指令后。
(2) AAS:未组合的 BCD码减法调整指令 AAS,是将 AL中两个未组合 BCD码的二进制减法结果,调整为未组合 BCD码,放在二进制减法指令后。
(3) AAM:未组合的 BCD码乘法调整指令 AAM,是将 AL中的内容调整为 16位的未组合 BCD码,并送到 AX中,放在二进制乘法指令后。
(4) AAD:未组合的 BCD码除法调整指令 AAD在二进制除法指令前出现,对 AX中的未组合 BCD码调整,调整结果送到 AL中,并将 AH各位填 0。
第 3章 寻址方式和指令系统说明:
(1) 调整方法:
① AAA指令要紧跟在加法指令之后使用。它是对在 AL中的由两个未组合的十进制数相加后的结果进行校正,产生一个未组合的十进制和放在 AX中。调整的方法是:如果 AL低四位的十六进制表示大于 9或者 AF=1,则将 AL内容加上 06H,然后将 AL高四位清 0,AH内容加 1,并将 AF,CF置 1;否则仅将 AL 高四位清 0,
并将 AF,CF清 0,即调整的操作如下:
若 (AL & 0FH)>9或标志 AF=1,则
AL←AL+6,AH←AH+1,AF←1,CF←AF,AL←AL & 0FH
第 3章 寻址方式和指令系统例 3-61 寄存器 AL,BL中各存有两个未组合的十进制数 08和
07。若要求其和,可写出如下的程序段:
ADD AL,BL
AAA
即直接使用 ADD指令相加,后紧跟着一条校正指令 AAA,在 AX
中就得到一未组合的十进制和。实际上 ADD AL,BL是按二进制规则进行的,如:
0 0 0 0 1 0 0 0
+ 0 0 0 0 0 1 1 1
0 0 0 0 1 1 1 1
第 3章 寻址方式和指令系统相加的结果也是二进制的 0FH。由于 0FH>9,故应使用 AAA指令对结果进行调整。调整的结果使 AH=01,AL=05,即为未组合的十进制和。
由于 BCD码是取二进制 8421码的前 10个数字 0000~ 1001表示十进制 0~ 9的,按二进制规则 9(1001)加 1应是 A(1010),而按
BCD码的十进制规则 9加 1应是 10(0001 0000),而这中间相差 6。
所以当 AL的低四位大于 9或辅助进位为 1时,用加 6的方法强制跳过二进制数字 1010~ 1111(即 A~ F)而成为 0001 0000即可。
第 3章 寻址方式和指令系统
② AAS指令应紧跟在减法指令之后使用,与 AAA指令类似,
能把在 AL中的由两个未组合的十进制数相减的结果校正成一个正确的未组合的十进制数,差存储在 AL中。调整的方法是:如果 AL低四位的十六进制表示大于 9或者 AF=1,则将 AL内容减去
06H,然后将 AL高四位清 0,AH内容减 1,并将 AF,CF置 1;否则仅将 AL 高四位清 0,并将 AF,CF清 0。调整的操作如下:
若 (AL & 0FH)>9或标志 AF=1,则
AL←AL -6,AH←AH -1,AF←1,CF←AF,AL←AL & 0FH
③ AAM 用 AL内容除以 0AH,商送到 AH中,余数送到 AL中。
④ AAD 用 AH内容乘以 0AH再加上 AL内容所得结果,送到 AL
中,然后将 AH各位填 0。
第 3章 寻址方式和指令系统
(2) 对标志位的影响见表 3-3。
表 3-3 BCD码调整指令对标志位的影响第 3章 寻址方式和指令系统例 3-63
MOV AL,06H
MOV DL,08H
MUL ; (AL) = 30H = 00110000B
AAM ;调整后,(AX) = 0408H = 0000010000001000B
第 3章 寻址方式和指令系统例 3-64
MOV AX,0408H
MOV DL,09H
AAD ;调整后,(AL) = 30H = 00110000B,(AH) = 00H
DIV ; (AL) = 05H = 00000101B,(AH) = 03H = 00000011B
第 3章 寻址方式和指令系统
2.十进制加法 /减法调整指令 DAA/DAS
格式,DAA
DAS
功能:
(1) DAA指令对在 AL中的两个组合的十进制数相加的结果进行校正,得到正确的组合的十进制结果在 AL中。 DAA指令要紧跟在加法指令之后使用,在二进制加法指令后出现。
(2) DAS指令与 DAA指令相似,对在 AL中的由两个组合的十进制数相减的结果校正成正确的组合的十进制数,差存储在 AL
中。 DAS指令要紧跟在减法指令之后使用,在二进制减法指令后出现。
第 3章 寻址方式和指令系统说明:
(1) 调整方法:
① DAA:如果 AL低四位的十六进制表示大于 9或者 AF=1,
则将 AL内容加上 06H,并将 AF置 1;如果 AL高 4位的十六进制表示大于 9或者 CF=1,则将 AL内容加上 60H,并将 CF置 1,其他情况 AL
内容不变。调整的操作如下:
若 (AL & 0FH)>9或标志 AF=1,则
AL←AL+6,AF←1
若 (AL & 0F0H)>90H或标志 CF=1 则
AL←AL+60H,CF←1
第 3章 寻址方式和指令系统
② DAS 如果 AL低 4位的 16进制表示大于 9或者 AF=1,则将
AL内容减去 06H,并将 AF置 1;如果 AL高 4位的 16进制表示大于 9
或者 CF=1,则将 AL内容减去 60H,并将 CF置 1,其他情况 AL内容不变。调整的操作如下:
若 (AL & 0FH)>9或标志 AF=1,则
AL←AL -6,AF←1
若 (AL & 0F0H)>90H或标志 CF=1,则
AL←AL -60H,CF←1
第 3章 寻址方式和指令系统
(2) DAA指令必须紧跟在指令 ADD/ADC之后; DAS指令必须紧跟在指令 SUB/SBB之后。
(3) 对于组合 BCD码,没有乘除法调整指令。
(4) 对标志位的影响见表 3-3。
例 3-64 设累加器 AL存放的组合的 BCD码,(AL)= 26H,实现 AL与 49H相加的正确结果,如下述程序段所描述:
MOV AL,26H
ADD AL,49H
DAA
执行结果,(AL) = 75H。
第 3章 寻址方式和指令系统例 3-65 内存中以 FIRST和 SECOND开始的单元中分别存放着两个 16位组合的十进制 (BCD码 )数,低位在前。编程序求这两个数的组合的十进制和,并存到以 THIRD开始的单元。
分析,16位组合的十进制数占用 8个字节,可用循环程序重复加 8次,但要注意字节间进位,同时要对加的结果进行调整。实现上述要求的程序段描述如下:
第 3章 寻址方式和指令系统
MOV BX,OFFSET FIRST
MOV SI,OFFSET SECOND
MOV DI,OFFSET THIRD
MOV CX,8
CLC
AGN,MOV AL,[BX]
ADC AL,[SI]
第 3章 寻址方式和指令系统
INC BX
ADC BYTE PTR[DX],0
DAA
MOV [DI],AL
INC SI
INC DI
DEC CX
JNZ AGN
HLT
第 3章 寻址方式和指令系统
3.2.4 逻辑运算指令本组指令可以对数据位进行操作,因此也称为位操作指令,
除了 NOT指令外,其余指令均会影响某些标志位。
1.与 /或 /非 /异或指令 AND/OR/NOT/XOR
格式,AND OPRD1,OPRD2
OR OPRD1,OPRD2
NOT OPRD
XOR OPRD1,OPRD2
第 3章 寻址方式和指令系统功能:
(1) AND:将 OPRD1内容和 OPRD2内容按位进行逻辑与运算,
即只有相,与,的两位全为 1,,与,的结果才为 1;否则,与,
的结果为 0。,与,以后的结果送回 OPRD1中。
(2) OR:将 OPRD1内容和 OPRD2内容按位进行逻辑或运算,
即进行,或,的两位中的任意一位为 1或两位都为 1时,,或,
的结果为 1;否则为 0。,或,以后的结果送回 OPRD1中。
(3) NOT:将 OPRD内容按位取反,并将运算结果送到 OPRD中。
(4) XOR:将 OPRD1内容和 OPRD2内容按位进行逻辑异或运算,
即进行,异与,的两位为 1或为 0,,异或,的结果为 1;否则为
0。,异或,以后的结果送回 OPRD1中。
第 3章 寻址方式和指令系统说明:
(1) AND,OR和 XOR指令执行按位逻辑,与,,,或,和
,异或,功能。它们均为双操作数指令,源操作数 OPRD2可以是立即数、寄存器操作数,也可以是存储器操作数;目的操作数
OPRD1可以是寄存器操作数,也可以是存储器操作数,但两操作数宽度必须相等 (同为字节、字或双字 ),执行结果存入 OPRD1中。
NOT是单操作数,OPRD可以是字节、字或双字操作数。
第 3章 寻址方式和指令系统
(2) AND指令的使用举例。
例 3-66
AND AL,0FH
AND AX,BX
AND SI,BP
AND AX,DATA_WORD
AND DX,BUFFER[SI+BX]
AND DATA_WORD,00FFH
AND BLOCK[BP+DI],DX
第 3章 寻址方式和指令系统
“与,指令可用于:
① 某一个操作数,自己和自己相,与,,操作数不变,但可以使进位标志 CF清 0。
② 使一个操作数中的若干位维持不变,而若干位清为 0的场合。这时,要维持不变的这些位与,1”相,与,;而要清 0的这些位与,0”相,与,。例如,AND AL,0F0H就是将 AL的低 4位清 0。
第 3章 寻址方式和指令系统
(3) OR指令的使用举例。
例 3-67
OR AL,30H
OR AX,00FFH
OR BX,SI
OR BX,DATA_WORD
OR BUFFER[BX],SI
OR DUFFER[BX+SI],8000H
第 3章 寻址方式和指令系统
“或,指令可用于:
① 一个操作数自身相,或,,不改变操作数的值,但可使进位标志 CF清 0。
② 如果要求使一个操作数中的若干位维持不变,而另外若干位为 1的场合。这时,要维持不变的这些位与,0”相,或,;
而要置为,1”的这些位与,1”相,或,。
③ 利用,或,运算,可以对两个操作数进行组合,也可以对某些位置位。
第 3章 寻址方式和指令系统
(4) XOR指令的使用举例。
例 3-68
XOR AL,0FH
XOR AX,BX
XOR DX,SI
XOR CX,COUNT_WORD
XOR BUFFER[BX],DI
XOR BUFFER[BX+SI],AX
第 3章 寻址方式和指令系统
“异或,指令可用于:
① 当一个操作数自身做,异或,运算时,由于每一位都相同,则,异或,结果必为 0,且使进位标志 CF也为 0,这是使操作数的初值置为 0的常用的有效的方法。如:
XOR AX,AX
XOR SI,SI
可使 AX和 SI清 0。
② 若要求一个操作数中的若干位维持不变,而若干位取反,
可用,异或,运算来实现。要维持不变的这些位与,0”相,异或,;而要取反的那些位与,1”相,异或,。
第 3章 寻址方式和指令系统
③ XOR指令在代码转换中非常有用,例如,将 ASCII码转换为未组合 BCD码,可用
MOV AL,'8' ; ASCII码送 AL,(AL)= 38H
AND AL,0FH ;执行后,(AL)= 08H
将未组合 BCD码转换为 ASCII码,可用
MOV AL,8 ;未组合 BCD码的 8送 AL,(AL)= 08H
OR AL,30H ;执行后,(AL)= 38H
第 3章 寻址方式和指令系统
④ 使用 XOR指令可对寄存器中的某几位求反,而保持另外几位值不变。例如,对 AL的高 4位求反,低 4位不变,可用
MOV CL,0F0H
XOR AL,0
第 3章 寻址方式和指令系统
(5) 总结前面所讲述过的给某一个寄存器清 0的方法,共有如下 3种:
① 使用 MOV直接给某个寄存器送 0值,如给 BX送 0值,可用指令,MOV BX,0;
② 用 SUB指令产生 0值,如寄存器 BX需要 0值,可用指令:
SUB BX,BX,即需要 0值的寄存器自身作减法运算;
③ 使用 XOR指令,即 XOR BX,BX。
第 3章 寻址方式和指令系统
(6) NOT指令对标志位无影响,AND,OR和 XOR指令对标志位的影响相同,即例 3-69 设 (AL)=36H,(BL) = 4AH,(DH) = 0F6H,执行下列程序段后,寄存器 AL与 DH的值是多少?
AND AL,0FH ; (AL)= 06H
OR AL,0F0H ; (AL)= 0F6H
XOR AL,DH ; (AL)= 00H
NOT DH ; (DH)= 09H
0 - - - X X - U - X - 0
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
2.逻辑测试指令 TEST
格式,TEST OPRD1,OPRD2
功能:将 OPRD1内容和 OPRD2内容按位进行逻辑与运算,结果反映在标志位上,但并不送回,即该指令能完成与 AND指令相同的操作,但 TEST指令不改变操作数的值。
说明:
① 源操作数 OPRD2可以是立即数,也可以是寄存器或存储器操作数;目的操作数 OPRD1只能是寄存器操作数。
第 3章 寻址方式和指令系统
② TEST指令,通常是在不希望改变原有的操作数的情况下,用来检测某一位或某几位的条件是否满足。编程时常与条件转移指令一起使用,可在 TEST指令后面加上条件转移指令,
来测试操作数某位是否为 1或者是否为 0。
第 3章 寻址方式和指令系统例 3-70 若要检测 AL中的最低位是否为 1,为 1则转移,可用
TEST AL,01H
JNZ THERE
THERE:
若要检测 CX中的内容是否为 0,为 0则转移,可用
TEST CX,0FFFFH
JZ THERE
THERE:
与 AND指令的区别,AND指令将运算结果保存到 OPRD1中,并设置相应标志位;而 TEST指令不保存运算结果,仅设置相应标志位。


第 3章 寻址方式和指令系统
③ TEST指令在编制输入 /输出程序时,十分有用。
例 6-71 要读打印机状态口 (3BDH),判断打印机忙否,可用如下的程序段:
MOV DX,3BDH
PRTBUSY,IN AL,DX ;读打印机状态
TEST AL,80H
JZ PRTBUSY ;最高位为 0表示打印机正忙;继续读状态判断最高位为 1,顺序执行第 3章 寻址方式和指令系统
④ 对标志位的影响如下:
例 3-72
MOV AL,[SI] ;将要测试的 DS,[SI]单元内容送入 AL
TEST AL,80H ;测试 AL最高位是否为 0
JZ NEXT ; AL最高位是 0,则下一条要执行的指令转到 NEXT标号处; AL最高位是 1,则指令继续向下顺序执行
0 - - - X X - U - X - 0
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
3.位测试指令 BT/BTS/BTR/BTC
格式,BT OPRD1,OPRD2
BTS OPRD1,OPRD2
BTR OPRD1,OPRD2
BTC OPRD1,OPRD2
BT称为位测试指令,BTS称为位测试置 1指令,BTR称为位测试清 0指令,BTC称为位测试求反 (或求补 )指令。
第 3章 寻址方式和指令系统功能:这 4条指令的相同功能是对 OPRD1指定的 16位或 32位位串数据的指定位 (OPRD2作为位串下标 )进行测试操作并送入 CF,
对 BTS,BTR和 BTC指令来讲,将所测试位分别置 1、清 0或变反,
具体地讲就是:
BT 用 OPRD2指定 OPRD1要测试的位,并将测试位送到 CF中,
OPRD1内容不变。
BTS 用 OPRD2指定 OPRD1要测试的位,并将测试位送到 CF中,
同时将测试位置 1。
BTR 用 OPRD2指定 OPRD1要测试的位,并将测试位送到 CF中,
同时将测试位清 0。
BTC 用 OPRD2指定 OPRD1要测试的位,并将测试位送到 CF中,
同时将测试位取反。
第 3章 寻址方式和指令系统说明:
① 这 4条指令是 80386 CPU新增指令。
② 源操作数 OPRD2可以是寄存器操作数和立即数,而目的操作数 OPRD1可以是寄存器和存储器操作数。
③ 如果 OPRD1指定的位串是 16位,OPRD2的取值范围为 0~ 15;
如果 OPRD1指定的位串是 32位,OPRD2的取值范围则为 0~ 31。
OPRD1测试位的指定方法:记 OPRD1最低位为 0,由右向左依次加 1,
当计数值与 OPRD2内容相同时停止计数,此时的数据位即为测试位。
第 3章 寻址方式和指令系统
④ 位测试指令对标志位的影响:
例 3-73 设 (AL)= 0A8H = 10101000B,执行指令及其结果如下所示:
BT AL,2 ; (CF) = 0,(AL)= 0A8H = 10101000B
BTS AL,4 ; (CF) = 0,(AL)= 0B8H = 10111000B
BTR AL,7 ; (CF) = 1,(AL)= 38H = 00111000B
BTC AL,0 ; (CF) = 0,(AL)= 39H = 00111001B
U - - - U U - - - U - X
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
4.位扫描指令 BSF/BSR
格式,BSF OPRD1,OPRD2
BSR OPRD1,OPRD2
BSF称为向前位扫描指令,BSR称为向后位扫描指令。
功能,(1) BSF是从右向左按位依次扫描 OPRD2中第一个是 1
的位,将此位的位号送到 OPRD1中,即对 OPRD2指定的 16位或 32位位串从低位 (b0)到高位 (b15或 b31)进行扫描,并将扫描到的第一个,1”位的下标存入 OPRD1指定的寄存器中。如果位串中所有位均为 0,则将 ZF标志位置 1,否则将 ZF清 0。
(2) BSR是从左向右按位依次扫描 OPRD2中第一个是 1的位,
将此位的位号送到 OPRD1中,即 BSR与 BSF相同,只是从高位到低位扫描。
第 3章 寻址方式和指令系统说明:
① 这两条指令是 80386 CPU新增指令。
② 源操作数 OPRD2可以是寄存器和存储器操作数,而目的操作数 OPRD1只能是寄存器操作数。
③ 位扫描指令对标志位的影响如下:
例 3-74 设 (AX)= 425BH = 0100001001011010B,执行指令及其结果如下所示:
BSF BX,AX ; (BX)= 0001H
BSR CX,AX ; (CX)= 000EH
U - - - U X - - - U - U
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
5.算术 /逻辑左移指令 SAL/SHL
格式,SAL/SHL OPRD1,OPRD2
功能:两条指令都是将 OPRD1向左移位,移动的次数由
OPRD2决定,OPRD2可以是 8位立即操作数,也可以是 CL寄存器的内容; OPRD1可以是寄存器操作数也可以是存储器操作数。操作数每左移一位在最低有效位补 0,把最高有效位移放进 CF,如图
3-18所示。
第 3章 寻址方式和指令系统图 3-18 算术 /逻辑左移指令操作示意图
CF M S B O P R D 1 L S B
0
第 3章 寻址方式和指令系统说明:
① SAL是算术左移指令,SHL是逻辑左移指令,这两条指令的功能实质上是相同的。
② 80386或 80486移位次数不允许大于 31。如果移位次数大于 31,那么只使用后 5位移位计数。 8086用立即数时只能是移一位,移位多于一位时使用 CL,在移位次数为 1的情况下,如果移位后 CF与结果的最高位相等,则 OF= 0,否则 OF= 1,在移位次数不为 1时,OF不确定。
③ 左移指令常用于实现乘以 2n的操作。
第 3章 寻址方式和指令系统例 3-75 若将 AX中的无符号数乘 8,可使用如下指令:
MOV AX,12H
MOV CL,3
SAL AX,CL ;每左移一位,相当于对 AX的内容乘以 2
(或是,SHL AX,CL)
④ SAL/SHL指令对标志位的影响如下:
X - - - X X - - - X - X
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统
6.算术 /逻辑右移指令 SAR/SHR
格式,SAR/SHR OPRD1,OPRD2
功能,SAR是算术右移指令,用于对有符号数右移; SHR是逻辑右移指令,用于对无符号数右移。其功能是将 OPRD1指定的操作数向右移位,移动的位数由 OPRD2决定,每右移一位,将最低有效位移进 CF。随着移位的进行,最高有效位 SAR保持不变,
SHR恒以 0填充,如图 3-19所示。
第 3章 寻址方式和指令系统图 3-19 SAR/SHR指令操作示意图
(a) 算术右移 (SAR); (b) 逻辑右移 (SHR)
CF M S B O P R D 1 L S B
(a)
CF M S B O P R D 1 L S B
( b )
0
第 3章 寻址方式和指令系统说明:
① 80386或 80486移位次数不允许大于 31。如果移位次数大于 31,那么只使用后 5位移位计数。 8086用立即数时只能是移一位,移位多于一位时使用 CL。在移位次数为 1的情况下,如果移位后 CF与结果的最高位相等,则 OF= 0,否则 OF= 1。在移位次数不为 1时,OF不确定。当移位次数为 1时,对 SAR指令,将 OF清
0;对 SHR指令,将 OF置成与原来 OPRD1的最高有效位相同的值。
当移位次数不为 1时,OF不确定。
② 右移指令常用于实现除以 2n的操作。
第 3章 寻址方式和指令系统例 3-76 若将 AX中的有符号数除以 16,可使用如下指令:
MOV AX,-1024
MOV CL,4
SAR AX,CL
例 3-77 若将 AX中的无符号数除以 16,可使用如下指令:
MOV AX,1024
MOV CL,4
SHR AX,CL
第 3章 寻址方式和指令系统
③ SAR/SHR指令对标志位的影响如下:
通过上述指令的讲述可知,SAL指令相当于对 OPRD1作乘以
2n的操作,SAR指令相当于对 OPRD1作除以 2n的操作。
X - - - X X - - - X - X
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统例 3-78 设 (AL)= 7BH = 01111011B,(BH)= 0B3H =
10110011B,执行下面指令及其结果是:
SAL AL,1 ; (CF) = 0,(AL)= 11110110B = 0F6H
MOV CL,6
SAR BH,CL ; (CF) = 1,(AL)= 11111110B = 0FEH
例 3-79 设 (AL)= 7BH = 01111011B,(BH)= 0B3H =
10110011B,执行下面指令及其结果是:
SHL AL,1 ; (CF) = 0,(AL)= 11110110B = 0F6H
MOV CL,6
SHR BH,CL ; (CF) = 1,(AL)= 00000010B = 02H
第 3章 寻址方式和指令系统
7.双精度左移 /右移指令 SHLD/SHRD
格式,SHLD/SHRD OPRD1,OPRD2,OPRD3
功能:将 OPRD1和 OPRD2两个 16位或 32位操作数连接成双精度值 (32位或 64位 )向左或向右移位,移位位数由计数操作数 OPRD3
决定,移位过程中,将 OPRD2内容移入 OPRD1,而 OPRD2本身不变。
进位位 CF中的值为 OPRD1移出的最后一位。图 3-20给出了这两条指令的操作示意。
第 3章 寻址方式和指令系统图 3-20 双精度移位示意图
CF
31
O P R D 1
0 31
O P R D 2
0
S H L D,
CF
31
O P R D 1
0 31
O P R D 2
0
S H R D,
第 3章 寻址方式和指令系统例 3-80 SHLD BUF[EBX],EAX,8
完成的功能是将 BUF[ EBX]指向的双字单元的内容左移 8位,
移空位由 EAX的内容左移 8位填入,但 EAX内容不变。指令
SHRD EAX,EDX,5
完成的功能是将 EAX中内容右移 5位,移空位由 EDX内容右移
5位填入,但 EDX内容不变。
第 3章 寻址方式和指令系统说明:
① SHLD为双精度左移指令,SHRD为双精度右移指令,是
80386 CPU新增指令。
② 双精度移位指令可以用来实现对一个任意的、未对齐的位串进行快速移动、嵌入和删除,如例 3-81所示。
③ OPRD1可以是寄存器操作数,也可以是存储器操作数,
OPRD2只能是寄存器操作数,OPRD3可以是 8位立即数,也可以是
CL寄存器。移位次数既可以由立即数形式给出,也可以存入 CL,
再由 CL给出,但当 OPRD1等于 1时,若移位后 CF与 OPRD1的最高位不相同时,则 OF置 1,否则 OF清 0。
第 3章 寻址方式和指令系统
④ 这两条指令对标志位的影响如下:
U - - - X X - - - X - X
OF DF IF TF SF ZF AF PF CF
第 3章 寻址方式和指令系统例 3-81 为把一个从任意偏移量上得到的位串传送到一个按双字对准的字节串中去,可通过在传送循环内部使用双精度移位指令,使得一次便可传送一个 32位的串的方法来实现。
实现这一功能的程序段描述如下:
MOV ESI,Sour ;设置源位串指针 ESI
MOV EDI,Dest ;设置目的位串指针 EDI
MOV EBX,Count ;设置位串字计数器
MOV CL,Reloffset ;相对偏移量送 CL
MOV EDX,[ESI] ;装源操作数中第一个字块源地址
ADD ESI,4 ;修改源操作数指针,指向下个字块第 3章 寻址方式和指令系统
Loop1,LODS ;将 ESI指向的源双字块装入 EAX
SHLD EDX,EAX,CL ;用对准的内容重写 EDX
XCHG EDX,EAX ;将对准的内容交换到 EAX
STOS ;将 EAX内容存至对齐的目的双字块中
DEC EBX ;循环计数减 1
JNZ Loop1 ; EBX为 0,退出循环,为 1循环第 3章 寻址方式和指令系统例 3-82 设 (AH)= 95H = 10010101B,(DL)= 0C2H =
11000010B,执行下述指令及其结果是:
SHLD AH,DL,1 ; (CF) = 1,(OF) = 1,(AH)= 00101011B =02BH
MOV CL,3
SHRD AH,DL,CL ; (CF) = 1,(OF) = 0,(AH)= 01010010B =52H
第 3章 寻址方式和指令系统
8,循环左移 /右移指令 ROL/ROR
格式,ROL OPRD1,OPRD2
ROR OPRD1,OPRD2
功能,ROL指令将 OPRD1各位依次循环向左移动 OPRD2次。在每一次移动中,最高位移到 CF中,然后等到其它所有位移动完空出最低位时,在将 CF中内容移到最低位,见图 3-21。
第 3章 寻址方式和指令系统图 3-21 指令 ROL执行过程
CF O PR D 1
第 3章 寻址方式和指令系统图 3-22 指令 ROR执行过程
CFO PR D 1
第 3章 寻址方式和指令系统说明:
① 当 ROL指令规定的循环次数为 1时,若循环以后的操作数的最高位不等于标志位 CF,则溢出标志 OF=1;否则 OF=0。
这可以用来表示移位前后的符号位是否改变 (OF=0,则表示符号位未改变 )。 ROL指令只影响标志位 CF和 OF。
② 当 ROR指令规定循环次数为 1时,若循环以后的操作数的最高位与标志位 CF不相等时,则溢出标志位 OF=1,否则 OF=0。
这可以用来表示循环以后的符号位与原来的是否相同。 ROR指令只影响标志位 CF和 OF。
第 3章 寻址方式和指令系统
③ OPRD1和 OPRD2的使用与指令 SAL/SAR相同。
例 3-83 设 (BL)= 0B5H = 11000101B,执行下面的指令
ROL BL,6
执行结果,(CF) = 1,(BL)= 01110001B = 71H。
第 3章 寻址方式和指令系统
9.带进位循环左移 /右移指令 RCL/RCR
格式,RCL OPRD1,OPRD2
RCR OPRD1,OPRD2
功能,RCL指令将 OPRD1各位再加上 CF内容一起依次循环向左移动 OPRD2次,在每一次移动中,最高位移到 CF中,原来的 CF内容移到 OPRD1最低位,如图 3-23所示。
第 3章 寻址方式和指令系统图 3-23 指令 RCL执行过程
CF O P R D 1
第 3章 寻址方式和指令系统
RCR指令将 OPRD1各位再加上 CF内容一起依次循环向右移动
OPRD2次,在每一次移动中,最低位移到 CF中,原来的 CF内容移到 OPRD1最高位,如图 3-24所示。
图 3-24 指令 RCR执行过程
CFO P R D 1
第 3章 寻址方式和指令系统说明:
① RCL指令规定循环次数为 1时,若循环以后的操作数的最高位与标志位 CF不相等时,则标志位 OF=1,否则 OF=0。这可以用来表示循环以后的符号位与原来的是否相同。 RCL指令只影响标志位 CF和 OF。
② RCR规定的循环次数为 1时,循环后的操作数的最高位与次高位不相等,则标志位 OF=1;否则 OF=0。这可以用来表示循环前后的符号位是否相同。 RCR指令只影响标志位 CF和 OF。
③ OPRD1和 OPRD2的使用与指令 SAL/SAR相同。
第 3章 寻址方式和指令系统例 3-84 设 (CH)= 7AH = 01111010B,(CF)= 1,执行指令
RCR CH,3
结果是,(CF) = 0,(CH)= 10101111B = 0AFH
例 3-85 BCD码转换为 ASCII码。
内存某一缓冲区中存放着若干个用 BCD码表示的十进制数。
每一个单元中放两位 BCD码,要求把它们分别转换为 ASCII码。
高位的 BCD码转换完后放在地址较高的单元。
第 3章 寻址方式和指令系统能满足上述要求的一个汇编语言的程序描述如下:
NAME BCD TO ASCII
DATA SEGMENT
BCDBUF DB 34H,56H,23H,70H,96H,45H,32H,14H,81H,99H; 10个十进制数
COUNT EQU $-BCDBUF
ASCBUF DB 20 0UP(?) ;需 20个单元存放 ASCII码
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
STAPN DB 100 0UP(?)
第 3章 寻址方式和指令系统
STACK ENDS
COSEG SEGMENT
ASSUME CS∶ COSEG,DS∶ DATA,ES∶ DATA,SS∶ STACK
START,PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV SI,OFFSET BCDBUF
MOV DI,OFFSET ASCBUF
MOV CX,COUNT
CLD ;增量方向第 3章 寻址方式和指令系统
TRANT,LODSB
MOV BL,AL
AND AL,0FH
OR AL,30H ;低位十进制数 ASCII码
STOSB
MOV AL,BL
PUSH CX
MOV CL,4
SHR AL,CL ;右移四位
POP CX
OR AL,30H ;高位十进制数 ASCII码
STOSB
LOOP TRANT
RET
COSEG ENDS
END START
第 3章 寻址方式和指令系统
3.2.5 按条件设置字节指令 SET
格式,SETcc OPRD
功能,SET指令共有 16条,每一条指令都要根据指令中给出的条件,cc”是否满足来设置 OPRD指明的字节操作数:条件满足时,将字节设置为 01H;条件不满足时,设置为 00H。
第 3章 寻址方式和指令系统这 16条指令是:
① SETC/SETB/SETNAE:有进位 /低于 /不高于或等于条件设置字节指令,设置条件 CF=1;
② SETNC/SETAE/SETNB:无进位 /高于或等于 /不低于条件设置字节指令,设置条件 CF=0;
③ SETO:溢出条件设置字节指令,设置条件 OF=1;
④ SETNO:无溢出条件设置字节指令,设置条件 OF=0;
⑤ SETP/SETPE:校验为偶条件设置字节指令,设置条件
PF=1;
⑥ SETNP/SETPO:校验为奇条件设置字节指令,设置条件
PF=0;
第 3章 寻址方式和指令系统
⑦ SETS:负数条件设置字节指令,设置条件 SF=1;
⑧ SETNS:正数条件设置字节指令,设置条件 SF=0;
⑨ SETA/SETNBE:高于 /不低于或等于条件设置字节指令,
设置条件 CF=ZF=0;
SETBE/SETNA:低于或等于 /不高于条件设置字节指令,设置条件 CF=1或 ZF=1;
SETE/SETZ:等于 /为零条件设置字节指令,设置条件 ZF=1;
第 3章 寻址方式和指令系统
SETNE/SETNZ:不等于 /非零条件设置字节指令,设置条件
ZF=0;
SETG/SETNLE:大于 /不小于或等于条件设置字节指令,设置条件 ZF=1且 SF=OF;
SETGE/SETNL:大于或等于 /不小于条件设置字节指令,设置条件 SF=OF;
SETL/SETNGE:小于 /不大于或等于条件设置字节指令,设置条件 SF≠OF;
SETLE/SETNG:小于或等于 /不大于条件设置字节指令,设置条件 ZF=1或 SF≠OF。
第 3章 寻址方式和指令系统说明:
① OPRD可以是 8位寄存器,也可以是 8位立即数。
② 这类指令只以某些标志位状态置 01H、置 00H条件,本身不影响任何标志位。
第 3章 寻址方式和指令系统
3.2.6 操作系统型指令操作系统型指令包括系统寄存器装入与存储指令和保护属性检查指令两类。保护属性检查指令简称保护型指令。这些指令通常是由系统程序员使用,只有具有最高特权级 (0级 )的程序即操作系统程序才能使用,对于一般计算机用户来说,很少用到这些指令。
第 3章 寻址方式和指令系统
1.系统寄存器的装入与存储指令系统寄存器的装入与存储指令有 16条,其中 LLDT,SLDT、
LTR和 STR这 4条指令只能在保护方式下使用。
MOV CRn,OPRD2:将 OPRD2的 32位操作数装入 CRn(n=0,
2,3);
MOV OPRD1,CRn:将 CRn内容存储到 OPRD1(n=0,2,3);
MOV DRn,OPRD2:装入调试寄存器 DR0~ DR7;
MOV OPRD1,DRn:存储调试寄存器 DR0~ DR7;
MOV TRn,OPRD2:装入调试寄存器 TR3~ TR7;
MOV OPRD1,TRn:存储调试寄存器 TR3~ TR7;
第 3章 寻址方式和指令系统
LMSW OPRD1:装入机器状态字 (即 CR0的低 16位 );
SMSW OPRD1:存储机器状态字;
LGDT/LIDT OPRD1:装入全局 /中断描述符表寄存器;
SGDT/SIDT OPRD1:存储全局 /中断描述符表寄存器;
LLDT:装局部描述符表寄存器;
SLDT:存局部描述符表寄存器;
LTR:装任务寄存器;
STR:存任务寄存器。
第 3章 寻址方式和指令系统
2.保护属性检查指令保护属性检查指令有 6条且只在保护方式下使用。
CTS:清除机器状态字中任务转换标志;
LAR OPRD1,OPRD2:装入访问权限;
LSL OPRD1,OPRD2:装入段界限;
VERR OPRD:验证段的可读性;
VERW OPRD:验证段的可写性;
ARPL OPRD1,OPRD2:调整选择符的特权级。
第 3章 寻址方式和指令系统
3.2.7 处理机控制指令处理机控制指令包括标志处理指令和其他处理机控制指令。
标志处理指令已在第 2章中讲述过,这里只简单地介绍一下其他处理机控制指令,包括,NOP,HLT,WAIT,ESC和 LOCK。
格式,NOP
HLT
WAIT
ESC
LOCK
第 3章 寻址方式和指令系统功能:
NOP 空操作指令,该指令不执行任何操作,常用于精确延时,其机器码占一个字节单元。
HLT 停机指令,该指令使 CPU处于暂停工作状态,常用于等待外部中断,中断结束后,继续执行下面的指令。
WAIT 等待指令,该指令使 CPU处于等待状态,常用于等待外部中断,中断结束后,继续执行下面的指令。
ESC 处理器脱离指令,该指令将 CPU的控制权交给浮点协处理器 FPU,FPU可以执行 CPU的指令,使用 CPU的寻址方式,
但是不允许使用立即数寻址和寄存器寻址。
第 3章 寻址方式和指令系统
LOCK 锁定前缀指令,该指令是一个字节的指令前缀,与其它指令联合使用,在其后的指令执行期间,维持总线锁存信号直到指令执行完毕,使指令在执行期间一直受到保护,不受其他主控器访问。这在采用共享存储器的多处理机系统中是十分有用的。
80x86的许多指令前可以加 LOCK前缀,如
BT/BTS/BTR/BTC,XCHG,ADD,SUB,ADC,SBB,AND、
OR,XOR,NOT,NEG,INC,DEC等指令,凡有存储器操作数时均可加它。
说明:这类指令均不影响标志位。
第 3章 寻址方式和指令系统
3.2.8 高级语言指令为对像 C这样的结构化语言提供机器语言支持,从 80386开始,提供了 3条类高级语言指令。
1.数组边界检查指令 BOUND
格式,BOUND OPRD1,OPRD2
功能,BOUND指令用于验证寄存器 OPRD1中的 16位或 32位操作数是否在存储器 OPRD2所指向的两个界限内。如果有效地址值小于下界或大于上界,就产生异常 5。
第 3章 寻址方式和指令系统说明:
① 指令假定上、下界值依次存放在相邻存储器单元中,它们同是字或双字。例如
ARRAY_LIMITS DD LOWER_LIMIT
DD UPPER_LIMIT
BOUND EDI,ARRAY_LIMITS
UPPER_LIMIT和 LOWER_LIMIT分别表示上、下界值,存于相邻存储器单元 ARRAY_LIMITS中,由于 EDI是 32位寄存器,
故 UPPER_LIMIT和 LOWER_LIMIT均定义成双字。执行 BOUND
指令时,若 (EDI)+ 4> UPPER_LIMIT或 (EDI)< LOWER_LIMIT,
将发生异常 5。
② 执行 BOUND指令后,对标志位无影响。
第 3章 寻址方式和指令系统
2.进入和退出过程指令 ENTER和 LEAVE
格式,ENTER OPRD1,OPRD2
LEAVE
功能:
(1) ENTER指令为过程参数建立一个堆栈区。
OPRD1指出过程所要使用的堆栈字节数,OPRD2 表示过程的嵌套层数,嵌套层数的取值为 0~ 31。执行 ENTER指令的过程:
① 将 (E)BP压栈,此时的 (E)SP称为本层栈区框架指针 FP;
第 3章 寻址方式和指令系统
② 将所有上层 FP压栈;
③ 将本层栈区框架指针送入 (E)BP;
④ 用 (E)SP减去 OPRD1所指出的字节数作为当前堆栈指针值。
第 3章 寻址方式和指令系统
(2) LEAVE指令用于撤消前面 ENTER指令的动作,是一条无操作数指令,完成的操作与 ENTER相反。过程如下:
① 将 (E)BP复制到 (E)SP,以释放由最近的 ENTER指令为过程分配的所有堆栈空间;
② 从堆栈中弹出 (E)BP值。
在 LEAVE指令之后,通过所使用的 RET n指令,清除由调用过程压入栈的而被调用过程使用的所有参数。
第 3章 寻址方式和指令系统
3.2.9 Cache管理指令
3条 Cache管理指令是 80486提供的,用于管理其内部的 8KB
Cache。这 3条 Cache管理指令是 INVD,WBINVD和 INVLPG。
(1) 作废片内 Cache指令 INVD。
格式,INVD
功能:将 Cache的内容作废。即刷新内部 Cache、分配一个专用总线周期刷新外部 Cache。
第 3章 寻址方式和指令系统
(2) 写回和作废 Cache指令 WBINVD。
格式,WBINVD
功能:刷新内部 Cache、分配一个专用总线周期将外部
Cache的内容写回主存,在此后的一个总线周期将外部 Cache刷新。
(3) 作废 TLB项指令 INVLPG。
格式,INVLPG
功能:使 TLB中的某一项作废。如果 TLB中含有一个存储器操作数映象的有效项,则该 TLB项被标记为无效。
第 3章 寻址方式和指令系统
3.2.10 数字处理指令
80486提供的数字处理指令是使用其 FPU进行高精度、高速度的整数和浮点数运算的指令,这类指令是对 80486中央处理单元 (CPU)指令系统的扩充。为了与 CPU指令相区别,数字处理指令的机器码均带有 ESC前缀,其汇编形式均以 F字母起头。数字指令可以对各种数据类型,包括 80位的扩展实数和 64位的长整数进行高精度、高速度的数值运算。指令类型包括数据传送、
算术运算、比较、超越函数运算和控制等各种类型,并提供一些常用数据以提高数字运算的速度。
第 3章 寻址方式和指令系统若中央处理单元执行的指令需要前一条数字指令的运算结果时,就在数字指令后安排一条等待指令 WAIT,将程序的执行挂起,直到发现数字处理单元的 BUSY信号为 1时为止。这个条件表明数字处理单元的运算已完成,中央处理单元可以获得所需运算结果,继续往下执行了。带有 ESC前缀的指令才是数字指令,
应由数字处理单元执行,WAIT指令不是数字指令,应由中央处理单元执行,它用于中央处理单元与数字处理单元的同步。
第 3章 寻址方式和指令系统习 题 三
3.1 设 (DS)=2000H,(ES)= 2100H,(SS)= 1500H,(SI)=
00A0H,(BX)= 0100H,(BP)= 0010H,数据变量 VAL的偏移地址为 0050H,请指出下列指令的源操作数字段是什么寻址方式?它的物理地址是多少?
(1) MOV AX,0ABH (2) MOV AX,BX (3) MOV AX,[1000H]
(4) MOV AX,VAL (5) MOV AX,[BX] (6) MOV AX,ES:[BX]
(7) MOV AX,[BP] (8) MOV AX,[SI] (9) MOV AX,[BX+10]
(10) MOV AX,VAL[BX] (11) MOV AX,[BX][SI] (12) MOV AX,
VAL[BX][SI]
第 3章 寻址方式和指令系统
3.2 设有关寄存器及存储单元的内容如下:
(DS) = 2000H,(BX) = 0100H,(SI) = 0002H,(20100) = 12H,
(20101) = 34H,(20102) = 56H,(20103) = 78H,(21200) = 2AH,
(21201) = 4CH,(21202) = 0B7H,(21203) = 65H。试说明下列各条指令执行完后,AX寄存器中的内容。
(1) MOV AX,1200H (2) MOV AX,BX (3) MOV AX,[1200H]
(4) MOV AX,[BX] (5) MOV AX,1100[BX] (6) MOV AX,[BX][SI]
(7) MOV AX,1100[BX][SI]
第 3章 寻址方式和指令系统
3.3 分别指出下列指令中源操作数和目的操作数的寻址方式。
(1) MOV SI,100 (2) MOV CX,DATP[SI] (5) MOV[SI],AX
(4) ADO AX,[BX][DI] (5) AND AX,BX (6) PUSHF
3.4 试述指令 MOV AX,2000H和 MOV AX,DS,[2000H]
的区别。
3.5 标志寄存器 EFLAGS中包括几个标志位,各位的状态含义及用途是什么?
第 3章 寻址方式和指令系统
3.6 寄存器 BX作地址指针,自 DX所指的内存单元开始连续存放着 3个无符号数 (字 ),编程序求它们的和,并将结果存放在这 3个数之后。
第 3章 寻址方式和指令系统
3.7 指出下列指令的错误:
(1) MOV AH,BX
(2) MOV [BX],[SI]
(3) MOV AX,[SI][DI]
(4) MOV MYDAT[BX][SI],ES:AX
(5) MOV BYTE PTR[BX],1000
(6) MOV BX,OFFSET MAYDAT[SI]
(7) MOV CS,AX
(8) MOV DS,BP
第 3章 寻址方式和指令系统
3.8 完成下列操作选用什么指令?
(1) 把 4629H传送给 AX寄存器;
(2) 从 AX寄存器中减去 036A;
(3) 把 MYDAT的偏移地址送入 BX中。
第 3章 寻址方式和指令系统
3.9 根据以下要求写出相应的汇编语言指令 。
(1) 把 BX寄存器和 DX寄存器的内容相加,结果存入 DX寄存器中;
(2) 用寄存器 BX和 SI的基址变址寻址方式,把存储器中的一个字节与 AL寄存器的内容相加,并保存在 AL寄存器中;
(3) 用寄存器 BX和位移量 DB2H的变址寻址方式把存储器中的一个字和 (CX)相加,并把结果送回存储器单元中;
(4) 用位移量 0524的直接寻址方式把存储器中的一个字与数
2A59相加,并把结果送回该寄存器中;
(5) 把数 0B5H与 (AL)相加,结果送回 AL中。
第 3章 寻址方式和指令系统
3.10 读下述程序段,请问:什么情况下,本段程序的执行结果是 AH= 0?
BEGIN,IN AL,5FH
TEST AL,80H
JZ BRCH1
MOV AH,0
JMP STOP
BRCHI,MOV AH,0FFH
STOP,HLT
第 3章 寻址方式和指令系统
3.11 读下述程序段:
START,IN AL,20H
MOV BL,AL
IN AL,30H
MOV CL,AL
MOV AX,0
ADLOP,ADD AL,BL
ADC AH,0
DEC CL
JNZ ADLOP
HLT
请问:
(1) 本程序实现什么功能?
(2) 结果在哪?