4.18086/8088指令系统
计算机是通过执行指令序列来完成用户的特定任务的,因此每种计算机都有一组指令集供用户使用。这组指令集就称为计算机的指令系统。
4.1.1 8086/8088指令编码格式
计算机是通过执行指令来处理各种数据的,因此,一条指令既要指出如何处理数据,同时还应指出数据的来源、操作结果的去向。
如何寻找操作数(即操作对象),这就是指令的寻址方式,它是由指令编码格式指出的。
8086/8088指令系统采用变字长的指令编码格式,其指令可由1~6个字节组成,它包括操作码(第一字节),寻址方式(第二字节),位移量、立即数(第三到第六字节)三部分组成。其中,寻址方式、位移量、立即数为操作数部分。
4.1.2 8086/8088指令系统的寻址方式
所谓寻址方式就是寻找操作数存放地址(位置)的方法。
在8086/8088系统中,操作数又可分为两大类:数据操作数和地址操作数。因此,寻址方式也分为数据寻址方式和地址寻址方式两大类。
movax, 1234h; add al,bl;
jmp0020h
1. 数据操作数
2. 地址操作数
3. 寻址方式
8位 | 16位 | |
无符号数 | 00H-FFH(0-255) | 0000H-FFFFH(0-65535) |
带符号数 | 80H-7FH(-128~127) | 8000H-7FFFH (-32768~32767) |
立即数只能用作源操作数,如
MOV AX,0FA00H ;正确
MOV 8000H,AX ;错误
放在8个通用寄存器或4个段寄存器中的操作数
例子:在数据段中定义[1000h]为字节类型
moval, [1000h]
movbx, WORD PTR[1000h]
一般不允许两个操作数同时为存储器操作数
mov [1000h], [2000h] ;错误
存储器寻址方式的操作数存放在存储器单元中。因此,要存取操作数就必须知道其存储器的单元地址。在指令中可以直接给出或间接给出操作数的地址,以达到存取操作数的目的。
指令中给出的地址只是操作数的有效地址(EA),并且是放在方括号(“[ ]”)中。若要从存储器中存取操作数还须得到实际的地址(物理地址)。
物理地址=段地址左移四位+有效地址
存储单元的物理地址=段基地址+偏移地址
存储器操作数的偏移地址(也称有效地址)可以通过不同的寻址方式由指令给出。
例如,若(BX)=2000H, (SI)=0A00H, (DI)=2A00H,则以下指令的结果是一样的:
MOV AL, [2A00H]
MOV AL, [BX+0A00H]
MOV AL, [BX][SI]
MOV AL, [DI]
有效地址可以由以下三种地址分量组成:
对于某条具体指令,这三个地址分量可有不同的组合。正是因为这三种地址分量有不同的组合,才使得对存储器操作数的寻址产生了若干种不同的方式。
⑴直接寻址方式
MOV AL, [1064H]
EA= 16位disp
⑵ 寄存器间接寻址
MOV AX, [SI]
MOV [BX], AL
(BX)
EA= (DI)
(SI)
⑶寄存器相对寻址
⑷基址加变址寻址方式
⑸ 基址加变址相对寻址
4)I/O端口寻址方式
⑴ 直接端口寻址方式
IN AL, 21H
此指令表示从地址为21H的端口中读取数据送到AL中。
⑵ 间接端口寻址方式
mov dx,120h
前一条指令将端口地址120H送到DX寄存器,后一条指令将al中的内容输出到地址有dx寄存器内容所指定的端口中.。
地址寻址方式
1)段内直接寻址
例:JMP SHORT ABC
假设:(CS)=2000H,(IP)=1002H。
2)段内间接寻址方式
例:JMP WORD PTR ADDR
当前(CS)=2000H,(IP)=1002H,ADDR=2700H
例:JMPWORD PTR [BX]
(BX)=0100H,(DS)=1000H,
(10100H)=00H,(10101H)=27H
=10100H
3)段间直接寻址方式
这种寻址方式是指令码中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP内容。
4)段间间接寻址方式
这种寻址方式是由指令码的寻址方式字节求出存放转移地址的连续两个字的地址。其低位字地址单元中存放的是偏移地址,高位字地址单元中存放的是转移段地址。
例:JMPDWORD PTR DELTA[BX]
本例指令是无条件转移指令,采用段间间接寻址方式。
设当前(CS)=2000H,(IP)=0100H,(DS)=1000H,(BX)=3000H,DELTA=0040H,(13040H)=00H,(13041H)=50H,(13042H)=00H,(13043H)=30H,则间接存储地址按寄存器相对寻址为:
(DS)左移4位+(BX)+DELTA=10000H+3000H+0040H
=13040H
于是,可得转移地址为:
3000H:5000H
即转移物理地址为:
PA=30000H+5000H=35000H
执行本指令后,CS的内容和IP的内容分别变成3000H和5000H,程序转移到存储单元35000H开始执行。
4.1.3 8086/8088指令系统
8086/8088指令系统大致可分为六大类指令:
1.数据传送类指令
数据传送指令的主要功能是传送数据、地址和标志。可分为通用数据传送指令、输入输出指令、地址传送指令和标志传送指令。
(1)通用数据传送指令
通用数据传送指令可完成字节或字数据的传送。它可分为数据传送指令、堆栈操作指令、数据交换指令和字节转换指令。
1)数据传送指令
指令格式:MOV dst,src ;(dst)←(src)
src表示源操作数(字/字节)
立即数操作数
寄存器操作数(包括段寄存器)
存储器操作数
dst表示目的操作数(字/字节)
寄存器操作数(不包括IP,CS段寄存器)
存储器操作数
指令功能:将源操作数传送(复制)到目的操作数。
传送方向:如下图所示。
错误。类型不匹配
movax,050ah
2.MOV SI, DL
错误。类型不一致
movdh,0
movsi,dx
错误。类型不明确
movbyte ptr[bx+si],01h
byte ptr说明是字节操作
movword ptr[bx+si],01h
word ptr说明是字操作
错误。不能直接在存储器之间传送
假设buf2和buf1是两个字变量
movax,buf1
movbuf2,ax
假设buf2和buf1是两个字节变量
moval,buf1
movbuf2,al
错误。不能直接在段寄存器之间传送
movax,es
movds,ax
错误。不能由立即数直接到段寄存器
movax,100h
movds,ax
错误。cs不能被mov修改
2) 堆栈操作指令
堆栈段是程序中不可或缺的一个内存区,常用来
① 压入堆栈指令
指令格式及操作:
PUSH src ;(SP)←(SP)-2,
;((SP)+1:(SP))←(src)
src表示源操作数(字)
寄存器操作数(包括段寄存器)
存储器操作数
② 弹出堆栈指令
指令格式及操作:
POP dst ;(dst)←((SP)+1:(SP)),
;(SP)←(SP)+2
dst表示目的操作数(字)
寄存器操作数(不包括IP,CS段寄存器)
存储器操作数
注意:堆栈指令的操作数只能是字操作数(即16位操作数),且不能是立即数。
进栈操作(PUSH):先移后进
出栈操作( POP):先出后移
正确
如果定义了[2000h]存放的是操作数字类型,则正确,否则错误
如果定义了[si]存放的是操作数字类型,则正确,否则错误
正确
错误。不能操作立即数
错误。不能操作立即数
错误。不能操作字节操作数
错误。不能由pop改变cs
3)交换指令
指令格式及操作:
XCHG opr1,opr2 ;(opr1)←→(opr2)
Xchg将两个地方的数据进行互换。
交换的两个数据可以是8位的,也可以是16位的。
xchg ah,al ;ax=9911h
xchg ax,wvar ;交换后ax=5566h,wvar=9911h
;ax=5599h,wvar=6611h
;“byteptrwvar+1”强制为字节量
;只取高字节与AL类型交换
;否则数据类型不匹配
4)字节转换指令(又称:查表指令)
指令格式及操作:
XLAT src_table;(AL) ←((BX)+(AL))
XLAT指令是用来将一种字节代码转换成另一种字节代码。即将BX的内容(代码表格首址src_table)和AL的内容(表格偏移量)相加作为有效地址。并从中读出此内存表格地址单元的内容传送到AL累加器中。
XLAT指令还可以有以下几种表示形式:
XLAT ;不写操作数
XLATB ;有B就不允许再写操作数。
XLAT ES:src_table ;重设段寄存器为ES
[例]在内存的数据段有一张16进制数的ASCII码表,其首地址为Hex_table,如下图所示,为欲将十六进制数0AH转换成ASCII码,则可用以下几条指令实现:
MOV BX, OFFSET Hex_tale ;(BX)←表首址
MOV AL, 0AH ;(AL)←十六进制数A
XLAT Hex_table ;查表转换
上句等价于:lea bx, table
(2) 输入/输出指令
输入输出指令可以分为两大类:一类是直接端口地址的输入/输出指令;一类是通过DX寄存器间接端口地址的输入/输出指令。
1) 输入指令
① 直接寻址的输入指令
指令格式及操作:
IN acc,port ;(acc)←(port)
其中:acc为8位或16位累加器AL/AX。port为8位端口地址,故可寻址256个端口。
②间接寻址的输入指令
指令格式及操作:
IN acc,DX ;(acc)←((DX))
其中:acc为8位或16位累加器AL/AX。DX为16位间接寻址的端口地址寄存器,故可寻址64K个端口。
2) 输出指令
① 直接寻址的输出指令
指令格式及操作:
OUT port, acc;(port)←(acc)
② 间接寻址的输出指令
指令格式及操作:
OUT DX, acc;(DX)←((acc))
(3)地址传送指令
1)取有效地址指令
指令格式:
LEA reg16, mem
此指令的功能是将存放源操作数的16位偏移地址(即有效地址EA)送到一个16位的通用寄存器中。即源操作数必须是一个存储器操作数,目的操作数必须是一个寄存器操作数。例如:
LEA BX, buffer
LEA AX, [BP][DI]
LEA DX, bety[BX][SI]
注意LEA指令和MOV指令的异同,比较下面两组指令:
不同:LEABX,buffer ;将存储器buffer的偏
移地址送到BX
MOV BX,buffer ;将存储器buffer的内
容传送到BX
相同:LEA BX,buffer
MOV BX,OFFSET buffer
以上两条指令都是将存储器buffer的偏移地址送到BX。其中OFFSETbuffer表示存储器偏移地址。
2)地址指针装入DS指令
指令格式:
LDS reg16,mem32
此指令的功能是将源操作数所对应的双字长的内存单元中的高字内容(一般为16位段基址)送入DS,低字内容(一般为偏移地址)送入指令所指定的寄存器中。例如:
LDS DI,[2130H]
3)地址指针装入ES指令
指令格式:
LES reg16,mem32
此指令的功能是将源操作数所对应的双字长的内存单元中的高字内容(一般为16位段基址)送入ES,低字内容(一般为偏移地址)送入指令所指定的寄存器中。例如:
(4) 标志传送指令
1)取标志指令
指令格式:LAHF
2)置标志指令
指令格式:SAHF
3)标志压入堆栈指令
指令格式及操作:
PUSHF ;(SP)←(SP)-2,
((SP)+1;(SP))←(FLAG)
4)标志弹出堆栈指令
指令格式及操作:
POPF ;(FLAG)←((SP)+1;(SP)),
(SP)←(SP)+2
在使用这些传送类指令时应注意以下几点:
① 目的操作数不能为立即数。
② 目的操作数为段寄存器(CS不能作为目的操作数),源操作数不能为立即数。
③ 两操作数不能同时为存储器操作数。
④ 操作数类型必须一致。(字/字节)
⑤ 用BX、SI、DI来间接寻址时,默认的段寄存器为DS;用BP来间接寻址时,默认的段寄存器为SS,在串操作里,DI默认段寄存器为ES。
⑥ 对于堆栈操作,操作数不能为立即数;CS寄存器的值可以push,但不能pop。
⑦ 数据交换指令的两个操作数任一都不能是立即数。
⑧ 查表指令的操作数是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL。
⑨ 除了SAHF和POPF指令外,其余指令都不会影响标志位
错误。不能用立即数mov到段寄存器
错误。交换的R类型不一样
错误。输出端口>0FFH,要用dx间接
错误。用的2个基址寄存器
正确
错误。不能push立即数
错误。Pop不能操作字节型操作数
2、算术运算类指令
8086/8088有丰富的算术运算指令,而且可以处理4种类型的数据,如下表所示:
数据类型 | 数据范围 | 运算 | 可作累加器使用的寄存器或存储器 | |
二 进 制 | 8位无符号 | 0~255 | 加减 | 所有的通用寄存器或存储器 |
乘除 | AX寄存器 | |||
16位无符号 | 0~65535 | 加减 | 所有的通用寄存器或存储器 | |
乘除 | AX、DX寄存器 | |||
8位带符号 | -128~+127 | 加减 | 所有的通用寄存器或存储器 | |
乘除 | AX寄存器 | |||
16位带符号 | -32768~+32767 | 加减 | 所有的通用寄存器或存储器 | |
乘除 | AX、DX寄存器 | |||
十 进 制 | 压缩型BCD | 0~99 | 加减 | AX寄存器 |
非压缩型BCD | 0~9 | 加减 | AX寄存器 | |
乘除 | AX寄存器 |
(1)加法指令
指令格式 | 操作功能 | 标志位影响 | |||||
O | S | Z | A | P | C | ||
ADD dst,src | (dst) ←(dst)+(src) | ○ | ○ | ○ | ○ | ○ | ○ |
ADC dst, src | (dst) ←(dst)+(src)+(CF) | ○ | ○ | ○ | ○ | ○ | ○ |
INC dst | (dst) ←(dst)+1 | ○ | ○ | ○ | ○ | ○ | × |
AAA | 非压缩型BCD码调整指令 (ASCII码调整指令) | △ | △ | △ | ○ | △ | ○ |
DAA | 压缩型BCD调整指令 | × | ○ | ○ | ○ | ○ | ○ |
○:影响; ×:不影响
△:状态不定;1:置为1
在微处理器中,没有专用的BCD码运算指令,使用二进制运算指令进行BCD码数的运算,然后用BCD码运算调整指令进行调整,重新得到BCD码的结果。
DAA指令的操作为:(压缩型BCD码调整)
如果 (AL)∧0FH>9或(AF)=1
则 (AL)←(AL)+06H
(AF)←1
如果 (AL)>9FH或(CF)=1
则 (AL)←(AL)+60H
(CF)←1
AAA指令的操作为:(非压缩型BCD码调整)
如果 (AL)∧0FH>9或(AF)=1
则 (AL)←(AL)+06H
(AH)←(AH)+1
(AF)←1
(CF)←(AF)
(AL)←(AL)∧0FH
否则 (AL)←(AL)∧0FH
[例]要求计算两个十进制数之和,7+8=?。可用以下指令实现:(DAA,压缩型BCD码调整)
MOV AX, 0007H ;(AL)=07H,(AH)=00H
MOV BL, 08H ;(BL)=08H
ADD AL, BL ;(AL)=0FH
DAA ;(AL)=15H,(AH)=00H ;(CF)=0,(AF)=1
(AAA,非压缩型BCD码调整)
MOV AX, 0007H ;(AL)=07H,(AH)=00H
MOV BL, 08H ;(BL)=08H
ADD AL, BL ;(AL)=0FH
AAA ;(AL)=05H,(AH)=01H
;(CF)=(AF)=1
[例]要求计算两个十进制数之和,56+34=?。可用以下指令实现:(压缩型BCD码调整)
MOV AX, 3456H ;(AL)=56H,(AH)=34H
ADD AL, AH ;(AL)=8AH
DAA ;(AL)=90H
[例]要求计算两个BCD数的ASCII码之和,即‘5’+‘9’=?。可用以下指令实现:(ASCII码调整)
MOV AL, ‘5’ ;(AL)=35H
ADD AL, ‘9’ ;39H,(AL)=6EH
MOV AH, 0 ;(AH)=00H
AAA ;(AH)=01H,(AL)=04H
OR AX,3030H ;(AX)=3134H,即‘34’
(2) 减法指令
指令格式 | 操作功能 | 标志位影响 | |||||
O | S | Z | A | P | C | ||
SUB dst, src | (dst) ←(dst)-(src) | ○ | ○ | ○ | ○ | ○ | ○ |
SBB dst, src | (dst) ←(dst)-(src)-(CF) | ○ | ○ | ○ | ○ | ○ | ○ |
DEC dst | (dst) ←(dst)-1 | ○ | ○ | ○ | ○ | ○ | × |
NEG dst | (dst) ←0 -(dst) | ○ | ○ | ○ | ○ | ○ | 1 |
CMP dst, src | (dst) -(src) | ○ | ○ | ○ | ○ | ○ | ○ |
AAS | 非压缩型BCD调整指令 | △ | △ | △ | ○ | △ | ○ |
DAS | 压缩型BCD调整指令 | × | ○ | ○ | ○ | ○ | ○ |
DAS指令的操作为:(压缩型BCD码调整)
如果 (AL)∧0FH>9,(AF)=1
则 (AL)←(AL)-06H
(AF)←1
如果 (AL)>9FH或(CF)=1
则 (AL)←(AL)-60H
(CF)← 1
AAS指令的操作为:(非压缩型BCD码调整)
如果 (AL)∧0FH>9或(AF)=1
则 (AL)←(AL)-06H
(AH)←(AH)-1
(AF)←1
(CF)←(AF)
(AL)←((AL) ∧ 0FH)
否则 (AL)←((AL)∧ 0FH)
[例]要求计算两个十进制数之差,86-7=?。可用以下指令实现:(非压缩型BCD码)
MOV AX, 0806H ;(AH)=08H,(AL)=06H
SUB AL, 07H ;(AX)=08FFH
AAS ;(AX)=0709H
[例]要求计算两个十进制数之差,134-56=?。可用以下指令实现:(压缩型BCD码)
MOV AX, 5634H ;(AH)=56H,(AL)=34H
SUB AL, AH ;(AL)=DEH,有借位
DAS ;(AL)=78H
(3) 乘法指令
指令格式 | 操作功能 | 标志位影响 | |||||
O | S | Z | A | P | C | ||
MUL src | (AX) ← (AL) × (src) (DX:AX) ← (AX) × (src) | ○ | × | × | × | × | ○ |
IMUL src | (AX) ← (AL) × (src) (DX:AX) ← (AX) × (src) | ○ | × | × | × | × | ○ |
AAM | BCD调整指令 | × | ○ | ○ | × | ○ | × |
AAM指令的操作为:(将二进制数转换成十进制数)
(AH)←(AL)/0AH的商;即AL除以10,商送AH
(AL)←(AL)/0AH的余;即AL除以10,余数送AL
例:要求进行以下十进制乘法运算:7´9=?
解:可编程序段如下:
MOV AL,07H ;(AL)=07H
MOV BL,09H;(BL)=09H
MUL BL ;(AX)=07H´09H=003FH
AAM ;(AH)=06H,(AL)=03H
(4)除法指令
指令格式 | 操作功能 | 标志位影响 | |||||
O | S | Z | A | P | C | ||
DIV src | (AL) ← (AX)/(src)的商 (AH) ← (AX)/(src)的余数 (AX) ← (DX:AX) /(src)的商 (DX) ← (DX:AX) /(src)的余数 | × | × | × | × | × | × |
IDIV src | (AL) ← (AX)/(src)的商 (AH) ← (AX)/(src)的余数 (AX) ← (DX:AX) /(src)的商 (DX) ← (DX:AX) /(src)的余数 | × | × | × | × | × | × |
CBW | 若(AL)<80H,则(AH)←00H, 否则(AH)←FFH | △ | △ | △ | △ | △ | △ |
CWD | 若(AX)<8000H,则(DX)←0000H, 否则(DX)←FFFFH | △ | △ | △ | △ | △ | △ |
AAD | BCD调整指令 | × | ○ | ○ | △ | ○ | × |
8086/8088CPU执行除法时规定:除数只能是被除数的一半字长。当被除数为16位时,除数应为8位;当被除数为32位时,除数应为16位。
AAD指令的操作为:(十进制数转换成二进制数)
(AL)←(AH)´0AH+(AL)
(AH)←0
例:要进行以下十进制除法运算:73÷2=?
解:可编程序段如下:
MOVAH,07H ;(AH)=07H
MOV AL,03H ;(AL)=03H
AAD ;(AL)=49H(即十进制数73)
MOV BL,02H ;(BL)=02H
DIV BL ;(AL)=24H(商),(AH)=01H(余数)
AAM ;(AH)=03H,(AL)=06H
BCD 调整指令
DAA,DAS为加减调整,乘除没有调整指令。
AAA,AAS,AAM,AAD,其中+,-,×调整是在运算之后进行调整,÷在运算之前调整。
3.位操作类指令
位操作指令是对8位或16位的寄存器或存储单元中的内容按位进行操作。这一类指令包括逻辑运算指令、移位指令和循环移位指令等三组。
(1)逻辑运算指令
逻辑运算类指令与算术运算指令不同,算术指令是按字节或字进行算术运算,而逻辑运算指令是把操作数按位来进行逻辑运算。
说明:TEST相当于AND运算,但是不保存结果,仅影响标志。
常见的用法举例:
①清进位标志位:ANDAX,AX或ORAL,AL等,并且影响SF,ZF,PF。
②清零操作数:XORAX,AX不仅把AX清零,而且也影响了状态标志。
③把某几位取反:用XOR指令,把要取反的位和1异或,不变的位和0异或。
④清零或置位某几位:用AND指令清零,用OR指令置位。
(2)移位操作指令
该类指令的使用方法是:
①移动1位,用类似于SHLAX,1的格式
②移动n位,用类似于SHLAX,CL的格式
移位操作对OF的影响
eg:将一个16位无符号数乘以10。该数原来存放在num为首地址的两个连续的存储单元中。
乘法运算执行时间长,效率不高。
mov ax, num
mov bx,10
mul bx
花费130个时钟周期
移位运算执行时间短,指令条数多。
mov ax, num
shl ax, 1
mov bx,ax
shl ax, 1
shl ax, 1
add ax, bx
hlt
花费约28个时钟周期
说明:
①逻辑移位适用于无符号数,算术移位适用于带符号数;
②SHL/SAL相当于无符号数乘法;
③SHR相当于无符号数除法,SAR相当于带符号数除法;
④SHL和SAL的机器码完全相同,是助记符的两种写法。
说明:
循环移位常用来变换数据格式。
循环移位操作对 OF 的影响
使用举例
[例一]利用循环移位指令可以对寄存器或存储器中的任一位进行测试。如要测试AL寄存器中的第5位的状态是“0”还是“1”,则可利用以下 指令实现:
MOV CL,5 ;(CL)¬移位次数
ROR AL,CL ;(CF)¬AL的第5位
JNC ZERO ;若(CF)=0,转ZARO
...... ;否则......
ZERO: ......
[例二]利用带进位循环移位指令可以实现将两个以上寄存器或存储器单元组合起来一起移位。如DX和AX两个寄存器组成的32位数乘以2,可用以下两条指令实现:
SHLAX,1 ;AX左移1位,(CF)¬AX的最高位
RCLDX,1 ;DX带进位左移1位,DX的最低位¬(CF)
具体操作如下图:
4.串操作指令
串操作指令的特征是对数据块,也称数据串(字符串或数值串)进行操作。其操作数为隐含操作数,并且其中部分指令的两个操作数可以同时是存储器操作数。
串传送 MOVS(Move string)
串比较 CMPS(Compare string)
串扫描 SCAS(Scan string)
串装入 LODS(Load from string)
串保存 STOS(Store in to string)
特点:
⑴ 串操作指令需要指明每次操作的数据串数据的类型:B-表示字节串,W-表示字串。
例如:MOVSB,CMPSW等。
⑵ 串操作指令使用DS:SI作为源操作数的指针,允许段超越;ES:DI作为目的操作数的指针,不允许段超越;
⑶ 使用DF来表示每次操作以后变址寄存器SI和DI的变化方向:
CLD;DF=0 SI,DI做增量变化B:+1或W:+2
STD ;DF=1 SI,DI做减量变化B:-1或W:-2
⑷ 使用CX来表示用重复前缀以后指令需要重复执行的次数(通常是数据串的长度)
⑸通常使用重复前缀来自动完成一个数据块(数据串)的操作。
重复前缀:
⑴ REP重复
⑵ REPE/REPZ相等/为零则重复
⑶ REPNE/REPNZ不相等/不为零则重复
或 (SI)<-(SI)±2,(DI) <-(DI)±2 字操作
或 (SI)<-(SI)±2,(DI) <-(DI)±2 字操作
指令格式 | 操作功能 | 标志位影响 | |||||
O | S | Z | A | P | C | ||
MOVS Dstring,Sstring MOVSB MOVSW | ((ES):(DI))<-((DS):(SI)) (SI) <-(SI)±1 或 (SI)<-(SI)±2 (DI) <-(DI)±1或 (DI)<-(DI)±2 | △ | △ | △ | △ | △ | △ |
LODS Sstring LODSB LODSW | (AL)/(AX) <- ((DS):(SI)) (SI) <-(SI)±1 或 (SI)<-(SI)±2 | △ | △ | △ | △ | △ | △ |
STOS Dstring STOSB STOSW | ((ES):(DI)) <- (AL)/(AX) (DI) <-(DI)±1 或 (DI)<-(DI)±2 | △ | △ | △ | △ | △ | △ |
CMPS Sstring, Dstring CMPSB CMPSW | ((DS):(SI))-((ES):(DI)) (SI) <-(SI)±1 或 (SI)<-(SI)±2 (DI) <-(DI)±1或 (DI)<-(DI)±2 | ○ | ○ | ○ | ○ | ○ | ○ |
SCAS Dstring SCASB SCASW | (AL) - ((ES):(DI)) (DI) <-(DEI)±1 或 (DI)<-(DI)±2 | ○ | ○ | ○ | ○ | ○ | ○ |
REP | MOVS STOS | (CX)!=0 | △ | △ | △ | △ | △ | △ |
REPZ/REPE REPNZ/REPNE | CMPS SCAS | (CX)!=0 且 (ZF)=1 (CX)!=0 且 (ZF)=0 | ○ | ○ | ○ | ○ | ○ | ○ |
5.控制转移类指令
能够使程序的执行流程发生改变的指令
(1)无条件转移指令
指令名称 | 指令格式 | 指令功能 | 转移范围 |
段内直接短转移 | JMP disp8 | (IP)<-(IP)+ disp8 | -128 ~ +127 |
段内直接近转移 | JMP disp16 | (IP)<-(IP)+ disp16 | -32K ~ +32K |
段内间接转移 | JMP mem/reg | (IP) <- (mem) (IP) <- (reg) | -32K ~ +32K |
段间直接转移 | JMP addr | (IP)<-偏移地址 (CS) <-段地址 | -32K ~ +32K |
段间间接转移 | JMP mem | (IP) <- (mem) (CS) <- (mem)+2 | -32K ~ +32K |
(2) 条件转移指令
根据判断条件是否成立决定是否转移(即条件成立则转移,否则不转移)。按照判断条件的不同条件转移指令可分为以下类型:单个标志判断指令、无符号数判断指令、有符号数判断指令和CX寄存器判断指令。
条件转移都是段内直接短转移,即(IP)=(IP)+Data8类型的转移。
(3) 循环控制指令
循环控制指令的转移也都是段内直接短转移,即(IP)←(IP)+Data8类型的转移。
说明:
① 程序转移类指令都不影响状态标志。
② 如果条件转移指令和循环控制指令的目标地址的位移量超出了Data8所能够表示的范围,则需要用无条件转移指令JMP辅助来完成转移和循环。
(4) 子程序调用与返回指令
子程序(过程)通常是一个完整的、独立的有一定名称(标号)的程序段,它可以多次被调用,并在这个程序段执行完后可返回到原先调用的程序处。子程序执行的过程分为三步:
①子程序调用(即从主程序转移到子程序的首地址),用CALL指令。
② 执行子程序
③ 返回(即从子程序转移到主程序),用RET指令。
6.处理器控制类指令
这一类指令用于对CPU进行控制,例如对CPU中某些状态标志位的状态进行操作,以及使CPU暂停、等待等等。
8086/8088指令系统的处理器控制指令可分为三组:
① 标志操作指令
② 外部同步指令
③ 空操作指令
1、 指出源操作数的寻址方式
⑴ MOV BX,2000H ;立即数寻址 ⑵ MOV BX,[2000H] ;直接寻址
⑶ MOV BX,[SI] ;寄存器间接寻址 ⑷MOV BX,[SI+2000H] ;寄存器相对寻址
⑸ MOV [BX+SI],AL ;寄存器寻址 ⑹ ADD AX,[BX+DI+80] ;基址变址相对寻址
⑺ MUL BL ;寄存器寻址 ⑻ JMP BX ;段内间接寻址
⑼ IN AL,DX ;端口间接寻址 ⑽ INC WORD PTR[BP+10H] ;寄存器相对寻址
⑾ MOV CL,LENGTH VAR ;立即数寻址 ⑿ MOV BL,OFFSET VAR1 ;立即数寻址
2、 指出下列指令是否正确
(1) MOV DS,0100H ;错误。源操作数是立即数时,目的操作数不能时段寄存器
(2) MOV BP,AL ;错误。操作数类型不一致
(3) XCHG AH,AL ;正确。
(4) OUT 310H,AL ;错误。端口直接寻址的范围应在0~FFH之间
(5) MOV BX,[BX] ;正确。
(6) MOV ES:[BX+DI],AX ;正确。
(7) MOV AX,[SI+DI] ;错误。存储器寻址中有效地址不能由两个变址寄存器组成
(8) MOV SS:[BX+SI+100H],BX ;正确。
(9) AND AX,BL ;错误。操作数类型不一致
(10) MOV DX,DS:[BP] ;正确。
(11) ADD [SI],20H ;错误。用PTR 说明类型
(12) MOV 30H,AL ;错误。目的操作数不能为立即数
(13) PUSH 2000H ;错误。堆栈指令的操作数不能是立即数
(14) MOV [SI],[2000H] ;错误。两个操作数不能同时为存储器操作数
(15) MOV SI,AL ;错误。操作数类型不一致
(16) ADD [2000H],20H ;错误。用PTR 说明类型
(17) MOV CS,AX ;错误。目的操作数不能为代码段寄存器
(18) INC [DI] ;错误。需用PTR说明类型
(19) OUT BX,AL ;错误。端口间接寻址的寄存器只能是DX寄存器
(20) SHL BX,3 ;错误。移位次数大于1时应该用CL寄存器
(21) XCHG CX,DS ;错误。交换指令中不能出现段寄存器
(22) POP AL ;错误。堆栈指令的操作数只能是字操作数(即16位操作数)
3、 写出存储器操作数物理地址的计算表达式
(1) MOV AL,[DI] ;(DS)×10H+(DI)
(2) MOV AX,[BX+SI] ;(DS)×10H+(BX)+(SI)
(3) MOV 5[BX+DI],AL ;(DS)×10H+(BX)+(DI)+5
(4) ADD AL,ES:[BX] ;(ES)×10H+(BX)
(5) SUB AX,[1000H] ;(DS)×10H+1000H
(6) ADC AX,[BX+DI+2000H] ;(DS)×10H+(BX)+(DI)+2000H
(7) MOV CX,[BP+SI] ;(SS)×10H+(BP)+(SI)
(8) INC BYTE PTR [DI] ;(DS)×10H+(DI)
4、 若(DS)=3000H,(BX)=2000H,(SI)=0100H,(ES)=4000H,计算下列存储器操作数的物理地址。
(1) (DS)×10H+(BX)=3000H×10H+2000H=32000H
(2) (DS)×10H+(BX)+(SI)+1000H=3000H×10H+2000H+0100H+1000H=33100 H
(3) (DS)×10H+(BX)+(SI)=3000H×10H+2000H+0100H=32100 H
(4) (ES)×10H+(BX)=4000H×10H+2000H=42000 H
5、若(CS)=E000H,说明代码段可寻址物理存储空间的范围。
∵ 最小物理地址为:(CS)×10H+0000H=E0000H
最大物理地址为:(CS)×10H+FFFFH=EFFFFH
∴ 代码段可寻址物理存储空间的范围是:E0000H~EFFFFH
6、设(SP)=2000H,(AX)=3000H, (BX)=5000H,执行下列程序段后,(SP)=?,(AX)=?, (BX)=?
PUSH AX
PUSH BX
POP AX
(SP)=1FFEH,(AX)=5000H, (BX)=5000H
7、试比较SUB AL,09H与CMP AL,09H这两条指令的异同。若(AL)=08H,分别执行上述两条指令后,(AL)=?,CF=?,OF=0,ZF=?
(1) 相同点:两条指令都能完成(AL)-09H的功能,并且都影响六个状态标志位;
不同点:SUB指令将运算结果回送到AL寄存器中,而CMP指令不回送。
(2) SUB AL,09H ;(AL)=FFH,CF=1,OF=0,ZF=0
CMP AL,09H ;(AL)=08H,CF=1,OF=0,ZF=0
8、分别执行下列指令,试求AL的内容及各状态标志位的状态。
(1) MOV AL,19H ;
ADD AL,61H ;(AL)=7AH OF=0 SF=0 ZF=0 AF=0 PF=0 CF=0
(2) MOV AL,19H ;
SUB AL,61H ;(AL)=B8H OF=0 SF=1 ZF=0 AF=0 PF=1 CF=1
(3) MOV AL,5DH ;
ADD AL,0C6H ;(AL)=23H OF=0 SF=0 ZF=0 AF=1 PF=0 CF=1
(4) MOV AL,7EH ;
SUB AL,95H ;(AL)=E9H OF=1 SF=1 ZF=0 AF=0 PF=0 CF=1
9、用最少的指令,实现下述要求的功能。
(1) AH的高4位清零。 AND AH,0FH
(2) AL的高4位去反。 XOR AH,0F0H
(3) AL的高4位移到低4位,高4位清0。 MOV CL,4
SHR AL,CL
(4) AL的低4位移到高4位,低4位清0。 MOV CL,4
SHL AL,CL
10、设(BX)=6D16H,(AX)=1100H,写出下列三条指令执行后,AX和BX寄存器中的内容。
MOV CL,06H
ROL AX,CL
SHR BX,CL (AX)=4004 H (BX)=01B4H
11、设初值(AX)=0119H,执行下列程序段后,(AX)=?
MOV CH,AH
ADD AL,AH
DAA
XCHG AL,CH
ADC AL,34H
DAA
MOV AH,AL
MOV AL,CH (AX)=3520 H
12、指出下列程序段的功能。
(1) MOV CX,10
LEA SI,First
LEA DI,Second
REP MOVSB 将 First串中前10个字符传送至Second 中
(2) CLD
LEA DI,[0404H]
MOV CX,0080H
XOR AX,AX
REP STOSW 将起始地址为0404 H开始的80 H个单元置成0
13、 设(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H,试求执行XCHG BX,[BP+SI]后, (BX)=?,(2F246H)=?
(BX)=4154H (2F246H)=6F30H
14、设(BX)=0400H,(DI)=003CH,执行LEA BX,[BX+DI+0F62H]后,(BX)=?
(BX)=139E H
15、设(DS)=C000H,(C0010H)=0180H,(C0012H)=2000H,执行LDS SI,[10H]后,(SI)=?, (DS)=?
(SI)=0180 H,(DS)=2000 H
16、已知(DS)=091DH,(SS)=1E4AH,(AX)=1234H,(BX)=0024H,(CX)=5678H,(BP)=0024H,(SI)=0012H,(DI)=0032H,(09226H)=00F6H,(09228H)=1E40H,试求单独执行下列指令后的结果。
(1) MOV CL,20H[BX][SI] ;(CL)=0F6 H
(2) MOV [BP][DI],CX ;(1E4F6 H)=5678 H
(3) LEA BX,20H[BX][SI] ;(BX)=0056 H
MOV AX,2[BX] ;(AX)=1E40 H
(4) LDS SI,[BP][DI] ;
MOV [SI],BX ;((SI))=0024 H
(5) XCHG CX,32H[BX] ;
XCHG 20H[BX][SI],AX ;(AX)=5678 H ,(09226H)=1234 H
17、若CPU中各寄存器及RAM参数如图所示,试求独立执行如下指令后,CPU及RAM相应寄存器及存储单元的内容是多少?
CPU | RAM | 执行前 | 执行后 | |||
CS | 3000H | FFFFH | CX | 20506H | 06H | 不变 |
DS | 2050H | 0004H | BX | 20507H | 00H | 不变 |
SS | 50A0H | 1000H | SP | 20508H | 87H | 不变 |
ES | 0FFFH | 17C6H | DX | 20509H | 15H | 不变 |
IP | 0000H | 8094H | AX | 2050AH | 37H | 94H |
DI | 000AH | 1403H | BP | 2050BH | C5H | 不变 |
SI | 0008H | 1 | CF | 2050CH | 2FH | 不变 |
(1)MOV DX,[BX+2] ;(DX)=0006H,(BX)=0004H
(2)PUSH CX ;(SP)=0FFEH
(3)MOV CX,BX ;(CX)=0004H,(BX)=0004H
(4)TEST AX,01 ;(AX)=8094H,(CF)=0
(5)MOV AL,[SI] ;(AL)=87H
(6)ADC AL,[DI] ;(AL)=0CCH,(CF)=0
DAA ;(AL)=32H
(7)INC SI ;(SI)=0009H
(8)DEC DI ;(DI)=0009H
(9)MOV [DI],AL ;((DI))=94H
(10)XCHG AX,DX ;(AX)=17C6H,(DX)=8094H
(11)XOR AH,BL ;(AH)=84H,(BL)=04H
(12)JMP DX ;(IP)=17C6H
18、(DS)=2000H,(BX)=1256H,(SI)=528FH,偏移量=20A1H,(232F7H)=3280H,(264E5H)=2450H,试求执行下述指令后的结果。
(1) JMP BX ;(IP)=1256 H
(2) JMP TABLE[BX] ;(IP)=3280 H
(3) JMP [BX][SI] ;(IP)=2450 H
19、设(IP)=3D8FH,(CS)=4050H,(SP)=0F17H,当执行CALL 2000H:0094H后,试指出(IP)、(CS)、(SP)、((SP))、((SP)+1)、((SP)+2)和((SP)+3)的内容。
CALL指令是5字节指令,下一条指令地址为4050H:3D94H
所以执行后
(IP)=0094H,(CS)=2000H、(SP)=0F13H
((SP))=94H,((SP)+1)=00H,((SP)+2)=00H,((SP)+3)=20H