第 二 章 8086的 指 令 系 统
1封面第 二 章 8086的 指 令 系 统
2第二章 8086指令系统目录第二章 8086的指令系统概 述
2.1 数据传送类指令
2.2 算术运算类指令
2.3 位操作类指令
2.4 控制转移类指令
2.5 串操作类指令
2.6 处理机控制类指令要点与习题分析第 二 章 8086的 指 令 系 统
3概述概 述
① 8086的指令系统按功能分类可以分成六组,本章分类逐条讲解。
②在汇编语言中,指令的一般格式为
[标号,]指令助记符 目的操作数,源操作数 [:注释 ]
其中括弧括起的部分不是必需的,为可选项。,标号,
在第三章详细介绍。
③后面讲解指令时,除前一章介绍的符号外,本书用 AX,BX… 形式表示寄存器的内容。
④学习一条指令应掌握的内容,指令的功能 操作数的寻址方式 指令对标志的影响 避免非法指令 …
返回第二章第 二 章 8086的 指 令 系 统
42.1节 目录 2.1.1--2.1.5(传送)
2.1 数据传送指令
2.1.1 通用数据传送指令
MOV/XCHG/XLAT
2.1.2 堆栈操作指令
PUSH/POP
2.1.3 标志传送指令
LAHF/SAHF/PUSHF/POPF
2.1.4 地址传送指令
LEA/LDS/LES
2.1.5 输入输出指令
IN/OUT
返回第二章第 二 章 8086的 指 令 系 统
52.1.1 目录,1~3
2.1.1 通用数据传送指令
1.MOV类指令
MOV reg/mem,imm;
MOV seg/reg/mem,reg;
MOV seg/reg,mem;
MOV reg/mem,seg
2.交换指令 XCHG
3.换码指令 XLAT
2.1节 目录第 二 章 8086的 指 令 系 统
62.1.1-1 mov类例 1
1.MOV 类指令格式 1,MOV reg/mem,imm
MOV AX,2050H / MOV CL,58H
MOV BYTE PTR [BX],55H/MOV WORD PTR [BX],55H
MOV BYTE PTR [SI+05],55H
MOV BYTI PTR [BP+DI],55H
MOV BYTE PTR [BX+DI+2000H],55H
MOV BYTE PTR [4050H],55H
………………………………………………………
① MOV 55H,AL ② MOV DH,385 ③ MOV BX,55H√
④ MOV [BX],55H ⑤ MOV DS,2000H
MOV BYTE PTR[BX],55H
MOV WORD PTR[BX],55H
第 二 章 8086的 指 令 系 统
7mov类例 2
格式 2,MOV seg/reg/mem,reg
MOV DS,AX/MOV ES,AX/MOV SS,AX
MOV AX,BX /MOV SP,AX /MOV DH,CL/MOV AL,BH
MOV [2050H],AX / MOV [2050H],BL
MOV [BX+SI+2000H],DX / MOV 2005H[BP][DI],CL
……………………………………………………………
MOV DS,AL / MOV CS,AX
MOV DL,AX / MOV BX,CL / MOV SI,CH / MOV BL,DI
CS不能做目的操作数第 二 章 8086的 指 令 系 统
8mov类例 3
格式 3,MOV seg/reg,mem
MOV DS,[BX] / MOV ES,[BP+SI+25H]
MOV AX,[2050H] / MOV AL,[2050H]
……………………………………………………………
注意,MOV mem,mem 形式的指令是非法指令,也就是说,如果一条指令有两个操作数,不允许两个操作数都是存储器数,如下列指令为非法指令:
MOV [BX],[2050H] / MOV [2050H],[BX+SI]
该项规定不仅适用于,MOV‖类指令,也适用于其他各类指令(串操作除外)。
记住,CS不能作目 的 操 作 数第 二 章 8086的 指 令 系 统
9mov类例 4( END)
格式 4,MOV reg/mem,seg
MOV AX,DS / MOV BX,ES / MOV AX,CS
MOV [SI],DS / MOV [BX+SI],CS
……………………………………………………………
―MOV‖类指令小结,
① 立即数只能作源操作数,且要与目的操作数匹配。
②两个操作数类型要匹配。
③如汇编程序无法确定操作类型,要加类型说明符。
④ CS一般不能作目的操作数(用转移指令改变)。
⑤如果指令有两个操作数,不允许两个都是存储器数。
⑥上述四类格式以外的指令必定是非法指令。
⑦所有,MOV‖类指令均不影响标志。
CS可以作源操作数返回 2.1.1
MOV [BX],[2050H]
第 二 章 8086的 指 令 系 统
102.1.1-2,xchg --3.XLAT
2.交换指令 XCHG
指令格式,XCHG reg/mem,reg/mem;将操作数格式,mem,mem‖ 排除在外!
例,XCHG AX,BX / XCHG DH,CL
XCHG CX,[2000H] / XCHG [BX+SI],AL
交换指令不影响标志。
3.换码指令 XLAT
指令格式,XLAT ; AL←[DS × 16+BX+AL]
该指令的操作数是隐含的( AL),且寻址方式可理解为寄存器相对寻址,偏移量在 AL中。
该指令又称,查表指令,,通常用于编写查表程序。
换码指令不影响标志。
第 二 章 8086的 指 令 系 统
11查表示意图 (end)
16
09
04
01
00
25
查表步骤 (求某数的平方)
①在内存中建立数据表格;
②将表格的首地址送入 BX中;
③假定要求,3‖的平方,将 3送入寄存器 AL中;
④执行指令 XLAT;
⑤执行,AL←[BX+3] ( DS)
执行结束,AL= 9。
AL中的内容被,换码,!
表格首地址查表示意图
2.1节 目录
×××× H
第 二 章 8086的 指 令 系 统
122.1.2堆栈操作指令( 1)
2.1.2 堆栈操作指令能够实现,后进先出(先进后出)的存储器组织
(或存储器块)称为堆栈。
引入堆栈:以三层子程序嵌套为例,逐级进入子程序时,A,B,C三点都有断点和现场需要保护,顺序为
A→B→C ;当子程序 sub3执行结束,逐级返回时,
A B C
main sub1 sub2 sub3 最后被保护的 C点数据应最先恢复,最先保护的 A
点数据应最后恢复。为此,
通常在内存中开辟一段区域,结合软硬件技术,使其具有保护数据和后进先出的功能。此为堆栈。
第 二 章 8086的 指 令 系 统
13堆栈操作指令( 2)
8086堆栈管理,8086使用段寄存器 SS和指针寄存器 SP管理堆栈,SS决定了堆栈区的首地址,SP的初始
SS:0000H
SS:SP
堆栈区值决定了堆栈区的末地址,堆栈区的最大长度随之而定。数据入栈时,SP做减量调整,SP
指示的单元称为,栈顶,,即栈顶向下延伸; SP永远指向刚刚入栈的数据。数据出栈时,SP
做增量调整,即栈顶向上延伸
SP永远指向将要出栈的数据。
数据入栈数据出栈 入栈的数据全部出完,SP恢复初始值。
第 二 章 8086的 指 令 系 统
14堆栈操作指令( 3)
1.PUSH r16/m16/seg;,r16/m16/seg‖作为源操作数,
堆栈中的存储单元作为目的操作数,指令操作如下:
① SP←SP -1,SS:[SP]←src 高 8位
② SP←SP -1,SS:[SP]←src 低 8位例 1,PUSH [BX];(设 DS:[BX]字单元数据为 55AAH)
xxH
xxH
xxH
AAH
55H
xxHSS:[SP]
指令执行前 指令执行后
SS:[SP]
第 二 章 8086的 指 令 系 统
15堆栈操作指令( 4)
2.POP r16/m16/seg;,r16/m16/seg‖应看作目的操作数,
堆栈中的单元看作源操作数,指令操作如下:
① dest低 8位 ← SS:[SP],SP ← SP+1
② dest高 8位 ← SS:[SP],SP ← SP+1
例 2,POP BX;设接在例 1后执行。
AAH
55H
xxH
SS:[SP]
指令执行前
AAH
55H
xxHSS:[SP]
指令执行后
55AAH
BX
第 二 章 8086的 指 令 系 统
16堆栈操作指令( 5) (END)
使用堆栈指令:
①堆栈操作是字操作指令,不要写出,PUSH AL‖等。
②在,POP‖指令中,,POP CS‖为非法指令。
③堆栈中的数据弹出后,数据并没有在堆栈中消失,
除非压入新数据,画图时注意。
④堆栈操作指令不影响标志。
④使用堆栈指令保护和恢复现场时,要注意指令的排列顺序,如:
PUSH AX
PUSH BX
PUSH DS
..
..
..
POP DS
POP BX
POP AX
2.1节 目录第 二 章 8086的 指 令 系 统
17
2.1.3标志传送指令 (1)
2.1.3 标志传送指令
1.标志寄存器传送
① LAHF ; AH← 标志寄存器低 8位,即 SF/ZF/AF; PF/CF送 AH相应位,不影响标志。
② SAHF ;标志寄存器低 8位 ← AH,该条指令影;响前五个标志。
③ PUSHF ;标志寄存器入栈,不影响标志。
④ POPF ;标志寄存器 ← SS:[SP],SP←SP+2 ;;该指令影响标志。
第 二 章 8086的 指 令 系 统
18
标志传送指令 (2)(end)
2.标志位操作
( 1) CF标志
★ CLC ; CF←0 ★ STC ; CF←1 ★ CMC ; CF←CF
( 2) DF标志(串操作指令使用)
★ CLD ; DF←0 ★ STD ; DF←1
(3) IF标志(控制可屏蔽中断能否被响应)
★ CLI ; IF←0 ★ STI ; IF←1
注释:对其他标志没有提供直接修改的指令,但是如果必要,可以用前述的四条标志传送指令结合逻辑运算指令进行修改。
2.1节 目录第 二 章 8086的 指 令 系 统
19
2.1.4地址传送指令 (1)
2.1.4 地址传送指令
1.有效地址传送指令 LEA
LEA r16,mem ; r16←mem 所指单元的偏移地址例:设 BX=0400H,SI=003CH
LEA BP,[2050h];执行后 BP=2050H
LEA BP,[SI];执行后 BP=003CH
LEA BX,[BX+SI];执行后 BX=043CH
LEA BX,[BX+SI+0F62H];执行后 BX=139EH
备注:①指令中,r16‖常用的寄存器是 BX,BP,SI,DI。
一般不使用其他寄存器。
②指令中源操作数常用的是变量名,而不是上面例子中例举的形式,如,LEA BX,WORD_VAR。所以,本条指令常被描述为,取变量的偏移地址,,属常用指令。
第 二 章 8086的 指 令 系 统
20
地址传送指令 (2)
2.指针传送指令 LDS
LDS r16,mem ; r16←mem,DS←mem+2
操作,① 按 mem规定的寻址方式计算某单元物理地址。
②按计算出的物理地址做双字操作,即前一个字(偏移指针)送 r16,高位字(段指针)送 DS。
例:设 DS=400H,BX=100H,SI=200H,
[04300]=2050H,[04302H]=0500H
LDS SI,[BX+SI]执行后 DS=0500H,SI=2050H
示意图,LDS SI,[BX+SI]
05H
00H
20H
50H
04000H
0100H
0200H+
04300H
DSx16
BX
SI
04300H
DS SI
第 二 章 8086的 指 令 系 统
21
地址传送指令 (3)(end)
3.指针传送指令 LES
LES r16,mem ; r16←mem,ES←mem+2
操作解释,基本与,LDS‖指令相同,不同的是把段寄存器
DS换成 ES。
★ 其他问题:①,LEA‖指令的作用为取偏移地址,
要注意与,MOV‖指令区别:
设 SI=2050H,DS:[2050H](DS:[SI])=55AAH
则,LEA BX,[SI]‖执行后,BX=
―MOV BX,[SI]‖执行后,BX=
② ―LDS‖的 r16常用 SI;,LES‖中,r16常用 DI。
③地址传送指令不影响标志。
2050H
55AAH
2.1节 目录第 二 章 8086的 指 令 系 统
222.1.5输入输出指令 (1)
2.1.5 输入输出指令
1.输入指令
IN AL,i8;字节输入,AL← 端口 i8
IN AX,i8;字输入,AL← 端口 i8,AH← 端口 i8+1
IN AL,DX;字节输入,AL← 端口 [DX]
IN AX,DX;字输入,AL← 端口 [DX],AH←[DX+1]
注释:①,i8‖从形式上来说是立即数,实际上是端口地址,因而指令的寻址方式为直接寻址。
②,MOV‖指令中,直接寻址要加中括号,输入输出指令不加。( MOV AL,[2000H]; IN AL,25H)
③第三、四两条指令为寄存器间接寻址,但对 DX不加中括号。( mov al,[bx]; in al,dx)
第 二 章 8086的 指 令 系 统
23输入输出指令 (2)
2,输出指令
OUT i8,AL;字节输出,端口 i8←AL
OUT i8,AX;字输出,端口 i8←AL,端口 i8+1←AH
OUT DX,AL;字节输出,端口 [DX]←AL
OUT DX,AX;字输出,端口 [DX]←AL,[DX+1]←AH
注释:①输入输出指令从寻址方式来说分成两种:
直接寻址和寄存器 DX间接寻址。如果要访问的端口地址在 0~ 255之间,既可以用直接寻址,也可以用 DX间接寻址;如果要访问的端口地址 ≥ 256,则只能用 DX间接寻址。②另外,输入输出指令中可用的数据寄存器只能是
AL和 AX,其他寄存器不可使用。③不影响标志。
第 二 章 8086的 指 令 系 统
24输入输出指令 (3)(end)
例题,(对错混合)
1.IN AL,205H (× ) 7.MOV AX,55AAH
2.IN AX,20H MOV DX,3FCH
3.IN AL,25H OUT [DX],AX
4.IN AH,0FFH (× ) 8.MOV AH,86
5.MOV DX,2050H OUT 25H,AH (× )
OUT DX,AL 9.IN AL,25H
6.MOV DX,2050H MOV BL,AL
IN BX,DX (× ) IN AL,36H
(OUT DX,BX ) (× ) MOV BH,AL……
2.1节 目录第 二 章 8086的 指 令 系 统
252.2节 目录 2.2.1--2.2.6(算术)
2.2 算术运算指令
2.2.1 加法指令
ADD/ADC/INC
2.2.2 减法指令
SUB/SBB/DEC/NEG/CMP
2.2.3 乘法指令 MUL/IMUL
2.2.4 除法指令 DIV/IDIV
2.2.5 符号扩展指令 CBW/CWD
2.2.6 十进制调整指令
(BCD)/DAA/DAS/AAA/AAS/AAM/AAD
返回第二章第 二 章 8086的 指 令 系 统
262.2.1加法指令 (1)
2.2.1 加法指令
1,ADD
ADD reg/mem,imm; dest← dest+src
ADD reg/mem,reg/mem; dest← dest+src;排除操作数,mem,mem
2.ADC
指令格式同 ADD; dest← dest+src+CF
3.INC
INC reg/mem ; reg/mem← reg/mem+1
第 二 章 8086的 指 令 系 统
27加法指令 (2)
注释:
①加法指令对标志的影响,ADD和 ADC指令对所有的 6
个状态标志都有影响,INC指令不影响 CF,影响其他五个标志。学习加减法指令要会设置标志、使用标志。
②加减法运算要注意 OF和 CF的意义不同,用法不同。
例题,(对错混排)
ADD AL,25H ADD BYTE PTR[BX],05
ADD AL,125H ADD WORD PTR[BX],05
ADD AX,2500H ADD [BX],2050H
ADD AX,05 ADD AL,BL
ADD [BX],05 ADD CH,DL
第 二 章 8086的 指 令 系 统
28加法指令 (3)
ADD BH,CX
ADD AX,DX
ADD SI,BP
ADD BX,[BX+SI]
ADD DX,[BX+DI]
ADD AX,[BX+BP]
ADD AX,[SI+DI]
ADD
[BP+DI+205H],AL
ADD [BP+SI],CX
ADD [BX],[SI+05H]
前面所有指令都可以换成
ADC。对于多字节加法,最低字节(字)可以用 ADD,剩下的应使用 ADC。如 (dx ax)+(si di)
ADD AX,DI;低 16位相加
ADC DX,SI;高 16位相加 +CF
INC 25H
INC AL
INC CX
INC [BX+SI]
INC BYTE PTR[BX+SI]
INC WORE PTR[BX+DI+25]
第 二 章 8086的 指 令 系 统
29加法指令 (4)
加法指令标志设置设 AL=76H ADD AL,65H
01110110
+ 01100101———————
11011011
AL=0DBH,OF=1,SF=1,ZF=0
AF=0,PF=0,CF=0
OF=1,只对有符号数运算有意义。看作有符号数是 +118+101,应等于 +219,大于 +127,因而溢出。
CF=0,只对无符号数运算有意义。 118+101=219,
219< 255,无进位。
第 二 章 8086的 指 令 系 统
30加法指令 5 end
加法指令 OF设置方法:
① (正 +负 )或 (负 +正 )永远不会溢出,OF=0。
②正 +正,结果为正(符号位为 0),OF=0。
结果为负(符号位为 1),OF=1。
③负 +负,结果为负(符号位为 1),OF=0。
结果为正(符号位为 0),OF=1。
计算 0FCH + 0FBH
11111100+ 11111011
——————111110111
看作有符号数运算,(-4)+(-5)=(-9) ∴ OF=0
看作无符号数运算,252 + 251=503 ∴ CF=1
返回 2.2
第 二 章 8086的 指 令 系 统
312.2.2减法指令 (1)
2.2.2 减法指令
1.SUB
SUB reg/mem,imm; dest← dest - src
SUB reg/mem,reg/mem; dest← dest - src; 排除操作数,mem,mem
2.SBB
指令格式同 SUB; dest← dest – src – CF
3.DEC
DEC reg/mem ; reg/mem← reg/mem -1
第 二 章 8086的 指 令 系 统
32减法指令 (2)
减法指令用法:
① SUB,SBB,DEC三条指令的指令格式以及基本用法与 ADD,ADC,INC相同。
② SUB和 SBB影响所有六个状态标志:
AF为半借位,CF为借位;
其余 4个标志的含义同加法指令。
③ DEC不影响 CF标志,影响其他五个标志。
第 二 章 8086的 指 令 系 统
33减法指令 (3)
OF和 CF标志设置,
① OF仅仅对有符号数运算有意义。
(正数 sub正数)或(负数 sub负数) OF=0
正数 sub负数,结果的符号位为 0,OF=0
结果的符号位为 1,OF=1
负数 sub正数,结果的符号位为 1,OF=0
结果的符号位为 0,OF=1
② CF设置,(借位标志,仅仅对无符号数运算有意义,对 有符号数运算无意义 。 )
够减 CF=0; 不够减 CF=1。
第 二 章 8086的 指 令 系 统
34减法指令 (4)
4.NEG 求补指令
NEG reg/mem ; reg/mem← 0 — reg/mem
①,求补运算”一般表达为,取反加一”,与“零减”
等同。例如,将 8位二进制数表示为 XXXX XXXXB,
0-XXXX XXXXB =( 1111 1111B + 1 )-XXXX XXXXB 即
1 1 1 1 1 1 1 1
- X X X X X X X X
X=0 1-X=1
X=1 1-X=0
即1 -X= X
X X X X X X XX
结论,0 -X=X +1 (X为二进制数)
第 二 章 8086的 指 令 系 统
35减法指令 (5)
② NEG相当于减法指令,标志设置与减法指令相同;
(只有对零求补,CF=0,其他情况CF=1)
(设字长为 8位,对 -128求补时,OF=1,其它 OF=0)
例 1:设 AL=1010 1010B 执行 NEG AL;
AL=0101 0101B+1=01010110B
例 2,设 DS:[BX]=(-4)补 =1111 1100
执行 NEG BYTE PTR[BX] 后则 DS:[BX]=0000 0100=+4( -4的绝对值);
结论:对一个负数的补码求补,得到该负数的绝对值。
(其实,反过来也一样,对 +4执行NEG指令,将得到 -4的补码。)
第 二 章 8086的 指 令 系 统
36减法指令 (6)(end)
5.CMP
CMP reg/mem,imm ; dest – src
CMP reg/mem,reg/mem; 排除操作数,mem,mem; dest – src
与减法指令不同的是不保留运算结果,即不改变目的操作数,只根据运算结果设置标志。
该指令常用来比较两数大小。执行 CMP dest,src
无符号数比较,CF=0 dest≥src
CF=1 dest< src
有符号数比较,情况较为复杂,在条件转移指令介绍。
返回 2.2
第 二 章 8086的 指 令 系 统
372.2.3乘法指令 (1)
2.2.3 乘法指令
1.无符号数乘法指令
MUL r8/m8; AX←AL × r8/m8,字节乘
MUL r16/m16; DX,AX←AX × r16/m16,字乘注释:①指令指定的是乘数,被乘数是隐含的。如乘数类型为字节,则被乘数为 AL,16位乘积用 AX;如乘数类型为字,则被乘数为 AX,32位乘积用 DX,AX。
②影响 CF,OF 标志:如果乘积的高一半为零,则
CF=OF=0,否则,CF=OF=1。对其他标志 无定义 。
第 二 章 8086的 指 令 系 统
38乘法指令 (2)
例题:无符号数 0B4H 与 11H 相乘
MOV AL,0B4H ; 180D
MOV BL,11H ; 17D
MUL BL ; AX=3060D,CF=OF=1(乘积高 8位不为零 )
用两条指令是否可以?
MOV AL,0B4H ;设置被乘数
MUL 11H ;指定立即数作乘数其他指令,MUL BX; DX,AX←AX × BX
MUL [BX+SI];当乘数为存储器操作数 ……
MUL BYTR PTR[BX+SI]
MUL WORD PTR[BX+SI]
第 二 章 8086的 指 令 系 统
39乘法指令 (3)(end)
2.有符号数乘法指令
IMUL r8/m8 ; AX ← AL × r8/m8
IMUL r16/m16 ; DX,AX ← AX × r16/m16
① 指令用法与,MUL‖指令基本相同,只是专用于有符号数的相乘。
② CF = OF = 0,乘积的高一半为低一半的符号扩展(不是有效乘积); CF=OF=1,则乘积的高一半为乘积的一部分。对其他状态标志无定义。
③相同的二进制数,看作无符号数相乘与看作有符号数相乘,结果是不同的。如 0B4H 与 11H 相乘,使用,MUL‖
指令,结果为 0BF4H(无符号数 3060);如使用 IMUL指令,
则结果为 0FAF4H,将其看作补码,真值为 -1292。
返回 2.2
第 二 章 8086的 指 令 系 统
402.2.4除法指令 (1)
2.2.4 除法指令
1.无符号数除法指令 DIV
DIV r8/m8; AL←AX ÷ r8/m8的商,AH ← 余数
DIV r16/m16;AX←DX AX ÷ r16/m16的商,DX← 余数
①指令指定的是除数,被除数是隐含的;除数为字节,
则称为“字节除”,被除数使用 AX;除数为字,称为
“字除”,被除数使用 DX AX。
②操作数的格式与乘法指令相同。
③指令对状态标志无定义。
第 二 章 8086的 指 令 系 统
41除法指令 (2)(end)
2,有符号数除法指令 IDIV
IDIV r8/m8 ; AL←AX ÷ r8/m8的商,AH ← 余数
IDIV r16/m16;AX←DXAX ÷ r16/m16的商,DX← 余数
①专用于有符号数除法,其他与 DIV相同。
②除法指令的溢出问题,DIV下列情况可能产生溢出除数为零字节除时,被除数的高 8位 ≥除数 (商> 8位)
字除时,被除数的高 16位 ≥除数(商> 16位)
有符号数情况类似。当产生除法溢出,CPU自动产生,0号”中断,运行相应中断服务程序。程序设计时,
应避免产生除法溢出。
高 8位 低 8位8位除数与高 8位被除数对应的商
S1S2
S3
S1=S2 S3=1
S1> S2 S3> 1
返回 2.2
第 二 章 8086的 指 令 系 统
422.2.5符号扩展指令 (end)
2.2.5 符号扩展指令
1.字节扩展为字 CBW
CBW ; 将 AL的符号位扩展到 AH
2.字扩展为双字 CWD
CWD ; 将 AX的符号位扩展到 DX
注释,① 注意符号扩展涉及的对象是 AL和 AH以及 AX
和 DX,与其他寄存器无关。
②用来为有符号数除法准备被除数( 16位被除数和 32
位被除数)。
③为无符号数除法准备被除数 …………
第 二 章 8086的 指 令 系 统
43符号扩展说明符号扩展说明例如,AL÷ BL,由于 CPU使用 AX作被除数,故必须将 AL中的被除数扩展到 AX中。如果做有符号数除法,应使用符号扩展指令 CBW;如果做无符号数除法,应使 AH为
0(xor ah,ah或 and ah,0/mov ah,0等 )。
做 AX÷ BX,应使用同样的方法处理被除数,即将符号扩展到 DX,或使 DX中为 0。
除法指令举例:
div bl / div byte ptr[bx]
idiv cx / idiv word ptr[bp+si]
div 2050h (× ) div [bx](× )
返回 2.2
第 二 章 8086的 指 令 系 统
442.2.6十进制调整指令 (1)
2.2.6 十进制 (BCD码运算 )调整指令
①压缩的 BCD码,一个字节存放两位 BCD码,如,0110
1001‖( 69H),如看成压缩的 BCD码,即为十进制数
69。一个字节的压缩 BCD码可表示的数,00~99。
② 非压缩的 BCD码,一个字节存放一位 BCD码,该 字节低 4位为合法的 BCD码,高 4位未定义。如,0110 1001‖,
看成压缩的 BCD码,是 69;看成非压缩的 BCD码,是 9。
另外,※ 高 4位通常用 0表示。 (0000 1001)
※ 0~9的 ASCII码也可看成非压缩的 BCD码。
0011 0000,0011 0001…………0011 1001
第 二 章 8086的 指 令 系 统
45十进制调整指令 (2)
补充:调整原理做 BCD码运算 9+6
0 0 0 0 1 0 0 1
+ 0 0 0 0 0 1 1 0————————
0 0 0 0 1 1 1 1
9+6应该等于 15,即应为
0001 0101,现得到一个非法的 BCD码;试一试加 6,
加 6后,得到了正确结果。
+ 0 0 0 0 0 1 1 0
0 0 0 1 0 1 0 1
做 BCD码运算 9+9
正确结果应等于 18,即
0001 1000,现等于 0001 0010,
试做加 6调整,得正确结果。
调整原理:
0 0 0 0 1 0 0 1
+ 0 0 0 0 1 0 0 1
0 0 0 1 0 0 1 0
+ 0 0 0 0 0 1 1 0
0 0 0 1 1 0 0 0
AF=1
非法 BCD
第 二 章 8086的 指 令 系 统
46十进制调整指令 (3)
BCD码加法运算,当结果大于 9 时 或 AF 或 CF 等于 1 时需要做加 6调整。
原因:用二进制数运算规律进行十进制数运算。一位十进制数逢十进一,四位二进制数逢十六进一,加 6
是为了 1)强迫进位 ; 2)补充进位多带走的 6。
BCD码减法运算:够减时不需要调整; AF 或 CF为
1 时(有借位),需要做减 6 调整,抵消多借的 6。
第 二 章 8086的 指 令 系 统
47十进制调整指令 (4)
1,压缩 BCD码调整指令
①加法调整 DAA
DAA ; 判断 AL中的结果(低 4位和高 4位)是否需要调整,若需要,做加 6调整;若不需要,做下一条指令。
注释:
如果做 BCD码加法运算,ADD,ADC指令后应紧跟 DAA指令,以保证结果正确。
调整对象只能是 AL寄存器( BCD码运算只能使用以 AL寄存器为目的操作数的 8位数运算指令)。
对 OF标志无定义,设置其他标志。
第 二 章 8086的 指 令 系 统
48十进制调整指令 (5)
② 减法调整 DAS
DAS,判断 AL中的结果(低 4位和高 4位)是否需要调整,若需要,做减 6调整;若不需要,做下一条指令。
注释:
如果做 BCD码减法运算,SUB,SBB指令后应紧跟 DAA指令,以保证结果正确。
调整对象只能是 AL寄存器( BCD码运算只能使用以 AL寄存器为目的操作数的 8位数运算指令)。
对 OF标志无定义,设置其他标志。
(关于 BCD码符号问题省略)
第 二 章 8086的 指 令 系 统
49十进制调整指令 (6)
2.非 压缩 BCD码调整指令
⑴加法调整 AAA
AAA ; 操作如下:
①( AL低 4位 ≤ 9)且 AF=0,不需要调整,将 AL高 4
位清零,置 CF=AF=0,结束指令。
②如( 0AH≤ AL低 4位)或 AF=1,则 AL+6(调整),
AH+1(将进位记到高位),将 AL高 4位清 0,置
CF=AF=1,结束指令。
设 AH=06,AL=08,BL=09 执行下列指令
ADD AL,BL; AH=06H,AL=11H,AF=1,CF=0
AAA ; AH=07H,AL=07H,AF=1,CF=1
调第 二 章 8086的 指 令 系 统
50十进制调整指令 (7)
⑵ 减法调整 AAS
AAS ; 操作如下:
① ( AL低 4位 ≤ 9)且 AF=0,不需要调整,将 AL高 4
位清零,置 CF=AF=0,结束指令。
②如果 AF=1,则 AL – 6,AH- 1,AL高 4位清 0,
置 AF=CF=1。
设 AX=0608H BL=09H 执行下列指令
SUB AL,BL ; AH=06,AL=0FFH,AF=1,CF=1
AAS ; AH=05,AL=09,AF=1,CF=1
∴ 0608H - 09H →68 - 9=59。
调只有 AF=1,AL在 A~F间第 二 章 8086的 指 令 系 统
51十进制调整指令 (8)
⑶ 乘法调整 AAM
AAM ; AX← 将 AX中的乘积调整为非压 BCD码注释:①只能使用字节乘(乘积在 AX);
②相乘的两个非压缩 BCD码高 4位必须为零;
③相乘后先得到二进制数乘积(最大 9x9=81),在寄存器 AL中(低 4位);
④调整:将 AL中的数 ÷ 0AH,商放入 AH,余数保存在 AL中,在 AX寄存器即得到结果的非压缩 BCD码。
⑤本指令根据 AL内容设置 SF\ZF\PF,其余无定义。
例题:
设 AL=07H,BL=09H 执行指令:
MUL BL; AH=0,AL=3FH( 63)
AAM ; AH=06H,AL=03H; AX=0603H,63的非压缩 BCD码第 二 章 8086的 指 令 系 统
52十进制调整指令 (9)(end)
⑷ 除法调整 AAD
AAD ; AX← 将 AX中的非压 BCD码变成二进制数,即; AL← AH × 10+ AL,AH ← 0
注释:其他调整指令先运算,后调整;除法调整是先调整,后运算。
MOV AX,0608H; 68的非压缩 BCD码,被除数
MOV BL,09H ;除数,非压缩 BCD码 9
AAD ; AH=0,AL=10× 6+ 8=68=44H; AX=0044H:变成二进制数的被除数
DIV BL ; AL=07(商); AH=05(余数)
返回 2.2
第 二 章 8086的 指 令 系 统
532.3节 目录 2.3.1--2,3.3(位)
2.3 位操作指令
2.3.1 逻辑运算指令
AND/OR/XOR/NOT/TEST
2.3.2 移位指令
SHL/SHR/SAL/SAR
2.3.3 循环移位指令
ROL/ROR/RCL/RCR
返回第二章第 二 章 8086的 指 令 系 统
54
2.3.1 逻辑运算指令 (1)2.3.1 逻辑运算指令
1.与运算指令 AND
AND reg/mem,imm
AND reg/mem,reg/mem ;排除操作数,mem,mem‖
注释:①操作数格式同加减法指令;
②设置 CF=OF=0,影响 SF,ZF,PF,对
AF无定义。
2.或运算指令 OR
注释:指令格式、标志设置同 AND指令。
3.异或运算指令 XOR
注释:指令格式、标志设置同 AND指令。
第 二 章 8086的 指 令 系 统
55
逻辑运算指令 (2)
4,测试指令 TEST
注释:指令格式及运算均与 AND指令相同,但是不保留运算结果,即不影响目的操作数,只根据运算结果设置标志。
5.非运算指令 NOT
NOT reg/mem
注释:不影响任何标志。
下面举例说明逻辑运算指令的应用。
第 二 章 8086的 指 令 系 统
56
逻辑运算指令 (3)
① 屏蔽若干位。 (常用指令)
AND AL,01H;屏蔽 AL的 D7~D1,保留 D0
AND AL,0FH;屏蔽 AL高 4位,保留低 4位
②使若干位置 1 (常用指令)
OR BL,0F0H;使 BL高 4位置 1,低 4位不变
③清除 CF,OF 或 设置标志
AND AL,AL (AND AL,0FFH; OR BL,BL; …… );类似指令没有改变目的操作数,但使 CF=OF=0,也可能纯粹以设置其他标志( ZF)为目的。
第 二 章 8086的 指 令 系 统
57
逻辑运算指令 (4)
④ 求反 NOT AL / NOT WORD PTR[BX+DI]
⑤ 对指定位求反
XOR AL,0FH; AL高 4位不变,低 4位求反
XOR CL,55H; CL偶数位求反,奇数位不变
⑥清除寄存器及 CF(常用指令)
XOR AX,AX / XOR BX,BX
XOR BYTE PTR[BX],BYTE PTR[BX] ×
X⊕ 0=X X⊕ 1=X
第 二 章 8086的 指 令 系 统
58逻辑运算指令 (END)
⑦ 不改变操作数,测试操作数或操作数的指定位
TEST AL,0FFH;由 ZF标志判断 AL是否为零;也可以用 CMP指令。
TEST AL,01;由 ZF标志判断 AL的 D0是否为零,; ZF=1,则 AL.D0=0; ZF=0,则 AL.D0=1
AND AL,01 ;也可完成上述功能,但是改变了目;的操作数返回 2.3
第 二 章 8086的 指 令 系 统
59
2.3.2 移位指令 (1)
2.3.2 移位指令共四条指令,分成逻辑左移、算术左移、逻辑右移和算术右移,其中两条左移指令对应同一条机器指令,
所以,从机器指令的角度来说,移位指令只有三条。
MSB LSB 0
MSB LSB
MSB LSB
CFSHL/SAL
CF0SHR
CFSAR
符号位不变第 二 章 8086的 指 令 系 统
60
移位指令 (2)
1.左移指令(逻辑左移、算术左移:一条指令)
SHL reg/mem,1/CL;操作数左移 1位或 CL规定的;位数,最低位补 0,最高位进 CF。
SAL reg/mem,1/CL;同 SHL
2.右移指令(逻辑右移 SHR;算术右移 SAR)
SHR reg/mem,1/CL;操作数右移 1位或 CL规定的;位数,最高位补 0,最低位进 CF。
SAR reg/mem,1/CL;操作数右移 1位或 CL规定的;位数,最高位不变,最低位进 CF。
第 二 章 8086的 指 令 系 统
61
移位指令 (3)
注 释
①标志设置
AF:对 AF无定义;
CF:按移入的值或为 0或为 1;
根据移位后的结果设置 SF,ZF,PF;
OF:当移动一位时,移位后如果符号位发生变化,
则 OF=1,符号位不发生变化,则 OF=0,移位次数大于一时,OF不定。
②操作数左移一位,相当于乘 2(对有符号数同理,
只要 OF=0,结果就对)。
第 二 章 8086的 指 令 系 统
62移位指令 (4)(end)
③ 操作数逻辑右移( SHR)一位,相当于无符号数除以 2;操作数算术右移( SAR)一位,相当于有符号数除以 2。
指令举例
SHL AX,1
SAR BYTE PTR[BP+SI],1
SHR BH,1
SAR AL,3 ×
返回 2.3
MOV CL,3
SAR AL,CL
第 二 章 8086的 指 令 系 统
63
2.3.3 循环移位指令 (1)2.3.3 循环移位指令小循环(不带进位)左移( ROL)和右移( ROR)
大循环(带进位)左移( RCL)和右移( RCR)
MSB LSBCFROL
CFMSB LSBROR
MSB LSBCFRCL
CFMSB LSBRCR
第 二 章 8086的 指 令 系 统
64
循环移位指令 (2)(end)1.小循环移位指令 ROL,ROR
ROL reg/mem,1/CL ; 左移
ROR reg/mem,1/CL ; 右移
2.大循环移位指令 RCL,RCR
RCL reg/mem,1/CL ; 左移
RCR reg/mem,1/CL ; 右移例 1,将 DX,AX中的 32位数左移一位。
SHL AX,1
RCL DX,1
移位指令和循环移位指令结合,可实现 32位数乘 2除 2。
DX AX
返回 2.3
第 二 章 8086的 指 令 系 统
652.4节 目录
2.4 控制转移类指令
2.4.1 无条件转移指令
2.4.2 条件转移指令
2.4.3 循环控制指令
2.4.4 子程序调用及返回指令
2.4.5 中断控制指令
2.4.6 系统功能调用返回第 2章第 二 章 8086的 指 令 系 统
66
2.4.1 无条件转移指令 (1)
2.4.1 无条件转移指令 (JMP)
1.段内转移 ·直接寻址
JMP SHORT LABEL; IP←IP+8 位偏移量
JMP NEAR PTR LABEL; IP←IP+16 位偏移量注释:①指令中,LABEL‖称为“标号”,是某一条指令的名字,其物理意义为指令在内存中的偏移地址。
②段内:不改变段寄存器(在当前代码段内),只改变指令指针寄存器;直接寻址,汇编指令 中直接给出了转移目标的地址,但从指令的操作来说,应属相对寻址。
第 二 章 8086的 指 令 系 统
67短转移的转移范围
③ 短转移的转移范围:相对于 JMP的下一条指令,
转移范围为- 128~+ 127;相对于 JMP指令,转移范围为 -126~ +129;近转移:相对于 JMP的下一条指令,转移范围为- 32768~+ 32767(- 32765~ 32770)。
,JMP SHORT LABEL‖示意图:
操作码偏移量
XXXX
XXXX+1
XXXX+2
转移目的地址的计算:
IP+偏移量 → IP 即
IP+( -128~ +127) → IP
当计算上式时,IP为 (XXXX+2)
即 XXXX+2+(-128~ +127)=目的即 XXXX+( -126~ +129) =目的也就是说,相对于地址 XXXX来说,
转移范围为 -126~ +129。
第 二 章 8086的 指 令 系 统
68
无条件转移指令 (2)
2,段内转移 ·间接寻址
JMP r16/m16; IP←r16 或 IP←m16
指令举例
JMP SHORT L_PRO1;短转移,目标指令为 L_PRO1
JMP NEAR PTR L_PRO2;
JMP SI; IP←SI,通过寄存器间接给出指令偏移地址。
JMP BX; IP←BX
JMP WORD PTR[BX];通过存储器间接给出指令的偏移地址,而存储器寻址方式为寄存器 BX间接寻址。
JMP WORD PTR[BP+DI+20H];
第 二 章 8086的 指 令 系 统
69
无条件转移指令 (3)3,段间转移 ·直接寻址
JMP (FAR PTR) LABEL;IP← LABEL 的偏移地址,CS←LABEL 的段地址注释:,LABEL‖是位于另一个代码段的某一条指令的名字;另外,指令中的,FAR PTR‖可以省略,因为汇编程序可以自动识别:,LABEL‖与相应的,JMP‖指令是否在同一代码段内,从而产生段内或段间转移指令的机器代码。
┆ CODE2 SEGMENT
CODE1 SEGMENT ┆
┆ PRO1,MOV …
JMP FAR PTR PRO1 ┆

CODE1 ENDS CODE2 ENDS
第 二 章 8086的 指 令 系 统
70无条件转移指令 (4)(end)
4,段间转移 ·间接寻址
JMP FAR PTR mem (JMP DWORD PTR mem);IP ←[mem],CS ←[mem+2]
注释:通过存储器的一个双字单元提供转移目标的段地址和偏移地址,低位字为偏移地址,高位字为段地址。
JMP DWORD PTR[BX+DI]
DS=4000H,BX=1230H,SI=02H
计算物理地址:
40000H+1230H+2=41232H
返回 2.4
I P
C S
第 二 章 8086的 指 令 系 统
71
2.4.2 条件转移指令 (1)
2.4.2 条件转移指令概 述
①条件转移指令的通用格式为,Jcc label
如条件满足,则发生转移,IP←IP+8 位偏移量如条件不满足,则不转移,顺序执行下条指令。
②所有的条件转移指令均为两字节机器指令,第 2
字节为 8位偏移量,因而转移范围与,JMP SHORT‖指令相同。
③指令中的条件即为状态标志的状态或状态的组合,
8086CPU共有 16种可用的条件,使用这些条件的条件转移指令可分成三类。
第 二 章 8086的 指 令 系 统
72
条件转移指令(2)1.判断单个状态标志助记符 标 志 说 明
JZ/JE ZF=1 结果为 0;两数相等
JNZ/JNE ZF=0 不为 0;不相等
JC/JB/JNAE CF=1 加有进位;减有借位;其他
JNC/JNB/JAE CF=0 无进位; 无借位;其他
JS SF=1 结果为负
JNS SF=0 结果为正
JP/JPE PF=1 结果的低 8位含偶数个,1‖
JNP/JPO PF=0 结果的低 8位含奇数个,1‖
JO OF=1 运算结果溢出
JNO OF=0 运算结果不溢出
★ JCXZ ( CX=0) 串操作是否处理完所有数据第 二 章 8086的 指 令 系 统
73
条件转移指令 (3)
指令举例
1.计算 X-Y,X和 Y为 16位操作数,结果存入 result。
MOV AX,X;
SUB AX,Y;
JNS NO_NEG;( X-Y)如为正数,不求绝对值
NEG AX ;求绝对值
NO_NEG:MOV result,AX;保存结果
2.设字符的 ASCII码在 AL,给字符加上奇校验位。
AND AL,7FH; D7置 0,D6~ D0不变,测,1‖个数
JNP NEXT ; D6~ D0已有奇数个,1‖,不处理
OR AL,80H;偶数个,1‖,校验位置,1‖
NEXT,……
第 二 章 8086的 指 令 系 统
74
条件转移指令(4)
2.比较无符号数高低 (条件为一个标志或标志组合 )
助记符 标志 说 明
JB/JNAE/JC CF=1 低于 /不高于不等于 (< )
JNB/JAE/JNC CF=0 不低于 /高于或等于 (≥)
JBE/JNA CF=1或 ZF=1 低于或等于 /不高于 (≤)
JNBE/JA CF=0且 ZF=0 不低于不等于 /高于 (> )
指令举例,AX和 BX为 无符号数,比较大小,将较大的数放入 AX中。
CMP AX,BX ;
JNB NEXT ;如 AX≥BX,不处理
XCHG AX,BX ; AX< BX,AX与 BX交换
NEXT,……
第 二 章 8086的 指 令 系 统
75
条件转移指令 (5)(end)
3.比较有符号数大小 (条件为标志组合 )
助记符 标志 说 明
JL/JNGE SF≠OF 小于 /不大于且不等于 (< )
JNL/JGE SF= OF 不小于 /大于或等于 (≥)
JLE/JNG SF≠OF 或 ZF=1 小于或等于 /不大于 (≤)
JNLE/JG SF= OF且 ZF=0 不小于且不等于 /大于 (> )
指令举例,AX和 BX为 有符号数,比较大小,将较大的数放入 AX中。
CMP AX,BX ;
JNL NEXT ;如 AX≥BX,不处理
XCHG AX,BX ; AX< BX,AX与 BX交换
NEXT,……
返回 2.4
第 二 章 8086的 指 令 系 统
76
2.4.3 循环控制指令 (1)2.4.3 循环控制指令循环结构是程序设计中使用最多的一种结构,为了方便和简化设计循环程序,8086提供了三条专用的循环控制指令:
LOOP label; CX≠0,循环;否则退出
LOOPZ/LOOPF label; CX≠0 且 ZF=1,循环;否则退出
LOOPNZ/LOOPNE label; CX≠0 且 ZF=0,循环;否则退出
CX←CX -1
循环条件成 立?
Y
N
示意图第 二 章 8086的 指 令 系 统
77
循环控制指令 (2)(end)程序举例:统计 ES段中 string字符串包含空格的个数,
设字符串的长度为 count字节,结果存入 result单元。
MOV CX,COUNT
MOV SI,OFFSET STRING;取偏移地址
XOR BX,BX ;记录空格数目
JCXZ DONE ;字符串长度为 0,退出
MOV AL,20H ;空格的 ASCII码
AGAIN,CMP AL,ES,[SI]
JNZ NEXT ;不是空格,不计数
INC BX ;是空格,计数
NEXT,INC SI ;调整指针,指向下一个
LOOP AGAIN ;字符个数减一,不为 0,继续循环
DONE,MOV RESULT,BX ;
返回 2.4
第 二 章 8086的 指 令 系 统
78
2.4.4 子程序调用及返回指令 (1)2.4.4 子程序调用及返回指令子程序是常用的程序结构。采用子程序可以提高编程效率,使程序结构更为清楚,便于维护。
1.子程序调用指令 CALL
CALL指令位于主程序,CALL调用的子程序与 CALL指令可以处于同一代码段内,也可以在不同的代码段,因而分段内调用和段间调用;调用时可以采用直接寻址,
也可采用间接寻址,故调用指令有四种格式:段内直接调用、段内间接调用、段间直接调用、段间间接调用。
指令中,near ptr‖表示段内调用,,far ptr‖表示段间调用,但是由于汇编程序可自动识别,段内,和,段间,,
故可省略。
第 二 章 8086的 指 令 系 统
79
子程序调用及返回指令 (2)
CALL near ptr label ;段内直接调用;① SP←SP -2,SS:[SP]←IP ② IP←IP+D16
CALL r16/word ptr m16 ;段内间接调用;① SP←SP -2,SS:[SP]←IP ② IP←r16/m16
CALL far ptr label ;段间直接调用;① SP←SP -2,SS:[SP]←CS ② 堆栈 ← IP;③ IP←label 偏移地址,CS←label 段地址
CALL dword ptr mem ;段间间接调用;① SP←SP -2,SS:[SP]←CS ② 堆栈 ← IP;③ IP←[mem],CS←[mem+2]
第 二 章 8086的 指 令 系 统
80
子程序调用及返回指令 (3)CALL指令举例
CALL NEAR PTR SUB_PRO1 (CALL SUB_PRO1)
CALL BX ;r16,通过寄存器间接给出子程序偏移地址
CALL WORD PTR [BX] ;mem16,通过存储器的字单元间接给出子程序偏移地址,字单元为寄存器间接寻址。
CALL WORD PTR [BP+SI+2050H] ;mem16
CALL far ptr sub_pro ( call sub_pro )
CALL FAR PTR BX ×
CALL FAR PTR [BX]
CALL DWORD PTR[BX];通过存储器的双字单元间接给出子程序地址,双字单元为寄存器间接寻址,低位字为子程序偏移地址,高位字为子程序段地址。
第 二 章 8086的 指 令 系 统
81
子程序调用及返回指令 (4)
2.子程序返回指令 RET
返回指令为子程序最后执行的指令,作用为断点出栈,返回相应 CALL指令的下一条指令。根据子程序与主程序是否同处于一个代码段内,返回指令分为段内返回和段间返回,两类指令的助记符相同,由汇编程序加以区分,并产生不同的机器指令。
RET ;IP←SS:[SP],SP←SP+2 ( 恢复断点 )
RET i16;① IP←SS:[SP],SP←SP+2 ② SP←SP+i16
RET;① IP←SS:[SP],SP←SP+2
② CS←SS:[SP],SP←SP+2
RET i16; ① IP← 出栈 ② CS← 出栈 ③ SP←SP+i16
第 二 章 8086的 指 令 系 统
82
子程序调用及返回指令 (5)注 释
①带立即数的返回指令:主程序与子程序使用堆栈传递参数时,当从子程序返回主程序,(SP+i16)用以释放参数所占的堆栈单元。
②所谓正确使用堆栈:通常是指使用了几条,PUSH‖
指令,就应使用相同条数的,POP‖指令,堆栈中既不应
,残留,数据,也不应,超额,使用,否则,断点不能正确恢复。例如,子程序中使用了 4条 PUSH指令,应有 4
条 POP指令与其相配,如只有 3条 POP,为,残留,,如用了 5条 POP,则为,超额,,都会造成错误。
第 二 章 8086的 指 令 系 统
83子程序调用及返回指令 (6) (end)
子程序举例将 AL低 4位的十六进制数转换成 ASCII码。
4位二进制数表示成十六进制数为 0~ 9,A~ F,0~
9的 ASCII码为 30H~ 39H,对 0~ 9直接加 30H,即得到其
ASCII码;如 4位二进制数为 1010( A),则 A的 ASCII
码为 0AH+30H+07H。;主程序
MOV AL,XXH
CALL H2ASC…;子程序
H2ASC,AND AL,0FH
OR AL,30H
CMP AL,39H
JBE H2END
ADD AL,07H
H2END,RET
参数是 A~F

0︱
9
返回 2.4
第 二 章 8086的 指 令 系 统
84
2.4.5 中断控制指令 (1)2.4.5 中断控制指令
CPU暂停正在运行的程序,响应 I/O设备的请求,为
I/O设备服务,或转去处理某些紧急事件,服务或处理结束后,CPU继续运行原来的程序,这种处理过程被称为,中断,。引起中断的事件或设备称为,中断源,,
原程序被中断的地方称为,断点,,CPU被中断后执行的程序称为,中断服务程序,,,中断处理程序,或
,中断子程序,。下面介绍三个问题:
1.8086的中断类型
2.8086响应中断的过程
3.8086的中断指令第 二 章 8086的 指 令 系 统
85中断控制指令 (2)
1.8086中断类型
8086可处理 256个中断源( 256个中断),每个中断用 0~ 255之间的一个号码表示(中断向量号、矢量号、类型号)。 256个中断分成两类。
⑴外部中断中断源来自 CPU之外(两种)
可屏蔽中断:响应与否,受 IF标志控制。
涉及指令,CLI STI
非屏蔽中断:不受 IF控制的中断源。( 2#)
第 二 章 8086的 指 令 系 统
86
中断控制指令 (3)
⑵ 内部中断 ( 4种)
中断源为:程序执行过程中程序自身引发的事件
除法错中断:除数为 0或除法溢出。( 0#)
单步中断:若单步标志 TF=1,则每条指令执行行后产生单步中断。( 1#)
溢出中断:执行中断指令 INTO时,如 OF=1,则产生溢出中断。( 4#)
指令中断:执行中断调用指令 INT n,产生指令中段,类型号 n=0~ 255。
第 二 章 8086的 指 令 系 统
87
中断控制指令 (4)
2.8086的中断过程
①中断向量表②进入中断服务程序③返回断点
①中断向量表
256个中断源,中断子程序
0#对应的 pro:0#中断子程序
…… 1#中断子程序
子程序入口,IP,CS共 4字节
256*4=1KB:00000-003ffh
0-03:0# 04-07:1#… ip,cs 00000h
003ffh
IP
CS 00002
00004
1KB
0#向量
1#向量
255#向量第 二 章 8086的 指 令 系 统
88
中断控制指令 (5)
② 进入中断服务程序
CPU取类型号 ;外中断 内中断,指令提供、预定义
类型号 *4:对应向量在表中的首地址 如设 n=1…
保护断点,PSW,CS,IP
依次入栈
从向量表读取服务程序入口地址:
IP← 低位字 CS← 高位字
进入中断服务程序
00000h
003ffh
IP
CS 00002
00004
1KB
0#向量
1#向量
255#向量
IP
CS
第 二 章 8086的 指 令 系 统
89中断控制指令 (6)
③ 返回断点中断服务程序结束时执行中断返回指令
IRET:使 IP,CS,PSW按顺序出栈。
…… …… …… ……
类型号 *4:如 INT 2AH,类型号为 2AH,
为获取它的中断服务程序入口地址在向量表中存放的首地址,需将类型号 *4。
1) 2AH=0010 1010B;化成二进制数
2) 0010 1010 00B=1010 1000B;左移 2位中断服务程序入口地址在向量表中存放的首地址即为,000A8H。
第 二 章 8086的 指 令 系 统
90
中断控制指令 (7)
3.8086的中断指令
INT i8;①标志寄存器入栈;
②禁止响应可屏蔽中断和单步中断
IF←0,TF←0 ;
③断点的段地址入栈,偏移地址入栈;
④从中断向量表取入口地址,进入中断服务程序。
注释,i8为类型号,在程序中使用 INT指令时,
8086预定义的类型号( 0,1,2,4)( 3)和可屏蔽中断已使用的类型号一般不应出现在 INT指令中。
第 二 章 8086的 指 令 系 统
91中断控制指令 (8)(end)
IRET; IP,CS,PSW( FLAGS)依次出栈。
INTO;
CLI;
STI;
IF←0,禁止可屏蔽中断。
IF←1,允许可屏蔽中断。
返回 2.4
OF=1?
产生 4号中断 执行下一条指令
N
Y
第 二 章 8086的 指 令 系 统
92
2.4.6 系统功能调用 (1)2.4.6 系统功能调用
DOS和 ROM-BIOS都以中断服务程序的形式向用户提供大量子程序,供用户编程时调用。,系统功能调用,
一般是指调用 DOS的 INT 21H提供的子程序,调用 BIOS提供的中断子程序一般称为,BIOS调用,(省略)。
系统功能调用格式:
在 AH中设置调用的功能号;
在指定的寄存器中设置入口参数;
执行 INT 21H指令,调用功能子程序;
如果需要,分析出口参数。
第 二 章 8086的 指 令 系 统
93
系统功能调用 (2)
1.单个字符的输出
AH=02;入口参数,DL=字符的 ASCII码
MOV AH,2
MOV DL,’? ’
INT 21H ;可输出控制字符
2.字符串输出
AH=09;入口参数,DS:DX=字符串首地址字符串必须以$( 24H)结尾
string db?Hello!‘,0dh,0ah,?$ ’
mov ah,9
mov dx,offset string
int 21h
第 二 章 8086的 指 令 系 统
94
系统功能调用(3)(end)3.单个字符输入
AH=1;入口参数:无;出口参数,AL=字符 ASCII码
(系统一直等待,直到有键按下)
4.字符串的输入
AH=0AH;入口参数,DS:DX=缓冲区首地址
,回车,表示输入结束;缓冲区第一个字节添入可能输入的最多字符数(含回车),第二个字节将存放实际输入的字符数(不含回车),从第三个字节开始存放输入的字符。
buf db 81;自己设置 mov ds,dx
db 0 mov dx,offset buf
db 81 dup(0) mov ah,0ah
… int 21hmov dx,seg buf …
返回 2.4
第 二 章 8086的 指 令 系 统
952.5节 目录 1---6(串操作)
2.5 串操作指令
,串,,在存储器中连续排列的一组数据,称为数据串;对数据串进行操作的指令称为串操作指令。
1,串传送指令
2,串存储指令
3,串读取指令
4,串比较指令
5,串扫描指令
6,重复前缀指令返回第二章第 二 章 8086的 指 令 系 统
96
串操作 (1)传送
1.串传送指令
MOVSB;字节传送,ES:[DI]←DS:[SI]; SI ←SI ± 1,DI ←DI ± 1
MOVSW;字传送,ES:[DI]←DS:[SI]; SI ←SI ± 2,DI ←DI ± 2
注 释:
1)源数据串可以段跨越,目的串不可。
2) DF=0,地址指针 +1或 +2,DF=1,指针 -1或 -2。
3)一般不使用格式 MOVS 目的串名,源串名。
4)不影响标志。
第 二 章 8086的 指 令 系 统
97
串操作 (2)
例 2.52:将数据段 source指示的 100个字节传送到本段 dest指示的区域。
mov ax,ds
mov es,ax;使 ES和 DS指向同一个段
mov si,offset source
mov di,offset dest
mov cx,100
cld
Loopm:movsb
dec cx
jnz loopm
loopm:movsb
loop loopm
mov cx,50
cld
loopm:movsw
第 二 章 8086的 指 令 系 统
98
串操作 (3)
传送方向:
1)可正向,也可反向。
2)只能正向。
3)只能反向(如右图)。
低地址高地址源数据串目的数据串第 二 章 8086的 指 令 系 统
99
串操作(4)存串2.串存储指令
STOSB; ES:[DI] ←AL,DI ←DI ± 1
STOSW; ES:[DI] ←AX,DI ←DI ± 2
注释,1)经常用来初始化一段内存区域。
2)串为目的操作数。
3)不影响标志。
例 2.53:将附加段 64KB全部清为 0。
mov ax,0
mov di,0;任何一个偶数都可以。
mov cx,8000h; 32K
cld
Lop,stosw
dec cx
jnz lop
第 二 章 8086的 指 令 系 统
100
串操作 (5)读串、比较
3.串读取指令
LODSB; AL← DS:[SI],SI ←SI ± 1
LODSW; AX← DS:[SI],SI ←SI ± 2
注释:数据串为源操作数;不影响标志。
4.串比较指令
CMPSB; DS:[SI]-ES:[DI],SI←SI ± 1,DI←DI ± 1
CMPSW; DS:[SI]-ES:[DI],SI←SI ± 2,DI←DI ± 2
注释,1)比较两个数据串是否相等。
2)按减法设置标志。
第 二 章 8086的 指 令 系 统
101
串操作(6)搜索、重复前缀5.串扫描指令
SCASB; AL-ES:[DI],DI ←DI ± 1
SCASW; AX-ES:[DI],DI ←DI ± 2
注释,1)从数据串中搜索一个数据,被搜索的数据称为关键字,放入 AL或 AX寄存器。
2)按减法规律设置标志。
6.重复前缀指令
(不能单独使用,只能附加在串操作指令前面,使串操作重复执行)
三个重复前缀,分为两类:
1) REP 2) REPZ/REPE 和 REPNZ/REPNE
第 二 章 8086的 指 令 系 统
102
串操作 (7)REP
1) REP;
与 MOVS,STOS,LODS配合使用。
( REP MOVSB/REP STOSW)
指令操作:
如 CX=0,退出串操作,CX≠0,做下一步
CX←CX -1
执行后跟的串操作指令
回到第一步
重复次数由 CX控制第 二 章 8086的 指 令 系 统
103
串操作 (8)REPZ/REPNZ
2) REPZ/REPE,REPNZ/REPNE
两条都与 CMPS,SCAS配合使用 (REPZ/REPNZ CMPSB)
CX≠0 且 ZF=1
CX←CX -1
执行串操作
Y
N
REPZ/REPE CX=0或 ZF=0
退出串操作
CX≠0 且 ZF=0
CX←CX -1
执行串操作
Y
N
REPNZ/REPNE CX=0或 ZF=1
退出串操作第 二 章 8086的 指 令 系 统
104
串操作 (9)前缀注释注 释,
1) REPZ指令中的,Z‖表示的是,ZF=1‖,而且
,ZF=1‖是 重复串操作的必要条件 ; REPNZ中的,NZ‖表示的是,ZF=0‖,而且,ZF=0‖是 重复串操作的必要条件 。
2) REP指令使串操作重复 CX规定的次数,REPZ、
REPNZ使串操作的重复可能提前结束 (观察 ZF)。
3)注意重复前缀和循环控制指令的差别:
LOOP先做 CX减 1,后判断; REP先判断,后减 1。
第 二 章 8086的 指 令 系 统
105串操作 (10)例题例 2.57:比较两个字符串 str1,str2是否相等,数据串长度为 count,比较结果存入 result单元,0表示相等,-1(ffh)表示不等。
mov si,offset str1
mov di,offset str2
mov cx,count
cld
repz cmpsb
jnz unmat
mov al,0
jmp output
unmat,mov al,0ffh
output,mov result,al ZF=0,两串不同重复运行串比较指令的几种情况
1)CX=0,ZF=1:全比完,相同
2)CX=0,ZF=0:全比完,末数据不同
3)CX≠0,ZF=0,未比完,遇到不同
4)CX≠0,ZF=1,未比完,继续比较第 二 章 8086的 指 令 系 统
106
串操作 (11)注释 (end)注 释
① LODS一般不与重复前缀连用,无意义。
②使用带重复前缀的串比较和串搜索指令指令时,
REPZ和 REPNZ的选择:对字符串比较,比较两个字符串是否相等,用 REPZ(如相等,则继续比较 ;如遇到不等的数据则退出);如要求找出两串相等的位置,应使用
REPNZ(两数据不等,继续比较);对串搜索来说,一般使用 REPNZ(当前数据不是要找的,继续搜索),但有时也可能用到 REPZ,如已知一个数据块应该都是 0FFH,
要查找其中是否有非 FF,关键字(只能)用 FF,重复前缀应使用 REPZ。
返回 2.5
第 二 章 8086的 指 令 系 统
107 2.6 处理机控制类指令(1)(end)
2.6 处理机控制类指令
1) NOP(同 XCHG AX,AX)
预留空间 删除指令 软件延时
2) 段超越前缀指令 段寄存器:如 CS:,SS,…
3)指令封锁前缀指令 LOCK( 有相应引脚 LOCK):
LOCK MUL
4)暂停指令 HLT
反复执行 NOP,等待复位或中断信号。(慎用)
5)交权指令 ESC 将浮点指令交给浮点处理器。
6)等待指令 WAIT( 有相应引脚信号 TEST)
用于与 8087同步 ( 5T)
TEST=1 保持 WAIT状态,TEST=0 退出 WAIT状态。
返回第二章第 二 章 8086的 指 令 系 统
108要点与习题分析要点与习题分析
1.本章要点各类指令的指令格式,对标志的影响,特别是:
传送指令(地址传送、堆栈操作 … )
加法、减法( NEG,CMP… )
逻辑运算指令的应用
移位指令和循环移位指令的应用
所有控制转移类指令
串操作类指令第 二 章 8086的 指 令 系 统
109习题分析 (1)
2.习题分析
2.1已知 DS=2000H,BX=0100H,SI=0002H,存储单元 [20100H] ~ [20103H]依次存放 12 34 56 78H,
[21200H] ~ [21203H]依次存放 2A 4C B7 65H,说明下列每条指令执行后 AX寄存器的内容。
① MOV AX,1200H
② MOV AX,BX
③ MOV AX,[1200H]
④ MOV AX,[BX]
⑤ MOV AX,[BX+1100H]
⑥ MOV AX,[BX+SI]
⑦ MOV AX,[BX][SI+1100H]
第 二 章 8086的 指 令 系 统
110习题分析 (2)
2.2 指出下列指令的错误。
① mov cx,dl ⑤ mov es,ds
② mov ip,ax ⑥ mov [sp],ax
③ mov es,1234h ⑦ mov ax,bx+di
④ mov al,300 ⑧ mov 20h,al
2.5 以知 SS=0FFAOH,SP=00B0H,画图说明执行下列指令序列时,堆栈区和 SP的内容如何变化。
mov ax,8057h push ax
push ax pop bx
mov ax,0f79h pop [bx]
第 二 章 8086的 指 令 系 统
111习题分析 (3)
2.8 用一条指令完成如下功能。
① BX和 DX内容相加,结果存入 DX。
②用 BX和 SI的基址变址寻址方式把存储器中的一个字节与 AL相加,结果存入 AL。
③用 BX和位移量 0B2H的寄存器相对寻址方式把存储器中的一个字和 CX相加,结果放入存储器。
④用位移量为 0520H的直接寻址方式把存储器中的一个字和 3412H相加,结果存入存储器。
⑤把数 0A0H与 AL寄存器的内容相加,结果存入 AL。
第 二 章 8086的 指 令 系 统
112习题分析 (4)
2.10 指出下列指令的错误。
① xchg [si],30h ⑤ adc ax,ds
② pop cs ⑥ add [si],80h
③ sub [si],[di] ⑦ in al,3fch
④ push ah ⑧ out dx,ah
第 二 章 8086的 指 令 系 统
113习题分析 (5)
2.11 给出下列指令执行后的结果及状态标志 CF、
OF,SF,ZF,PF的状态。
AX CF OF SF ZF PF
mov ax,1470h 1470H - - - - -
and ax,ax 1470H 0 0 0 0 0
or ax,ax 1470H 0 0 0 0 0
xor ax,ax 0 0 0 0 1 1
not ax 0FFFFH - - - - -
test ax,0f0f0h 0FFFFH 0 0 1 0 1
( 0F0F0H)
第 二 章 8086的 指 令 系 统
114习题分析 (6)
2.13编写程序段完成下列要求:
①用位操作指令实现 AL(无符号数)乘以 10
② 用逻辑运算指令实现 0~ 9的 ASCII码与非压缩 BCD
码的相互转换(使非压缩 BCD码高 4位为 0)
③把 DX.AX中的双字右移 4位
2.17 IP是通用寄存器还是专用寄存器?有指令能够对其直接赋值吗?
2.18 控制转移类指令有哪 3种寻址方式?
2.19 条件转移指令的转移范围有多大?实际编程时如何处理超出范围的条件转移指令? (配合 JMP)
D X A XCF
第 二 章 8086的 指 令 系 统
115习题分析 (7)
2.23 设置 CX=0,则 LOOP指令将循环多少次?如
MOV CX,0
DELAY,LOOP DELAY
2.27 对下列要求,分别给出 3种方法,每种方法只用一条指令。
①使 CF=0 ② 使 AX=0 ③ 同时使 AX=0,CF=0
2.28 参照本习题的示意图,分析调用系列,画出每次调用及返回时的堆栈状态。其中 CALL前是该指令所在的逻辑地址;短内直接调用指令为 3字节指令,段间直接调用指令为 5字节指令。
第 二 章 8086的 指 令 系 统
116习题分析 (8)
2.28 示意图:
CALL NEAR PTR SUBA
CALL FAR PTR SUBB
CALL NEAR PTR SUBC
RET
子程序 SUBB
RET
子程序 SUBC
RET
SUBA
5
2
3
4
1
6
2000:840
2000:C021
2000:0400
主程序第 二 章 8086的 指 令 系 统
117习题分析 (9)
2.31 解释下列中断的概念
①内部中断和外部中断②单步中断和断点中断③除法错中断和溢出中断④中断向量号和中断向量表
2.32 试比较 INT N和段间 CALL指令,IRET和段间返回指令 RET的功能。
2.33 什麽是系统功能调用?汇编语言中其一般格式是怎样的?
2.38 指令与状态标志的的关系可以分成多种情况,
例如无影响、无定义、按结果影响、特别说明等,试区别这几种情况。并用具体的指令说明。