第 3章 8086的寻址方式和
指令系统
【 本章重点 】 掌握指令系统的的基本格式, 指令系统
的操作功能及使用方法 。
【 本章难点 】 8086的寻址方式,数据传送类指令
和算术运算类指令的使用。
§ 3.1 8086的寻址方式
3.1.1操作数的寻址方式
1, 立即数寻址
在这种寻址方式中,操作数直接跟在操作码的后面,
参加指令所规定的操作,并且操作数与操作码一起
放在代码段中。这种方式叫立即数寻址方式。
例,MOV AX,1234H
这条指令的功能是:把立即数 1234H送入 AX中。
操作码
34
12
AH AL
ROM
代码段
.
.
.
.
.
.
AX 12 34
图 3-1 立即寻址示意图
2, 寄存器寻址
如果操作数就在 CPU的内部寄存器中, 那么寄存器
名在指令中给出 。 这种寻址方式就叫寄存器寻址方式 。
例,MOV DS,AX
DS AX
图 3-2 寄存器寻址示意图
对 16位操作数来说,寄存器可以为 AX,BX,CX,
DX,SI,DI,SP或者 BP,对于 8位操作数来说,寄存
器可为 AH,AL,BH,BL,CH,CL,DH,DL。
采用寄存器寻址方式的指令在执行时,操作就在 CPU
内部进行,不需要使用总线周期,因此,执行速度快。
3, 直接寻址
使用直接寻址方式时,数据总是在存储器中,存储
单元的有效地址由指令直接指出,所以直接寻址是
对存储器进行访问时可采用的最简单的方式。
操作码
10
20
DS 3 0 0 0
2 0 1 0
3 2 0 1 0
代码段
数据段
AX
AH AL
80
86
86 80
32010H
32011H
.
.
.
.
.
.
{假如 DS=3000H
例,MOV AX,DS,[2010H]
物理地址 =
DS× 16+ 2010H=3000H× 16+ 2010H=32010H
指令功能是将 32010H和 32011H两单元的内容送到 AX中 。
要注意的是采用直接寻址方式时,如果指令前面没有用前
缀指明操作数在哪一段,则默认为段寄存器是数据段寄存
器 DS。
4, 寄存器间接寻址
采用寄存器间接寻址方式时, 操作数一定在存储器中,
存储单元的有效地址由寄存 器指出, 这些寄存器可以为 BX、
BP,SI和 DI之一, 由于上述 4个寄存器所黙认的段寄存器
不同, 这样又可以分两种情况:
① 以 SI,DI,BX进行间接寻址,则操作数通常存放在现
行数据段中。此时数据段寄存器内容加上 SI,DI,BX中
的 16位段内偏移地址,即得操作数的地址
例,MOV AX,[SI]
操作码
DS 3 0 0 0
3 1 0 0 0
代码段
数据段
AX
AH AL
78
56
56 78
31000H
31001H
.
.
.
1 0 0 0
ROM
SI
.
.
.
.
.
.
和直接寻址的情况 — 样, 如果指令前面没有用前缀指明具体
的段寄存器, 则寻址时 默认的段寄存器通常为 DS。 如寄存器
为 BP时, 则对应的段寄存器为 SS。
② 寄存器 BP间接寻址,则操作数存放在堆栈段区域中。
此时堆栈段寄存器内容加上 BP中的 16位段内偏移地址,
即得操作数的地址。假如 SS=3000H
例,MOV AX,[BP]
SS 3 0 0 0
2 0 0 0
3 2 0 0 0
代码段
堆栈段
AX
AH AL
34
12
12 34
32000
32001
.
.
.
.
.
.
BP
.
.
.
ROM
.
.
.
数据段
物理地址 =SS× 16+ BP=30000H+ 2000H=32000H
指令功能是将 32000H和 32001H两单元的内容送到 AX中。
5, 寄存器相对寻址
在这种寻址方式中,操作数存放在存贮器中。操作数的地址
是由段寄存器内容加上 SI,DI,BX,BP之一的内容,再加
上由指令所指出的 8位或 16位相对地址偏移量而得到的
例,MOV AX,DISP[SI]
操作码
DS 3 0 0 0
3 1 3 0 0
代码段
数据段
AX
AH AL
78
56
56 78
31300H
31301H
.
.
.
.
.
.
1 0 0 0
ROM
SI
0 3 0 0DISP
00
03

物理地址 =DS× 16+ SI+ DISP=30000H+ 1000H+ 0300H=31300H指
令功能是将 31300H和 31301H两单元的内容送到 AX中 。
6, 基址, 变址寻址
在 8086中,通常把 BX和 BP作为基址寄存器,而把 SI,DI
作为变址寄存器。将这两种寄存器联合起来进行的寻址
就称为基址、变址寻址。这时,操作数的地址应该是段
寄存器内容 × 16加上基址寄存器内容( BX或 BP内容),
再加上变址寄存器内容( SI或 DI内容)而得到的,
例,MOV AX,[BX][SI]
操作码
DS 3 0 0 0
3 0 0 0
3 4 0 0 0
代码段
数据段
AX
AH AL
78
56
56 78
34000H
34001H
.
.
.
.
.
.
1 0 0 0
ROM
SI
BX
物理地址 =DS× 16+ SI+ BX=30000H+ 1000H+ 3000H=34000H
指令功能是将 34000H和 34001H两单元的内容送到 AX中。
例,MOV AX,[BP][SI]
物理地址 =SS× 16+ BP+ SI=30000H+ 3000H+ 1000H=34000H
指令功能是将 340000H和 34001H两单元的内容送到 AX中。
操作码
DS 3 0 0 0
3 0 0 0
3 4 0 0 0
代码段
堆栈段
AX
AH AL
78
56
56 78
34000H
34001H
.
.
.
.
.
.
1 0 0 0
ROM
SI
BP
例,MOV AX,DISP[BX][SI]
物理地址 =DS× 16+ SI+ BX+ DISP=30000H+ 1000H+
3000H+ 0300H=34300H
指令功能是将 34300H和 34301H两单元的内容送到 AX中。
7, 基址, 变址相对寻址
这种寻址实际上是基址、变址寻址的扩充。即操作数
的地址是由基址、变址方式得到的地址再加上由指令
指明的 8位或 16位的相对偏移地址而得到的
操作码
DS 3 0 0 0
3 0 0 0
3 4 3 0 0
代码段
堆栈段
AX
AH AL
78
56
56 78
34300H
34301H
.
.
.
.
.
.
1 0 0 0
ROM
SI
BX
0 3 0 0DISP
00
03

3.1.2 转移地址的寻址方式
1, 段内直接寻址
段内直接寻址方式也称为相对寻址方式,转移的目标
地址是当前 IP内容和一个 8位或 16位的位移量 DISP之和。
即物理地址 =CS× 16+ IP+ DISP
例,JMP DISP
图 3-10中,1000H是 CPU读取这条指令的
位移量 50H后 IP的内容。所以,该指令使
CPU转向 31050H去执行。
操作码
50
CS
3 0 0 0
1 0 0 0
3 1 0 5 0
代码段
.
.
.
.
.
.
IP
5 0
.
.
.
操作码31050H
ROM
2, 段内间接寻址
这种寻址方式在段内进行, 其转移的目标地址是 16位寄
存器或两个相邻的存储单元的内容, 即以寄存器或存储
器单元内容来更新 IP的内容 。 如图 3-11所示 。
例,JMP CX
JMP WORD PTR[BX]
操作码
CS 3 0 0 0
4 0 0 0
3 4 0 0 0
代码段
.
.
.
.
.
.
CX(IP)
.
.
.
操作码
34000H
ROM
3, 段间直接寻址
在这种寻址方式中, 指令码中将直接给出 16位的段地址
和 16位的段内偏移地址 。
例,JMP FAR PTR DADD1
操作码
CS 4 0 0 0
4 3 0 0 0
代码段
43000H
3 0 0 0
ROM
IP
.
.
.
偏移量低字节0 0
偏移量高字节3 0
段地址低字节0 0
段地址高字节4 0


操作码
4, 段间间接寻址
这种寻址方式和段内间接寻址相似 。 但是, 由于确定转移地
址需要 32位信息, 因此只适用于存贮器寻址方式 。 用这种寻
址方式可计算出存放转移地址的存贮单元的首地址, 与此相
邻的 4个单元中, 前两个单元存放 16位的段内偏移地址;而
后两单元存放的是 16位的段地址, 如图 3-13所示 。
例,JMP DWORD PTR[BP][DI]
操作码
CS 8 0 0 0
8 2 0 0 0
代码段
2 0 0 0
ROM
IP
偏移量低字节0 0
偏移量高字节2 0
段地址低字节0 0
段地址高字节8 0


操作码
.
.
.
.
.
.
.
.
.
3 0 0 0
1 0 0 0
2 0 0 0
SS
BP
DI
3 3 0 0 0
33000H
82000H
8086的指令系统大致可分为 6种类型:
① 数据传送指令
② 算术运算指令
③ 逻辑运算和移位指令
④ 串操作指令
⑤ 程序控制指令
⑥处理器控制指令
§ 3.2 8086指令系统
3.2.1数据传送指令
8086有 5类传送指令,以实现 CPU的内部寄存器之间、
CPU和存储器之间,CPU和 I/O端口之间的数据传送。
1,通用传送指令
通用传送指令中包括最基本的传送指令 MOV,交换指令
XCHG,椎栈指令 PUSH和 POP,字节、字转换指令 CBW和 CWD。
( 1) 最基本的传送指令
指令格式,MOV OPRDl,OPRD2
执行功能,该指令可把一个字节或一个字操作数从源地
址传送到目的地址中去 。
OPRD1:可以是累加器, 寄存器, 存贮器以及立即操作数
OPRD2:可以是累加器、寄存器和存贮器。
段寄存器
CS,DS,SS,ES
存贮器
立即数
通用寄存器
AX,BX,CX,DX
BP,SP,SI,DI
图 3-14 数据传送方向示意图
1)在 CPU各内部寄存器之间传送数据(除代码
段寄存器 CS和指令指针 IP以外)。
MOV AL,BL ; BL中的 8位数据送 AL
MOV DH,CL ; CL中的 8位数据送 DH
MOV CX,AX ;将 AX中的 16位数据送 CX
MOV BX,DI ;将 DI中的 16位数据送 BX
MOV DS,AX ;将 AX中的 16位数据送 DS
MOV ES,AX ;将 AX中的 16位数据送 ES
2)立即数传送至 CPU的内部通用寄存器(即 AX,BX、
CX,DX,BP,SP,SI,DI),给这些寄存器赋值。
MOV CL,4 ;立即数 8送入 CL中
MOV AX,03FFH ;将立即数数 03FFH送入 AX中
MOV CX,1000H ;将立即数 1000H送入 CX中
MOV BL,40 ;将立即数 40送 BL中
MOV SI,057BH ;将立即数 057BH送入 SI中
3) CPU内部寄存器(除了 CS和 IP以外)与存贮器
(所有寻址方式)之间的数据传送,与前述一样可以
传送一个字节也可以传送一个字。
MOV AL,BUFFER ;将 BUFFER为首地址的一个单 元内容送 AL
MOV AX,[BX] ; BX和 BX+1所指的两个内存单元的内容送 AX
MOV [DI],AX ;累加器的内容送 DI和 DI+1所指的两个单元
MOV AX,[SI+4] ;将 SI+4和 SI+4+1所指的两个单元内容送入 AX
需要注意的是, MOV指令不能在两个存贮器单元之间进
行数据直接传送 。 为了实现存贮器单元之间的数据传送,
必须用内部寄存器作为中介 。
MOV AL,DATAl
MOV DATA2,AL
( 2) 交换指令
指令格式,XCHG OPRDl,OPRD2
执行功能:交换指令把一个字节或一个字的源操作数
与目的操作数相交换。
XCHG AL,CL ;累加器低 8位和通用寄存器 CL之间交换
XCHG AX,DI ;累加器 AX和通用寄存器 DI之间交换
XCHG BX,SI ;通用寄存器 BX和通用寄存器 SI之间交换
XCHG AX,BUFFER ;累加器 AX和 BUFFER为首地址的两个单元交换
XCHG BX,[SI] ;通用寄存器 BX和存储器 SI和 SI+1两个单元交换
( 3) 堆栈操作指令
PUSH OPRD( 压入堆栈指令 )
POP OPRD(弹出堆栈指令)
例如:
MOV AX,1234H
MOV DX,5678H
MOV SP,2000H
PUSH AX
PUSH DX

POP DX
POP AX
当执行完两条压入堆栈的指令时,堆栈中的内容
如图 3-15所示。
2000H
1FFFH
1FFEH
1FFDH
1FFCH
SP
12
34
56
78
堆栈段
2000H
1FFFH
1FFEH
1FFDH
1FFCHSP
12
34
56
78
堆栈段
..
.
..
.
..
.
..
.
① SP- l → SP ; SP=1FFFH,( SP) ← AH
② SP- l → SP ; SP=1FFEH,( SP) ← AL
③ SP- l → SP ; SP=1FFDH,( SP) ← DH
④ SP- l → SP ; SP=1FFCH,( SP) ← DL
2000H
1FFFH
1FFEH
1FFDH
1FFCH
SP
12
34
56
78
堆栈段
2000H
1FFFH
1FFEH
1FFDH
1FFCHSP
12
34
56
78
堆栈段
..
.
..
.
..
.
..
.
每执行一条压入堆栈指令, 堆栈地址指针 SP减 2,压入堆栈的数据放在栈项 。
弹出堆栈的过程与此刚好相反,每弹出 1个字,栈顶指针 SP的值加 2。
① DL← ( SP) ; SP+ l → SP, SP=1FFDH
② DH← ( SP) ; SP+ l → SP, SP=1FFEH
③ AL← ( SP) ; SP+ l → SP, SP=1FFF H
④ AH← ( SP) ; SP+ l → SP, SP=2000H
2,地址传送指令
8086有 3条地址传送指令 。
( 1) LEA指令
指令格式,LEA OPRDl,OPRD2
执行功能,该指令把源操作数 OPRD2的地址偏移量传送至
目的操作数 OPRDl中 。
源操作数必须是一个内存操作数, 目的操作数必须是一个
16位的通用寄存器 。 这条指令通常用来建立串指令操作所
需的地址指针 。
LEA BX,DATA 和 MOV BX,OFFSET DATA等价
LEA SI,BUFFER 和 MOV SI,OFFSET BUFFER等价
( 2) LDS指令
该指令完成一个地址指针的传送 。 地址指针包括段地址和
地址偏移量 。 指令执行时, 将段地址送入 DS,地址偏移
量送入一个 16位的指针寄存器或变址寄存器 。
例如,LDS SI,[BX]
是把 BX所指的 32位地址指针的段地址送入 DS,偏移地址
送入 SI。
( 3) LES指令
这条指令除将地址指针的段地址送入 ES外, 其他操作与
LDS的类似 。
例如,LES DI,[BX]
是把 BX所指的 32位地址指针的段地址送入 ES,偏移地址
送入 DI。
3,输人输出指令
输入 /输出指令用来完成累加器 ( AX/AL) 与 I/O端口之间
的数据传送功能 。
执行输入指令时, CPU可以从一个 8位端口读入一个字节
到 AL中, 也可以从两个连续的 8位端口读一个字到 AX中 。
指令格式,IN 累加器, 端口地址
执行输出指令时, CPU可以将 AL中的一个字节写到一个 8
位端口中, 或者将 AX中的一个字写到两个连续的 8位端口中 。
指令格式,OUT 端口, 累加器
端口地址的寻址范围是 64K( 0000H~ FFFFH),若端口地
址在 00H~ FFH之间,可以使用直接寻址方式,否则只能由
16位寄存器 DX来作间接寻址。
例如:
IN AX,20H ;读 20H,21H端口一个字的数据到 AX中
OUT 22H,AL ;将 AL中的数据从 22H端口输出
MOV DX,210H ;端口 地址 210H送 DX
IN AL,DX ;读 210H端口一个字节到 AL中
OUT DX,AX ;将 AX中的数据从 210H端口输出
3.2.2算术运算指令
8086可提供加, 减, 乘, 除 4种基本算术运算的操作
指令 。 这些指令可实现字节或字
的运算, 也可以用于符号数和无符号数的运算 。
存贮器
通用寄
存器
通用寄
存器
立即数 存贮器
通用寄
存器
通用寄存器 存贮器
进行加、减运算的源操作数和目的操作数的关系
1,加法指令
( 1) 不带进位的加法指令
指令格式,ADD OPRDl,OPRD2
指令功能,OPRDl← ( OPRDl) +( OPRD2)
ADD指令两个操作数相加, 结果送至目的操作数 。
源操作数可以是累加器, 通用寄存器, 存贮器和立即数 。
目的操作数可以是累加器, 通用寄存器或存贮器 。 例如:
ADD AL,30 ; AL← ( AL)+ 30
ADD AX,1000H ; AX← ( AX)+ 1000H
ADD BX,3FFH ; BX← ( BX)+ 3FFH
ADD AX,SI ; AX← ( AX)+( SI)
ADD SI,AX ; SI← ( SI)+( AX)
ADD DI,CX ; DI← ( DI)+( CX)
ADD AL,DATA[BX] ; AL← ( AL)+(( BX+ DATA))
ADD DX,DATA[BX+SI] ; DX← ( DX)+(( BX+ SI+ DATA))
ADD BETA[SI],100 ;( SI+DETA) ← (( SI+BETA))+ 100
ADD BETA[SI],AX ;( SI+DETA) ← (( SI+BETA))+( AX)
注意, 两个存储器操作不能直接相加, 段寄存器也不能
参加运算 。 在使用时还要注意两个操作数类型一致 。
例如,ADD AX,0CFA8H
若指令执行前, ( AX) =5623H,则指令执行后, ( AX) =25CBH,且
CF=1,OF=0,SF=0,ZF=0,AF=0,PF=1。
这些指令执行时, 对标志位 CF,OF,SF,ZF和 AF都会
产生影响 。
( 2) 带进位的加法指令
指令格式,ADC OPRD1,OPRD2
指令功能,OPRD1← ( OPRD1) +( OPRD2) +CY
这条指令与 ADD指令基本相同,只是在对两个操作数
进行相加运算时还应加上进位位的当前值,然后再将结
果送至目的操作数。
例如:现有两个双精度字 00127546H和 00109428H,其中
被加数 00127546H存放在 DATA1为首的内存单元中,加数
00109428H存放在 DATA2为首的内存单元中。要求结果存
放在 DATA3为首的单元中。
MOV AX,DATA1
ADD AX,DATA2
MOV DATA3,AX
MOV AX,DATA1+2
ADC AX,DATA2+2
MOV DATA3+2,AX
DATA1
DATA2
DATA3
46H
75H
12H
00H
28H
94H
10H
00H


被加数
加数
该指令对标志位的影响与 ADD指令对标志位的影响相同。
( 3) INC加 1指令
指令格式,INC OPRD
指令功能,OPRD← ( OPRD) + 1
这条指令对指定的操作数进行加 1操作, 在循环程序中常用于修改地址
指针和循环次数等 。 其操作数可以是通用寄存器, 也可以是存储器 。
该指令执行结果对标志位 AF,OF,PF,SF和 ZF有影响, 而对 CF位不
产生影响, 例如:
INC AL
INC CX
INC WORD PTR[SI]
INC BYTE PTR [SI+BX]
2,减法指令
( 1) 不带借位的减法指令
指令格式,SUB OPRDl,OPRD2
指令功能,OPRD1← ( OPRD1) - ( OPRD2)
该指令用来对目的操作数和源操作数的字或字节进行相减,
其结果存放在目的操作数 。
源操作数 OPRD2:可以是累加器, 通用寄存器, 存储器, 立即数 。
目的操作数 OPRD1:可以是累加器、通用寄存器、存储器。
SUB AL,78H ; AL← ( AL)- 78H
SUB BX,5678H ; BX← ( BX)- 5678H
SUB AX,CX ; AX← ( AX)-( CX)
SUB AL,4[SI] ; AL← ( AL)-(( SI+ 4))
SUB DX,1000H[BX+SI] ; DX← ( DX)-(( BX+ SI+ 1000H))
SUB [SI+ 5],100 ;( SI+5) ← (( SI+5))- 100
SUB [SI+ 2000H],AX ;( SI+2000H) ← (( SI+2000H))-( AX)
指令执行后对各状态标志位 OF,SF,AF,PF和 CF均可产生影响。
( 2) 带借位的减法指令
指令格式,SBB OPRD1,OPRD2
指令功能,OPRD1← ( OPRD1) - ( OPRD2) - CY
该指令与 SUB相类似, 只不过在两个操作数相减时, 还
应减去借位标志 CF的当前值 。 这条指令主要用于多字
节的减法运算 。
该指令对标志位 AF,CF,OF,PF,SF和 ZF都将产
生影响。
( 3) DEC减 1指令
指令格式,DEC OPRD
指令功能,OPRD← ( OPRD) - 1
该指令实现对操作数的减 1操作, 所用的操作数可以是
寄存器的, 也可以是存储器 。 在相减时, 把操作数看作
为无符号的二进制数 。 该指令执行结果将影响标志位 AF、
OF,PF,SF和 ZF,但对 CF标志不产生影响, 例如:
DEC BL
DEC CX
DEC BYTE PTR[SI]
( 4) NEG求补指令
指令格式,NEG OPRD
指令功能,OPRD← 0- ( OPRD)
该指令用来对操作数进行求补操作, 即用零减去操作数,
然后再将结果送回 。 相当于操作数求反加 1并保存在目的
操作数中 。
例如,NEG AL
NEG BYTE PTR[SI]
如果操作数的值为- 128( 16进制数为 80H) 或者一 32
768( 16进制数为 8000H),,执行求补指令后, 操作数没
有变化, 但溢出标志 OF=1。
( 5) 比较指令
指令格式,CMP OPRDl,OPRD2
指令功能,( OPRD1) - ( OPRD2)
该指令执行减法操作, 不保存相减的结果 。 指令执行后两操作数
的内容不变, 但相减的结果影响标志位 。 在程序设计时, 比较指
令通常为程序的转移提供条件 。
例如,CMP AX,2000H
CMP AL,50H
CMP DX,SI
CMP AX,[BX+ SI+ 10H]
比较指令在执行时,会影响标志位 AF,CF,OF,PF,SF,ZF。
如何利用状态标志来判断两操作数的关系呢? 下面分三种情况来分析 。
1) 两个操作数相等
如果所比较的两个操作数相等时, 那么标志位 ZF=1,所以根据 ZF就可
以判断两数是否相等 。
2) 两个操作数不等
两个无符号数的比较
无符号数相减时, CF就是借位标志 。 如果 CF=0,表示无借位, 即被减
数大, 减数小 。 如果 CF=1,表示有借位, 即被减数小, 减数大 。
两个有符号数的比较
两个有符号的比较时, 同符号数相比较, 相减的结果不会超出带符号数
的表示范围, 即不会产生溢出, OF=0;两个不同号的带符号数比较,
相减的结果有可能产生溢出 。 这时可以用如下结论判断 。
当 OF⊕ SF=0时, OPRD1>OPRD2。
当 OF⊕ SF=1时, OPRD1<OPRD2。
CMP AL,0 ; AL和 0进行比较
JGE NEXT ;若 AL≥ 0则转到 NEXT执行
例如,若自 BLOCK开始的内存缓冲区中,有 100个带符
号的数,希望找到其中最大的一个值,并将它放到 MAX
单元中。 MOV SI,OFFSET BLOCK
MOV AL,[SI]
INC SI
MOV CX,99
AGAIN,CMP AL,[SI]
JG NEXT
MOV AL,[SI]
NEXT,INC SI
DEC CX
JNE AGAIN
MOV MAX,AL
HLT
3,乘法指令
8086的乘法指令分为无符号数乘法指令和带符号数乘法
指令两种 。
( 1) 无符号数乘法指令 MUL
指令格式,MUL OPRD
指令功能,若 OPRD为字节数据, 则执行 AX← ( AL) × ( OPRD)
若 OPRD为字数据, 则执行 DX,AX← ( AX) × ( OPRD)
目的操作数为,AL或 AX( 隐含给出 )
源操作数为:通用寄存器, 存储器 。 不能为立即数和段
寄存器 。
MUL指令对状态标志 CF,OF有影响,SF,ZF,AF,PF
不确定。
例如,MUL AL
MUL BX
MUL WORD PRT[SI]
要完成 14× 15可以用下列指令:
MOV AL,14
MOV CL,15
MUL CL
( 2) 带符号数乘法指令 IMUL
指令格式,IMUL OPRD
指令功能,若 OPRD为字节数据, 则执行 AX← ( AL) × ( OPRD)
若 OPRD为字数据, 则执行 DX,AX← ( AX) × ( OPRD)
目的操作数为,AL或 AX( 隐含给出 )
4,除法指令
8086有两条除法指令:无符号除法指令和带符号除法指令 。
它们都可以进行字节或字除法运算, 并且规定, 8位除法的
被除数在 AX中; 16位除法的被除数在 DX与 AX中, 除数均
由指令指出 。 对 8位数除法, 商与余数分别放在 AL与 AH中,
对 16位除法, 商与余数分别放在 AX与 DX中 。
( 1) 无符号数除法指令 DIV
指令格式,DIV OPRD
指令功能,OPRD为字节数据,AL← (AX)÷ (OPRD) 商
AH← (AX)÷ (OPRD) 余数
OPRD为字数据,AX← (DX) (AX)÷ (OPRD) 商
DX← (DX) (AX)÷ (OPRD) 余数
( 2) IDIV带符号数除法指令
指令格式,IDIV OPRD
指令操作:与 DIV指令相同, 但被除数, 除数, 商, 余
数全部均为带符号数, 且余数的符号位同被除数 。 即
IDIV执行后, CF,OF,AF,PF,ZF,SF不确定 。
用 IDIV指令时, 如果是一个双字除以一个字, 则商的范
围为- 32768~ 32767;如果是一个字除以一个字节, 则
商的范围为- 128~ 127。 运算结果超出了表示范围, 那
么会作为除数为 0的情况来处理, 即产生 0号中断 。
例如:在存储器中有 X和 Y两个单元, 存有无符号数,
现要求完成 X/Y,将商存入 Z单元 。 执行的指令如下:
MOV AL,X
MOV AH,0
DIV Y
MOV Z,AL
( 3) CBW字节转换为字指令
指令格式,CBW
指令功能,AL中的符号位扩展到 AH中 。 若 AL中的
D7=0,则 ( AH) =00H;若 AL的 D7=1,则 ( AH)
=FFH。
( 4) CWD字转换为双字指令
指令格式,CWD
指令功能,AX中的符号位扩展到 DX中 。 若 AX中的
D15=0,则 ( DX) =0000H;若 AX的 D15=1,则 ( DX)
=FFFFH。
5,BCD码调整指令
在计算机中, 可用 4位二进制码来表示一个十进制码,
这种代码叫 BCD码 。 当然 BCD码只有 0~ 9共 10种编码 。
BCD码有两类:一类叫压缩的 BCD码, 所谓压缩, 就
是用 1个字节表示 2位 BCD码;另一类叫非压缩的 BCD码,
用这类代码时, 1个字节只用低 4位来表示 BCD码, 高 4
位为 0。
( 1) AAA非压缩十进制数加法调整指令
指令格式,AAA
指令功能,AL← 把 AL中的和调整为非组合的 BCD码格
式 。
AH← ( AH)+调整产生的进位值。
调整的步骤如下:
① 如 AL寄存器的低 4位在 0~ 9之间, 且 AF=0,则跳过第 ②
步, 执行第 ③ 步;
② 如 AL寄存器的低 4位为十六进制数的 A~ F或 AF=1,则 AL
中的内容加 6,AH中内容加 1,并将 AF置 1;
③ 清除 AL寄存器的高 4位;
④ AF位的值送 CF位 。
例如,ADD AL,BL
AAA
指令执行前 AX=0535H,BL=39H,可见 AL和 BL中的内容分别
为 5和 9的 ASCⅡ 码 。 第一条指令执行后, AL=6EH,AF=0;第
二条指令进行 BCD码调整的结果使 AX=0604H,AF=1,CF=1。
( 2) AAS非压缩十进制数减法调整指令
指令格式,AAS
指令功能,AL← 把 AL中的差调整为非压缩的 BCD码格式 。
AH← ( AH) -调整产生的借位值 。
这条指令主要用于 SUB或 SBB之后,减法指令必须把两个
非压缩的 BCD码相减,并把结果存放在 AL寄存器中。
( 3) AAM乘法的 BCD码调整指令
指令格式,AAM
指令功能,AX← 把 AL中的积调整为非压缩的 BCD码
格式 。
这条指令之前必须执行 MUL指令把两个非组合的 BCD
码相乘 ( 此时要求其高 4位为 0), 结果放在 AL中 。 本
指令的调整方法是:把 AL寄存器的内容除以 0AH,商
放在 AH中, 余数保存在 AL中 。 本指令根据 AL寄存器
的内容设置条件标志 SF,ZF,PF,但 OF,CF,AF位
无定义 。
( 4) AAD除法的 BCD码调整指令
对 BCD码进行除法运算时, 也要求除数和被除数都用非压
缩的 BCD码形式来表示, 这是与对 BCD码乘法的要求类似
的地方 。 这里要特别注意一点, 对 BCD码除法运算的调整
是在进行除法之前, 通过对除数和被除数进行调整来实现
的 。 调整操作如下:
AL← 10× AH+ AL
AH← 0
例如:一个数据为 65,用非压缩的 BCD码表示, 则 AH中为
00000110,AL中为 00000101,调整执行 AAD指令, 这条指
令将 AH中的内容乘以 10,再加上 AL中的内容, 这样得到 AL
的结果为 41H。 AH为 0。
这条指令根据 AL寄存器的结果设置 SF,ZF和 PF,OF,CF
和 AF无定义。
3.2.3逻辑运算和移位指令
1,逻辑运算指令
8086逻辑运算指令包括 AND( 与 ), OR( 或 ), NOT
( 非 ), XOR( 异或 ) 指令和 TEST( 测试 ) 指令 。
( 1) NOT逻辑求反指令
指令格式,NOT OPRD
指令功能,OPRD←OPRD
该指令对操作数进行求反操作, 然后将结果送回 。 操作
数可以是寄存器或存贮器的内
容 。 该指令对标志位不产生影响 。 例如:
MOV AL,8FH
NOT AL
两条指令执行后 AL=70H。
( 2) AND 逻辑, 与, 指令
指令格式,AND OPRDl,OPRD2
指令功能,OPRD1← ( OPRD1) ∧ ( OPRD2)
该指令对两个操作数进行按位相, 与, 的逻辑运
算 。 即只有参加相与的两位全为, 1”时, 相, 与,
结果才为, 1”,否则相, 与, 结果为, 0”。 相, 与,
结果送回目的操作数 。
AND指令可以进行字节操作, 也可以进行字操作 。
目的操作数 OPRDl:可以是累加器, 也可以是通
用寄存器, 也可以是存储器 。
源操作数 OPRD2:可以是立即数、寄存器,也可以
是存储器。
AND AL,0FH
AND AL,0CH
AND AX,BX
AND AX,DATA
AND DX,BUFFER[SI+BX]
AND DATA,00FFH
AND BLOCK[BP+DI],DX
某一个操作数, 如果自己与自己相, 与,, 操作数不变,
但可以使进位标志位 CF清 0。
该指令执行以后, 标志位 CF=0,OF=0。 标志位 PF,SF、
ZF反映操作的结果, 而标志位 AF未定义 。
( 3) TEST测试指令
指令格式,TEST OPRD,im; im为立即数
指令功能,OPRD1← ( OPRD1) ∧ im
该指令的操作功能与 AND指令相同, 其结果将反映在标志位
上, 但结果不送回 。
利用该指令, 可以在不改变原有操作数的情况下, 用来检测某一位或某
几位是, 0”不是, 1”。 编程时作为条件转移指令的先行指令 。
例如:若要检测 AL中的最高位是否为 1,且为 1时则转移 。 在这种情况下可以用如
下指令:
TEST AL,80H
JNZ THERE

THERE,MOV BL,05H
( 4) OR 逻辑, 或, 指令
指令格式,OR OPRDl,OPRD2
指令功能,OPRD1← ( OPRD1) ∨ ( OPRD2)
该指令对两个操作数进行按位相, 或, 的逻辑运算 。 即
只要参加相, 或, 的两位中任一位为, 1”时, 相, 或, 结
果为, 1”,如果两位都为 0时, 其结果才为 0。
OR指令可以进行字节操作, 也可以进行字操作 。
目的操作数 OPRDl:可以是累加器, 通用寄存器, 也可
以是存储器 。
源操作数 OPRD2:可以是立即数、寄存器,也可以是
存储器。
例如:
OR AL,80H
OR AX,05FFH
OR BX,SI
OR BX,DATA
OR BUFFER[BX],SI
OR BUFFER[BX+SI],8000H
( 5) XOR逻辑, 异或, 指令
指令格式,XOR OPRDl,OPRD2
指令功能,OPRD1← ( OPRD1) ⊕ ( OPRD2)
该指令对两个操作数进行按位相, 异或, 的逻辑运算 。 即只
有参加相, 异或, 的两位值不同时, 其结果为, 1”;否则就
为 0。
XOR指令可以进行字节操作, 也可以进行字操作 。
目的操作数 OPRDl:可以是累加器, 通用寄存器, 也可以
是存储器 。
源操作数 OPRD2:可以是立即数, 寄存器, 也可以是存储
器 。
例如,XOR AL,0FH
XOR AX,BX
XOR CX,[SI+ 4]
XOR 10H[BX],CX
XOR [BX+SI+ 5],AX
例如,XOR AX,AX
XOR SI,SI
指令执行后可使 AX,SI清零 。
XOR指令执行后, 标志位 CF=0,OF=0,标志位 PF,SF,
ZF将反映, 异或, 操作的结果 。 标志 AF未定义 。
2,移位指令
( 1) SAL/ SHL算术左移和逻辑左移指令
指令格式,SAL/SHL OPRD,CL/1
指令功能:这两条指令的操作结果是完全一样的, 将目
的操作数 OPRD中的二进制数向左移动 1位或 CL寄存器中
指定的位数 。 左移一位时, 操作数的最高位移出送到 CF
中, 同时最低位送 0。 目的操作数可以是 8位, 也可以 16
位 。
目的操作数 OPRD:可以是累加器、寄存器、也可是存
储器。
0CF
最低位最高位
利用左移 1位操作可实现操作数乘 2的运算 。
例如,SHL AL,1
MOV CL,4
SHL AL,CL
( 2) SAR算术右移指令
指令格式,SAR OPRD,CL/1
指令功能:将目的操作数 OPRD中的二进制数向右移动
1位或 CL寄存器中指定的位数。该指令每执行一次移位操
作,就使操作数右移一位,但符号位保持不变,而最低位
移至标志位 CF,目的操作数可以是 8位,也可以 16位。
CF
最低位最高位
例如,MOV AH,5AH
SAR AH,1
指令执行完后,( AH) =2DH,CF=0
( 3) SHR逻辑右移指令
指令格式,SHR OPRD,CL/1
指令功能:将目的操作数 OPRD中的二进制数向右移
动 1位或 CL寄存器中指定的位数。该指令每执行一次移
位操作,就使操作数右移一位,左面的最高位将补 0,
最低位移至标志位 CF中。目的操作数可以是 8位,也可
以 16位。
CF
最低位最高位
0
例如,MOV BL,4EH
SHR BL,1
指令执行后,( BL) =27H,CF=0
3,循环移位指令
( 1) ROL不带进位的循环左移指令
指令格式,ROL OPRD,CL/1
指令功能:将目的操作数 OPRD中的二进制数向左移动 1
位或 CL寄存器中指定的位数。左移一位时,操作数的最高
位移出送到 CF中,同时送至最低位。目的操作数可以是 8位,
也可以 16位。
CF
最低位最高位
例如,MOV AL,5BH
ROL AL,1
指令执行完后, ( AL) =B6H,CF=0
( 2) ROR不带进位的循环右移指令
指令格式,ROR OPRD,CL/1
指令功能:将目的操作数 OPRD中的二进制数向右移
动 1位或 CL寄存器中指定的位数。右移一位时,操作数
的最低位移出送到 CF中,同时送至最高位。目的操作数
可以是 8位,也可以 16位。
CF
最低位最高位
例如,MOV AL,6BH
ROL AL,1
指令执行完后, ( AL) =B5H,CF=1
( 3) RCL带进位的循环左移指令
指令格式,RCL OPRD,CL/1
指令功能:将目的操作数 OPRD中的二进制数向左移动
1位或 CL寄存器中指定的位数。左移一位时,操作数的最
高位移出送到 CF中,而原来的 CF位送至最低位。目的操
作数可以是 8位,也可以 16位。
CF
最低位最高位
例如,MOV AL,4CH
RCL AL,1
指令执行后, ( AL) =99H,CF=0
( 4) RCR带进位的循环右移指令
指令格式,RCR OPRD,CL/1
指令功能:将目的操作数 OPRD中的二进制数向右移动 1
位或 CL寄存器中指定的位数。右移一位时,操作数的最低
位移出送到 CF中,而原来的 CF位送至最高位。
CF
最低位最高位
例如,MOV AL,5CH
RCR AL,1
指令执行完后, ( AL) =AEH,CF=0
3.2.4串操作指令
在串操作中, 一般假定源串在数据段中 ( DS), 用 SI作
源串地址指针, 而目的串在附加段中 ( ES), 用 DI作目的串
地址指针 。
在每做一次串操作后, 若是对字节进行操作, 则 SI和 DI
的值会自动加 1或减 l;若是对字进行操作, 则 SI和 DI的值就
自动加 2或减 2,是加还是减由 DF标志寄存器来决定 。
若 DF=0,则 SI和 DI增量修改;
DF=1,则 SI和 DI做减量修改 。
在串操作前可用 STD指令使 DF位置 l,
也可以用 CLD指令使 DF位清 0。
1,MOVS串传送指令
指令格式,MOVS OPRD1,OPRD2
MOVSB ;字节传送
MOVSW ;字传送
指令功能,( DI) ← (( SI))
字节操作 SI← ( SI) ?1; DI← ( DI) ?1;
字操作 SI← ( SI) ?2; DI← ( DI) ?2;
该类指令执行时, 将把当前数据段中用 SI指针指出的源串
的一个字节或一个字传送到用 DI指针指向的附加段的目的
地址中去 。 当 DF=0且是字节传送时, 则传送后 SI,DI加 1,
以使指针指向下一个地址;当 DF=0且是字传送时, 则 SI、
DI加 2。 若 DF= 1,则 SI,DI减 1或减 2。
2,CMPS串比较指令
指令格式,CMPS OPRD1,OPRD2
CMPSB ;字节比较
CMPSW ;字比较
指令功能,(( SI)) - (( DI))
字节操作 SI← ( SI) ?1; DI← ( DI) ?1;
字操作 SI← ( SI) ?2; DI← ( DI) ?2;
该类指令执行时,将当前数据段由 SI所指出的字节和字
同当前附加段中由 DI所指出的目的串的字节或字进行比较,
把比较结果送标志位。该指令对操作数不产生影响。
3,SCAS串扫描指令
指令格式,SCAS OPRD1,OPRD2
SCASB ;字节扫描
SCASW ;字扫描
指令功能:
字节操作 AL- (( DI))
DI← ( DI) ?1;
字操作 AX- (( DI))
DI← ( DI) ?2;
该类指令是串扫描指令,用于寻找内存区中指定的数据和字
符。指令执行时,将 AL或 AX的值减去附加段中由 DI所指定
的字节或字,结果将改变标志位,但不改变操作数的值。
4,LODS串装入指令
指令格式 LODS OPRD1,OPRD2
LODSB ;字节传送
LODSW ;字传送
指令功能:
字节操作 AL← (( SI))
SI← ( SI) ?1
字操作 AX← (( SI))
SI← ( SI) ?2
该类指令是字串装入指令。它将由 SI所指定的源串字节或
字装入到累加器 AL或 AX中去,并根据 DF的值修改指针 SI,
以指向下一个要装入的字节或字。
5,STOS串存储指令
指令格式,STOS OPRD1,OPRD2
STOSB ;字节存储
STOSW ;字存储
指令功能:
字节操作 (( DI)) ← ( AL)
DI← ( DI) ?1
字操作 (( DI)) ← AX
DI← ( DI) ?2
该类指令是字串存贮指令 。 它将 AL或 AX中的字节或字存
贮到由 DI所指定的附加段中去, 且根据 DF的值来修改 DI的
值 。
6,REP重复操作前缀
它是串指令的前缀 。 当某一条指令需要多次重复时, 就可以加上该前缀 。
重复次数应放在寄存器 CX中 。 这样每重复执行一次, CX内容减 1,直
到 CX=0,才停止重复 。
7,REPE/PEPZ相等 /为零时重复操作前缀
它们是条件重复前缀 。 当条件满足时, 才重复执行后面的串指令, 一
旦条件不满足, 重复就停止 。
REPE/REPZ指令是相等重复指令,即只要 ZF=l,且 CX≠0,串指令就重
复执行。
8,REPNE/PEPNZ不相等 /不为零时重复操作前缀
它们是条件重复前缀 。 当条件满足时, 才重复执行后面的串指令, 一旦
条件不满足, 重复就停止 。
REPNE/REPNZ指令是不相等重复指令,即只要 ZF=0,且 CX≠0,串指
令就重复执行。
例如:将 1 000个字符的字符串从内存的 BUFFERl搬移到内存的
BUFFER2中去 。
MOV SI,OFFSET BUFFERl ; BUFFERl偏移地址送 SI
MOV D1,OFFSET BUFFER2 ; BUFFER2偏移地址送 DI
MOV CX,1000 ;传送次数送 CX
CLD
REPE MOVS BUFFER2,BUFFERl ;重复搬移
注意, 上述程序中的 BUFFERl应处于 DS段中, 而 BUFFER2应处于 ES段中 。
例如:将数据段中 100个字的数据块 BLOCKl搬移到同一个数据段的
BLOCK2中去 。
PUSH DS
POP ES
LEA SI,BLOCKl
LEA D1,BLOCK2
MOV CX,0064H
CLD
REPE MOVSW
例:比较 DEST和 SOURCE中的 500个字节, 找出第一
个不相同的字节, 如果找到, 则将 SOURCE中的这个
数送 AL中 。
CLD
LEA DI,DEST
LEA SI,SOURCE
MOV CX,500
REPE CMPSB
JCXZ NEXT
MATCH,DEC SI
MOV AL,BYTE PTR[SI]
3.2.5程序控指令
1,JMP无条件转移指令
这些指令都将引起程序执行顺序的改变 。 转移有段内
转移和段间转移之分 。 所谓段内转移是指段地址不变,
仅 IP发生改变;而段间转移, CS和 IP均发生改变 。
( 1) 段内直接短转移
指令格式,JMP SHORT LOOP
指令功能,IP← ( IP) + 8位偏移量
其中 LOOP 为转移目标地址,可直接使用符号地址,又
称标号。 SHORT为属性运算符,指示汇编程序将地址汇
编成 8位偏移量,范围在- 128~+ 127之内。
( 2) 段内直接近转移
指令格式,JMP NEAR PTR LOOP
或 JMP LOOPl ; NEAR可省略
指令功能,IP← ( IP) + 16位偏移量
其中 LOOP 为转移目标地址, 可直接使用符号地址, 又
称标号 。 NEAR PTR为属性运算符, 指示汇编程序将地
址汇编成 16位偏移量, 范围在 64K之内 。
近程转移 JMP NEAR PTR LOOPl
( 3) 段内间接转移
指令格式,JMP WORD PTR OPRD
指令功能,IP← ( OPRD地址所对应连续两单元的内容 )
OPRD的有效地址由寻址方式决定 。 OPRD可以为寄存器
寻址或存储器寻址的某一种 。 如果是寄存器寻址, 指令中
直接给出寄存器号, 寄存器中的内容送到 IP中;如果是存
储器寻址, 按存储器寻址方式形成的地址所对应的单元内
容给 IP指针 。 可以直接地说, 段内间接转移, 其转移地址
在寄存器中或存储器中 。
远程转移是段间的转移, 目的地址与 JMP指令所在地址不
在同一段内 。 执行该指令时要修改 CS和 IP的内容 。 例如:
JMP CX
JMP WORD PTR [BX]
( 4) 段间直接转移
指令格式,JMP FAR PTR LOOP
指令功能,IP←LOOP 的偏移地址
CS←LOOP 的所在段地址
·段间间接转移 JMP DWORD PTR[BP]][DI]
该指令指定的双字指针的第一个字单元内容送入 IP,第
二个字单元内容送入 CS,所定义的单元必定是双字单元 。
2.子程序调用和返回指令
( 1) 段内调用和返回指令
1) 段内直接调用指令
指令格式,CALL OPRD
其中 OPRD为被调用的过程或子程序的首地址 。
指令功能,SP?( SP) - 2,( SP) ?( IP)
IP?OPRD对应 16位直接地址
在程序中, OPRD一般为子程序名, 汇编时汇编成 16
位的偏移地址 。 在段内直接调用时, CALL指令首先
将当前 IP内容压入堆栈 。 把子程序的首地址送 IP,从
而实现程序调用 。
例如:在主程序中执行一条段内直接调用语句, 具体
调用形式如下:
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX


CALL DISPLAY

DISPLAY PROC NEAR
PUSH AX
PUSH BX


RET
2) 段内间接调用指令
指令格式,CALL OPRD
其中 OPRD为被调用的过程或子程序的首地址 。
指令功能:段内调用
SP?( SP) - 2,( SP) ?( IP)
IP?寄存器或存储器所对应的 16位数据
指令执行后, 把 16位通用寄存器或存储单元中的内容送入
IP中, CS保持不变 。
例如,CALL WORD PTR[SI]
CALL BX
3) 段内返回指令
指令格式,RET
指令功能,IP← ( ( SP+1), ( SP))
SP← ( SP) +2
RET指令是子程序返回的主要指令, 与调用指令配合使用 。
( 2) 段间调用与返回指令
1) 段间直接调用指令
指令格式,CALL OPRD
指令功能,SP?( SP) - 2
(( SP) + 1,( SP)) ?( CS)
SP?( SP) - 2,( SP) ?( IP)
IP?OPRD所在段的直接地址
CS?直接地址所在的段
例如:以下程序的代码段 CODE1中有一条调用指令
CALL FAR PTR WANG,而 WANG为代码段 CODE2
中的子程序, 程序的框架结构如下:
CODE1 SEGMENT

CALL FAR PTR WANG

CODE1 ENDS
CODE2 SEGMENT

WANG PROC FAR

WANG ENDP
RET
CODE2 ENDS
1) 段间间接调用
指令格式,CALL OPRD
指令功能,SP?( SP) - 2
(( SP) + 1,( SP)) ?( CS)
SP?( SP) - 2
( SP) + 1,( SP) ?( IP)
IP?OPRD所在存储单元的前两个单元的内容
CS? OPRD所在存储单元的后两个单元的内容
例如,CALL DWORD PTR [BX]
2) 段间返回指令
指令格式,RET
指令功能,IP← ( ( SP+1), ( SP))
SP← ( SP) +2
CS← ( ( SP+1), ( SP))
SP← ( SP) +2
即连续执行两次出栈操作,首先弹出的送入 IP中,第二
次弹出的送入 CS中。
3,条件转移指令
8086有 18条不同的条件转移指令。它们根据标志寄存
器中各标志位的状态,决定程序是否进行转移。条件转
移指令的目的地址必须在现行的代码段( CS)内,并且
以当前指针寄存器 IP内容为基准,其位移必须在- 128~
+127的范围之内。因此条件转移指令的范围是有限的,
不像 JMP指令那样可以转移到内存的任何一个位置上。
指令类型 指令格式 指令功能 测试条件
无条件
转移
JMP 目标标号
CALL 过程名
RET
无条件转移
过程调用
过程返回
条件
转移





JA/JNBE 目标标号
JAE/JNB 目标标号
JB/JNAE 目标标号
JBE/JNA 目标标号
高于 /不低于也不等于 转移
高于或等于 /不低于 转移
低于 /不高于也不等于 转移
低于或等于 /不高于 转移
CF=0且 ZF=0
CF=0或 ZF=1
CF=1且 ZF=0
CF=1或 ZF=1





JG/JNLE 目标标号
JGE/JNL 目标标号
JL/JNGE 目标标号
JLE/JNG 目标标号
大于 /不小于也不等于 转移
大于或等于 /不小于 转移
小于 /不大于也不等于 转移
小于或等于 /不大于 转移
ZF=0且 OF⊕ SF=0
OF⊕ SF=0或 ZF=1
OF⊕ SF=1或 ZF=0
OF⊕ SF=1或 ZF=1



JC 目标标号
JNC 目标标号
JE/JZ 目标标号
JNE/JNZ 目标标号
进位位为 1 转移
进位位为 0 转移
等于 /结果为 0 转移
不等于 /结果不为 0 转移
CF=1
CF=0
ZF=1
ZF=0





JO 目标标号
JNO 目标标号
JNP/JNO 目标标号
JP/JO 目标标号
JNS 目标标号
JS 目标标号
溢出 转移
不溢出 转移
奇偶位为 0/奇偶位为奇 转移
奇偶位为 1/奇偶位为偶 转移
符号标志位为 0 转移
符号标志位为 1 转移




LOOP 目标标号
LOOPE/LOOPZ 目标标号
LOOPNE/LOOPNZ目标标号
JCXZ 目标标号
循环
等于 /结果为 0循环
不等于 /结果不为 0循环
CX内容为 0转移


INT 中断类型
INTO
IRET
中断
溢出时中断
中断返回
4,循环控制指令
这类指令用于控制程序的循环, 其控制转向的目的地
址是在以当前 IP内容为中心的- 128~ 127的范围内 。 这
类指令用 CX作计数器, 每执行一次指令, CX内容减 1,
直到减为 0,循环才结束 。
( 1) 指令格式,LOOP OPRD
指令功能,CX← ( CX) - 1若 CX≠0循环 。
( 2) 指令格式,LOOPNE OPRD
指令功能,CX← ( CX) - 1若 CX≠0且 ZF= 0循环 。
( 3) 指令格式,LOOPE OPRD
指令功能,CX← ( CX) - 1若 CX≠0且 ZF=l循环 。
在 LOOPE和 LOOPNE两条指令中,只要两个条件中
任 — 个不满足,循环就结束。
5,处理器控制指令
STC 置进位标志, 使 CF=1
CLC 清进位标志, 使 CF=0
CMC 进位标志求反
STD 置方向标志, 使 DF=1
CLD 清方向标志, 使 DF=0
STI 开中断标志, 使 IF=1
CLI 清中断标志, 使 IF=0
HLT 使 8086处理器处于停止状态 。
WAIT 使处理器处于等待状态
LOCK 封锁总线指令, 可放在任一指令前作为前
缀NOP 空操怍指令, 处理器什么操作也不做
DOS功能调用可完成 I/O设备管理, 存储管理, 文
件管理和作业管理等功能 。 对于用户来说, 这些
功能模块就是几十个独立的中断服务程序, 这些
程序的入口地址已由系统置入中断向量表中, 在
汇编语言程序中可用软中断指令直接调用 。 这样,
用户就不必深入了解有关设备的电路和接口, 只
须遵照 DOS规定的调用原则即可使用 。
§ 3.3 DOS 功能调用
中断 功能 入口参数 出口参数
INT 20H 程序正常退出
INT 21H 系统功能调用 AH=功能号,相应入口号

相应出口号数
INT 22H 结束退出
INT 23H Ctrl+Break退

INT 24H 出错退出
INT 25H 读盘 AL=驱动器号
CX=读入扇区数
DX=起始逻辑扇区号
DS,BX=内存缓冲区地址
CF=1读盘出错
CF=0读盘正常
INT 26H 写盘 AL=驱动器号
CX=写入扇区数
DX=起始逻辑扇区号
DS,BX=内存缓冲区地址
CF=1写盘出错
CF=0写盘正常
INT 27H 驻留退出
INT 28~ 2EH DOS保留
INT 2FH 打印机
INT 30H~ 3FH DOS保留
1.系统功能调用方法
要完成系统功能调用, 基本按如下步骤:
( 1) 将入口参数送到指定寄存器中 。
( 2) 子程序功能号送入 AH寄存器中 。
( 3) 使用 INT 21H指令 。
2.常用的几种系统功能调用
( 1) 键盘输入单字符
这是 1号系统功能调用, 使用格式如下所示:
MOV AH,1
INT 21H
( 2) 输出单字符
这是 2号系统功能调用, 使用格式如下所示:
MOV DL,’ A ’
MOV AH,2
INT 21H
执行 2号系统功能调用时, 将置入 DL寄存器中的字符
从屏幕上显示输出 ( 或打印机打印输出 ) 。
( 3) 键盘输入字符串
这是 10号系统功能调用,其功能是将键盘输入的字符
串写入到内存缓冲区中,因此必须事先在内存储器中
定义一个缓冲区。
10号系统功能调用的使用格式如下所示:

BUF DB 20H
DB?
DB 20DUP(?)

MOV DX,OFFSET BUF
MOV AH,10
INT 21H

由变量定义语句定义了一个
可存入 20个字节的缓冲区,
执行到 INT 21H指令时,系统
等待用户键入字符串。程序
员每键入一个字符,其相应
的 ASCⅡ 码将被写入缓冲区
中,待程序员最后键入回车
键时,由系统输出实际键入
的字符数,并将其写入缓冲
区的第 2字节中。
( 4) 输出字符串
这是 9号系统功能调用, 其功能是将指定的内存缓冲中字
符串从屏幕显示输出 。 缓冲区中的字符串以, $”字符作
为结束标志 。
9号系统功能调用的使用格式如下所示:

BUF DB ‘How are you! $’

MOV DX,OFFSET BUF
MOV AH,9
INT 21H

( 5) 从串行输入单字符
这是 3号系统功能调用, 其使用格式如下:
MOV AH,3
INT 21H
它没有入口参数, 系统将从异步通信口串行输入的字符
置入 AL寄存器中 。
( 6) 向串口输出单字符
这是 4号系统功能调用, 其使用格式如下:
MOV DL,’ $’
MOV AH,4
INT 21H
执行结果将 DL寄存器中的字符通过异步通信口串行输出。
( 7) 直接控制台输入 /输出单字符
这是 6号系统功能调用, 如果 ( DL) =0FFH,则表示从键
盘输入单字符送 AL寄存器中;如果 ( DL) ≠ 0FFH,则表
示将 DL寄存器中内容送屏幕显示输出 。 它们的使用格式
如下:
MOV DL,0FFH
MOV AH,6 ;键盘输入单字符送 AL中
INT 21H
MOV DL,’ A’
MOV AH,6 ;将 DL中的字符, A”送屏幕显示
INT 21H
( 8) 无回显直接控制台输入单字符
这是 7号系统功能调用, 等待从标准输入设备输入单
字符置入 AL寄存器中, 但不送屏幕显示 。 其使用格式
如下:
MOV AH,7
INT 21H
它没有入口参数, 系统等待从控制台标准输入设备输
入单字符后, 将其 ASCⅡ 置入 AL寄存器中 。
( 9) 无回显键盘输入单字符
这是 8号系统功能调用, 等待从键盘输入单字符, 将其
ASCⅡ 码置入 AL寄存器中 。 但不送屏幕显示, 其使用
格式如下:
MOV AH,8
INT 21H
它没有入口参数, 与 1号系统功能调用的区别仅在于键
入的字符不送屏幕显示 。
( 10) 返回操作系统
这是 4CH号系统功能调用, 其使用格式如下:
MOV AH,4CH
INT 21H
( 11) 设置日期
这是 2BH号系统功能调用, 其功能是设置有效日期 。 例如,
设置当前日期是 2004年 11月 26日 。 其使用格式如下:
MOV CX,2004H
MOV DH,11H
MOV DL,26H
MOV AH,2BH
INT 21H
( 12) 取得日期
这是 2AH号系统功能调用, 其功能是将当前有效日期取到
CX和 DX寄存器中, 存放格式与设置日期相同, 其使用格式
如下:
MOV AH,2AH
INT 21H