四,逻辑指令指令分类逻辑运算 AND,OR,XO R,NOT,TE ST
移 位 SH L,S A L,SH R,SAR
循环移位 RO L,ROR,RC L,R CR
逻辑运算,与,或,非,异或特点:二进制数运算,按位进行
`与 `运算,有 0则 0,全 1则
`或 `运算,有 1则 1,全 0则 0
A
B
0
0
0
1
1
0
1
1
A ∧ B 0 0 0 1
A
B
0
0
0
1
1
0
1
1
A ∨ B 0 1 1 1
例,1101 1100
∧ 1011 1010
1001 1000
例,1010 1100
∨ 0011 1001
1011 1101
`非 `运算,0则 1,1则 0
`异或 `运算,异则 1,同则 0
A 0 1
A 1 0
A
B
0
0
0
1
1
0
1
1
A ∨ B 0 1 1 0
例,
1011 1010
0100 0101
例,1010 1100
∨ 0011 1001
1001 0101
指令格式 执行操作
AND dst,sr c ( d s t ) ← ( ds t ) ∧ ( sr c )
OR dst,sr c ( d s t ) ← ( ds t ) ∨ ( sr c )
NO T opr d ( o p rd ) ← ( opr d )
XO R dst,sr c ( d s t ) ← ( ds t ) ∨ ( sr c )
TE ST opr d1,opr d 2 ( o p rd1 ) ∧ ( opr d 2 )
1,逻辑运算指令
AND AL,0000 1111B
OR BX,00FFH
NOT CL
XOR DL,AL
TEST AL,0000 0001B
除 NOT指令单操作数外,其它均为双操作数
可进行字节或字操作
NOT指令不影响标志
TEST只影响标志位,不影响操作数其他指令 置 CF,OF为 0,AF不定 ( 无意义 )SF,ZF,PF据结果置位例 数字字符的 ASCII → 对应的二进制数 ASCII
数字 0 ~ 9 30H ~ 3 9H
应用:
MOV AH,1 ;利用 DOS调用
INT 21H ;从键盘输入字符到 AL中
AND AL,0000 1111B ;高 4位为 0,低 4位不变
、、、
0011 1001B 39 H
∧ 0000 1111 B 0F H
0000 1001B 09 H
逻辑运算常用于使操作数的某位为 0或 1,或测试某位为 0还是 1。
使某位为 1
用该位与 1相或,不变的位与 0或 。
使某位为 0
用该位与 0相与,不变的位与 1与 。
使某位求反用该位与 1异或,不变的位与 0异或 。
测试某位的值用 TEST指令,据标志判断例 21H端口管理中断系统,管理 8个外设的中断为 0,允许键盘中断为 1,禁止
7 6 5 4 3 2 1 0
1 0 1 0 0 0 1 0
D7 D6 D5 D4 D3 D2 D1 D0
允许键盘中断:
IN AL,21H ;读入 21端口内容
AND AL,1111 1101B ;置 D1 = 0,其他位不变
OUT 21H,AL ;送出屏蔽字到 21H端口禁止键盘中断:
IN AL,21H
OR AL,0000 0010B ;使 D1为 1
OUT 21H,AL
例 379H端口的 D7存放打印机的状态为 0,表示打印机忙为 1,打印机空闲
7 6 5 4 3 2 1 0
1 0 1 0 0 0 1 0
D7 D6 D5 D4 D3 D2 D1 D0
用查询方式控制打印机工作:
MOV DX,379H
ask,IN AL,DX ;从 379H端口读状态
TEST AL,1000 0000B ;检测 D7位
JZ ask ;为 0,继续查询
print:,、,;输出字符打印
2,移位指令
SHL oprd,1CL
SAL oprd,1CL
SHR oprd,1CL
SAR oprd,1CL
0CF
0CF
CF0
CF
执行操作指令格式
移位规则
▲ 左移,高位 ← 低位右移,高位 → 低位
▲ 移出位进入 CF标志
▲ 对移位指令,移出 CF标志后丢失
▲ 逻辑左移,算术左移的结果相同
▲ 逻辑右移,新移入的信息以 0填入算术右移,保持最高有效位原来的值 ( 符号为不变 )
0CF
0CF
SHL
SAL
CF0
CF
SHR
SAR
例 若 ( AL) =96H,CF=0
执行 SHL AL,1
执行前,(AL)=96H,CF=0 1 0 0 1 0 1 1 0
执行后,(AL)=2CH,CF=1 0 0 1 0 1 1 0 0
执行前,(AL)=96H,CF=0 1 0 0 1 0 1 1 0
执行后,(AL)=E5H,CF=1 1 1 1 0 0 1 0 1 CF
例 若 ( AL) =96H,CF=0,(CL) =2
执行 SAR AL,CL
3,循环移位指令指令格式 执行操作
CF
CF
CF
CF
ROL oprd,1CL
ROR oprd,
1
CL
RCL oprd,
1
CL
RCR oprd,
1
CL
移位规则
▲ 左移,高位 ← 低位右移,高位 → 低位
▲ 移出位进入 CF标志
▲ 对循环移位指令,改变各位的位置,信息不丢失
▲ 带进位循环移位,CF标志参加循环移位
ROL
CF
CF
CF
CF
ROR
RCL
RCR
例 若 ( AL) = 96H,CF=0
执行 ROL AL,1
执行前,1 0 0 1 0 1 0 (AL)=96H,CF=01
执行后,0 0 1 0 1 0 1 (AL)=2DH,CF=11
例 若 ( AL) = 96H,CF=0,(CL)=2
执行 RCR AL,CL
1 0 0 1 0 1 0执行前,1
0 0 1 0 0 0 1执行后,1
(AL)=96H CF=0
(AL)=25H CF=1
注意事项:
SHL AL,1
SHR AL,CL
ROL BX,1
RCR AL,CL
源操作数为移位的次数为 1可在指令中直接给出大于 1时,移位次数需由 CL给出
RCR AX,5 SHL BL,AL
目的操作数类型决定操作类型
SAL BL,CL 字节操作
ROL BX,CL 字操作当移位次数
oprd可以是 reg/mem
可进行字节或字操作
SHL AL,1
ROL BX,1
对标志位的影响
▲ 移位指令,
① 据结果设置 CF,SF,ZF,PF,对 AF无定义
② OF只在移位次数为 1时有效,其他无定义移位后,最高有效位发生变化,则 OF=1,否则为 0
▲ 对循环移位指令,
① 据移位结果设置 CF,对其他标志无影响
② OF标志与移位指令同
0CF
CF
逻辑移位可用于无符号数乘除算术移位,,带符号数,、
左移一次,相当于乘 2
右移一次,相当于除 2
例 将 AL中的带符号数乘 10,若 (AL)=X
SAL AL,1 ; (AL)=2X
MOV BL,AL ; (BL)=2X
SAL AL,1 ; (AL)=4X
SAL AL,1 ; (AL)=8X
ADD AL,BL ; (AL)=(8X+2X)=10X
5,控制转移指令在 8086/8088中,指令的地址 固定由 CS和 IP两个寄存器决定 。
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器
CS和 IP两寄存器的内容决定了程序的流程
8086/8088 中 CS和 IP的变化规则:
1) reset复位后,( CS ) = FFFFH,( IP ) = 0
故 8088从内存 FFFF:0000H处取第一条指令执行,
改变 CS和 IP寄存器的值,
就改变了程序执行的流程 。
第一条指令 在内存的 ROM区 。
2) 非控制转移指令,指令本身对 CS和 IP均无操作,
形成顺序执行结构 。
BB
00
01
B1
20
90
指令 1
指令 2
指令 3
CS:IP
顺序执行结构,顺序存放,顺序执行
程序是指令的集合
指令在内存中顺序存放
对非控制转移指令,
CPU取来一条指令后,
自动将 IP的值加上该指令的字节数,
使 IP顺序指向下一条指令,
CPU取来紧连着的指令执行 。
(此时 IP的变化由 CPU内部的硬件自动完成 )
3) 控制转移指令 以 CS和 IP为主要操作对象,
改变 CS和 IP的值,使程序产生分支,调用结构 。
指令 1
指令 2
指令 3
指令 4
39
D8
7D
02
87
C3
A3
00
20
CS:IP分支结构,调用结构,
顺序存放,非顺序执行
CMP AX,BX
JGE great
XCHG AX,BX
great,MOV [max],AX
、、、
控制转移指令 JGE可以改变 IP的值,
使程序非顺序执行指令类型 助记符无条件转移 JM P
条件转移
JE /J Z,JNE /J NZ,JS,JN S,J O,JN O
JP,JN P,JC,JN C,J CXZ
JA / JNB E,JAE /J NB,JB /J NAE,JB E/ JNA
JG /J NLE,JG E/JNL,JL /J NG E,JL E/JN G
循环控制 LO O P,L OO P E/LO OP Z,LOO P NE/ LOO P NZ
过程调用 CAL L,RET
中断指令 INT,INT O,IRE T
控制转移指令分类
控制转移指令 ( JMP,Jcc,LOOPxx,CALL) 概述例 JMP exit
JZ zero
LOOP nxet
CALL display
指令格式,助记符 操作数助记符 JMP,Jcc,LOOPxx,CALL
操作数 给出要转移到的目的地址操作数 (目的地址 )的三种表示方法:
目的地址在 reg,mem中,
取来指令后间接得到目的地址目的地址在指令中,
取来指令后直接得到目的地址例 CMP AX,BX
JGE great
XCHG AX,BX
great,MOV [max],AX
例 JMP AX
JMP WORD PTR [ BX ]
① 符号地址
(标号或过程名 )
② 寄存器 reg
③ 存储器 mem
◢ 符号地址,在汇编格式指令中用符号来表示地址可以是 标号,过程名 (子程名 )
标号指示指令所在的地址 。 用 符号名,表示 。
例 CMP AX,BX
JGE great
XCHG AX,BX
great,MOV [max],AX
指令的长短不同根据标号与控制转移指令所在位置,标号有三种类型:
SHORT 短属性
NEAR 近属性
FAR 远属性
SHORT 短属性标号标号与控制转移指令在同一段中,
标号的偏移地址距离控制转移指令的偏移地址 ( -128 ~ 127)
XXXX:(yyyy-128) next:,、、
、、、
、、、
、、、
Jcc next
XXXX:yyyy,、、
、、、
、、、
、、、
XXXX:(yyyy+127) next:,、、
位移量 = 符号地址的偏移量 - 当前 IP的值
SHORT属性标号的位移量在 ( 00~FFH),用 1个字节 存放
-128
+127
NEAR近属性标号标号与控制转移指令在同一段中,
标号的偏值在 0000 ~ FFFFH。
XXXX:0000 next:,、、
、、、
、、、
、、、
JMP next
XXXX:yyyy,、、
、、、
、、、
、、、
XXXX:FFFF next:,、、
位移量 = 符号地址的偏移量 - 当前 IP的值
NEAR属性标号的位移量在 ( 0000~FFFFH),用 1 个字 存放
-yyyy
FFFF-yyyy
FAR 远属性标号标号与控制转移指令不在同一段中 。
AAAA:bbbb next:,、、
、、、
、、、
、、、
JMP next
XXXX:yyyy,、、
、、、
、、、
、、、
ZZZZ:wwww next:,、、
用 2个字 分别存放符号地址的段值,偏移值
② 过程名 ( 子程名 )
过程指示过程 (子程 )第一条指令的地址 。
例 display PROC near
、、、
、、、
、、、
display ENDP
按过程与调用语句间的位置,过程有两种类型:
NEAR类型,调用指令与过程 在 同一个段中
FAR类型,调用指令与过程 不在 同一个段中过程定义方法:
符号名 PROC 类型
、、、
、、、
、、、
符号名 ENDP
例 NEAR 类型过程
code SEGMENT ;code段
、、、
、、、
CALL sub ;调用
、、、
、、、
、、、
、、、
sub PROC NEAR ;过程定义
、、、
、、、
、、、
RET ;返回
sub ENDP
code ENDS
例 FAR 类型过程
code1 SEGMENT ;code1段
、、、
、、、
CALL display ;调用
、、、
、、、
code1 ENDS
code2 SEGMENT ;code2段
、、、
display PROC FAR ;过程定义
、、、
、、、
、、、
RET ;返回
display ENDP
code2 ENDS
◢ 当前 IP的值为控制转移指令下一条指令的偏移地址 。
◢ 位移量 = 符号地址的偏移量 - 当前 IP的值 。
符号地址 ( 目标地址 ) =当前 IP的值 + 位移量指令格式,助记符 操作数操作数 执行操作符号地址 (S HO R T ) ( IP ) ← ( IP ) + 8 位位移量符号地址 ( NEAR 属性 ) ( IP ) ← ( IP ) + 16 位位移量
r eg ( 16 位)
mem ( DW 类型 )
( IP ) ← ( r eg )
(IP) ← (mem)
符号地址 ( F A R 属性 )
( IP ) ← 符号地址的偏值
(CS) ← 符号地址的段值
mem ( DD 类型 )
( IP ) ← ( mem )
(CS) ← (mem+2 )
转移方式 CS 操作数 跳转范围段内直接短 方 式不变符号地址
( SH OR T )
-128 ~ 12 7
即 0~ FFH
段内直接近 方 式不变符号地址
(NEAR 属性 )
一个段内
0~ FF FFH
段 内间接方式不变
r eg
me m (DW 类型 )
一个段内
0~ FF FFH
段 间直接方式变符号地址
( F AR 属性 )
整个内存
0~ FF FFF H
段 间间接方式变
me m
(DD 类型 )
整个内存
0~ FF FFF H
转移方式,由 CS是否变化,以及操作数类型决定转移方式无条件转移
JM P
条件转移
J cc
循环转移
LO OP xx
子程调用
CALL
段内直接短 方 式
√ √ √ ×
段内直接近 方 式
√ × × √
段 内间接方式
√ × × √
段 间直接方式
√ × × √
段 间间接方式
√ × × √
各控制转移指令允许使用的转移方式例 JMP again
JMP BX
JMP WORD PTR [BX]
JMP DWORD PTR [BX]
Jnz next
(若 next的位移量在 -128~127)
Jz AX
LOOP BX
Jnz next
(若 next的位移量超出 -128~127)
指令 JMP,Jcc,LOOPxx,CALL本身对标志无影响 。
×

1) 无条件转移指令 JMP
格式 JMP 目标地址执行操作 无条件转移到目标地址处转移方式 5种方式均可例,、、
、、、
JMP next
、、、
、、、
next,MOV AX,BX
、、、
2) 条件转移指令格式 Jcc 符号地址测试条件的助记符执行 当转移条件满足,转向目标地址去执行 。
当,,不满足,执行 Jcc后的下一条指令 。
转移方式 只允许段内直接短方式,跳转范围在 -128~127
例,、、
CMP AX,BX
JZ zero ; ZF =1?
、、、
、、、
zero,MOV flag,0
、、、
按转移条件不同,条件转移指令可以分为四大类,
① 以单个状态标志作为转移条件
② 以 CX的值为 0作为转移条件助记符 转移条件
JZ ZF= 1
JS SF=1
JO OF =1
JP PF =1
JC CF=1
助记符 转移条件
JNZ ZF= 0
JNS SF=0
JNO OF =0
JNP PF =0
JNC CF=0
助记符 转移条件
JC X Z CX=0
③ 以两个无符号数比较的结果作为转移条件
④ 以两个带符号数比较的结果作为转移条件助记符 转移条件
JA / J NB E CF ∨ Z F =0 高于 / 不低于等于
JA E / JN B / J N C CF =0 高于等于 / 不低于 / 无进位
JB / JN A E / JC CF =1 低于 / 不高于等于 / 有进位
JB E / JN A CF ∨ Z F =1 低于等于 / 不高于助记符 转移条件
JG / JN L E ( SF ⊕ OF ) ∨ Z F = 0 大于 / 不小于等于
JG E / JL SF ⊕ O F =0 大于等于 / 不小于
JL / J NG E SF ⊕ O F =1 小于 / 不大于等于
JL E / JN G ( SF ⊕ OF ) ∨ Z F = 1 小于等于 / 不大于补充,调用 DOS功能在屏幕上显示单字符方法
MOV DL,31H ;将字符的 ASCII码放在 DL中
MOV AH,2H ;功能号 2放在 AH中
INT 21H ;DOS中断程序调用例 将 BL寄存器的内容按二进制形式显示出来
1 0 1 0 0 1 1 0(BL)
MOV CX,8 ;显示字符个数为 8
next,SHL BL,1 ;将显示位移至 CF中
JC one ;CF=1?
MOV DL,30H ;CF=0,将 0的 ASCII放在 DL中
JMP exit
one,MOV DL,31H ;CF=1,将 1的 ASCII放在 DL中
exit,MOV AH,2
INT 21H ;调用 DOS功能显示
DEC CX ;循环次数减 1
JNZ next ;判断是否结束
、、、
31 30 31 30 30 31 31 30
MOV DL,BL
MOV AH,2H
INT 21H
编程方法 2,1 0 1 0 0 1 1 0
(BL)
MOV CX,8 ;显示位数为 8
next,ROL BL,1 ;将显示位移至 D0位
MOV DL,BL ;放在 DL中
AND DL,01H ;只保存显示位的值
ADD DL,30H ;转换成相应的 ASCII
MOV AH,2
INT 21H ;调用 DOS功能显示
DEC CX ;循环次数减 1
JNZ next ;判断是否结束
、、、
1 0 1 0 0 1 1 0
0 1 0 0 1 1 0 1
0 0 0 0 0 0 0 1
0 0 1 1 0 0 0 1
31 30 31 30 30 31 31 30
3) 循环指令格式 LOOPxx 符号地址执行 ① ( CX) ← ( CX) - 1 此操作不影响标志
② 检查转移条件,满足,转向目标地址去执行 ;
不满足,执行 LOOPxx后一条指令转移方式 只允许段内直接短方式,跳转范围 -128~127
助记符 转移条件 不转移条件
L O O P CX ≠ 0 CX =0
L O O P Z CX ≠ 0 且 ZF =1 CX =0 或 Z F = 0
L O O P NZ CX ≠ 0 且 Z F = 0 CX =0 或 Z F = 1
与条件转移指令不同的是,循环指令隐含 ( CX ) 减 1操作 。
用 循环指令 改写上例,
将 BL寄存器的内容按二进制形式显示出来
MOV CX,8
next,ROL BL,1
MOV DL,BL
AND DL,0000 0001B
ADD DL,0011 0000B
MOV AH,2
INT 21H
DEC CX
JNZ next
、、、
LOOP next
循环指令说明:
在串中查找字符,查到了,就可退出,
可用 LOOPNZ,不相等时继续查找 。
LOOPZ和 LOOPNZ提供了提前结束循环的可能,
不一定要等到 (CX)= 0才退出循环 。
LOOP退出循环条件是 ( CX) = 0
比较两串时,当有字符不等,就可退出,说明两字符串不等 。
可用 LOOPZ,当相等时继续比较 。
执行完 LOOPNZ或 LOOPZ后,根据 ZF标志的值判断结果对查找字符,ZF=1,说明找到;否则没有找到 。
对串比较,ZF=1,说明两串相等;否则不等 。
例 在 string字符串中查找空格字符,串长度为 N。
‘ A ’ ‘ B ’ ‘ C ’ ‘ D ’ ‘ ’ ‘ E ’,、,‘ Y ’ ‘ Z ’
1234:0000
string
DS:BX
修改偏址 BX
Y
N
AL ← 关键字
CX← 串长度
DS,BX ← 串首址
[BX]是关键字?
(CX) ← (CX)-1
找到处理未找到处理
(CX) = 0?
Y
N
结束出口用条件转移:
MOV CX,N
MOV AX,SEG string
MOV DS,AX
LEA BX,string
MOV AL,20H
next,CMP AL,[BX]
JZ find
INC BX
DEC CX
JNZ next
未找到处理
JMP exit
find,找到处理
exit,结束出口在 string字符串中查找空格字符,串长度为 N。
修改偏址 BX
Y
N
AL ← 关键字
CX← 串长度
DS,BX ← 串首址
[BX]是关键字?
(CX) ← (CX)-1
找到处理未找到处理
(CX) = 0?
Y
N
结束出口用循环指令:
MOV CX,N
MOV AX,SEG string
MOV DS,AX
LEA BX,string
MOV AL,20H
next,CMP AL,[BX]
PUSHF
INC BX
POPF
LOOPNZ next
JZ find
未找到处理
JMP exit
find,找到处理
exit,结束出口修改偏址 BX
Y
N
AL ← 关键字
CX← 串长度
DS,BX ← 串首址
[BX]是关键字?
(CX) ← (CX)-1
找到处理未找到处理
(CX) = 0?
Y
N
结束出口思考,① 去掉指令 JMP exit,程序执行结果会怎样?
② PUSHF,POPF可否去掉? 若要去掉,程序如何修改?
③ 执行完 LOOPNZ后,可否根据 CX=0来判断查找结果?
有人认为 CX=0,即说明没找到,对吗?
用条件转移:
MOV CX,N
MOV AX,SEG string
MOV DS,AX
LEA BX,string
MOV AL,20H
next,CMP AL,[BX]
JZ find
INC BX
DEC CX
JNZ next
未找到处理
JMP exit
find,找到处理
exit,结束出口用循环指令:
MOV CX,N
MOV AX,SEG string
MOV DS,AX
LEA BX,string
MOV AL,20H
next,CMP AL,[BX]
PUSHF
INC BX
POPF
LOOPNZ next
JZ find
未找到处理
JMP exit
find,找到处理
exit,结束出口
DEC BX
next,INC BX
CMP AL,[BX]
MOV CX,N
MOV AX,SEG string
MOV DS,AX
LEA BX,string
MOV AL,20H
next,CMP AL,[BX]
PUSHF
INC BX
POPF
LOOPNZ next
JZ find
未找到处理
、、、
JMP exit
find,找到处理
、、、
去掉 PUSHF,POPF指令,程序改写为:
4) 调用和返回指令主程序子程序调 用返回返回指令返回
、、、
、、、
、、、
、、、
调用指令
、、、
、、、
、、、
、、、
调用主程序子程序
、、、
指令类型 助记符过程调用和返回调用指令 CAL L
返回指令 RE T
中断调用和返回中断调用 INT
中断返回 IRE T
溢出中断 INT O
调用指令 CALL
① 段内直接调用格式 CALL 符号地址 ;NEAR属性执行 ( SP) ← ( SP) - 2
( SS,SP) ← ( IP)
( IP) ← 符号地址的偏址 ;转至符号地址处取指令入栈保存返回地址偏值
② 段间直接调用格式 CALL 符号地址 ; FAR属性执行
( SP) ← ( SP) - 2
( SS,SP) ← ( CS)
( SP) ← ( SP) - 2
( SS,SP) ← ( IP)
( IP) ← 符号地址的偏址
( CS) ← 符号地址的段址入栈保存返回地址段值入栈保存返回地址偏值转至符号地址
返回指令 RET
② 段间返回格式 RET 或 RETF
执行 ( IP) ← ( SS,SP)
( SP) ← ( SP) + 2
( CS) ← ( SS,SP)
( SP) ← ( SP) + 2
从堆栈取返回地址偏值从堆栈取返回地址偏值从堆栈取返回地址段值
① 段内返回格式 RET
执行 ( IP) ← ( SS,SP)
( SP) ← ( SP) + 2
段内和段间返回指令的汇编语言格式均可用 RET,
但机器码不同,段内为 C3H,段间为 CBH,
汇编程序据过程类型确定返回类型 。
例 1 display PROC NEAR
、、
、,C3H
、、
RET ;NEAR 属性的过程对应段内返回
display ENDP
例 2 display PROC FAR
、、
、,CBH
、、
RET ;FAR属性的过程对应段间返回
display ENDP
例 段内直接调用
code SEGMENT
、、、
、、、
CALL sub
2000,200H →,、、
、、、
、、、
、、、
sub PROC NEAR
2000,300H →,、、
、、、
、、、
RET
sub ENDP
code ENDS
00
02
A4
50
1000:1004SS:SP
调用后 (IP)=300H
1000:1006SS:SP
返回后 (IP)=200H
00
02
A4
501000:1006SS:SP
1000:1004SS:SP
例 段间直接调用
code1 SEGMENT
、、、
、、、
CALL sub
2000,100H→,、、
、、、
code1 ENDS
code2 SEGMENT
、、、
sub PROC FAR
3000,200H→,、、
、、、
、、、
RET
sub ENDP
code2 ENDS
1000:1002SS:SP
调用后 (IP)=200H
(CS)=3000H
1000:1006SS:SP
00
01
00
20
A4
50
返回后 (IP)=100H,(CS)=2000H
1000:1002SS:SP
1000:1006SS:SP
00
01
00
20
A4
50
注意:
在调用,返回指令中,
利用堆栈保存,恢复返回地址 。
对堆栈的操作应有目的性,
不乱用堆栈操作,不随意修改堆栈内容,
否则易造成死机 。
5) 中断调用,中断返回指令
▲ 中断子程以类型号 N来区分共有 256个类型号 ( 0~FFH,即 0~255)
类型号 0 处理除 0错误的中断子程类型号 4H 处理溢出时的中断子程类型号 9H 处理键盘操作的中断子程类型号 21H 与 DOS系统功能相关的中断子程
▲ 中断向量,中断子程的入口地址,包括 段地址,偏移地址类型 N的中断向量固定存放在 4个内存单元中,即
( 0,N× 4 ~ 0,N× 4 + 3 )
其中,( 0,N× 4 ~ 0,N× 4 +1 ) 存放偏移地址
( 0,N× 4+ 2 ~ 0,N× 4 +3 ) 存放段地址
▲ 中断向量表,存放 256 个中断向量的内存区域
4 × 256 = 1024 = 1K
中断向量表地址为 0,0 ~ 0,03FF H
即 0段前 1K个内存单元,低端 1K内存 。
类型 FF中断向量类型 0中断向量、,段值类型 0向量的偏值类型 1向量的偏值
、,段值
1020H
3040H
类型 FF向量的偏值
、,段值类型 1中断向量类型 N中断向量
0,0000
0,0004
0,N× 4
0,03fc
中断向量表
0:0~3FF
例中类型 N的中断子程从 3040:1020H开始
▲ 有的中断子程在软,硬件 条件满足时,CPU会自动去执行例如:
① 除 0时,CPU自动执行 类型 0的中断子程
② 按下某键,CPU自动执行 类型 9的中断子程
中断调用指令 INT
保存现场取中断子程入口地址入栈保存 IP
入栈保存 CS
入栈保存 PSW
清 IF标志清 TF标志格式 INT N ;其中 N=0 ~FFH 即 0~255
执行 ( SP) ← ( SP) - 2
( SS,SP) ← ( PSW)
IF ← 0
TF ← 0
( SP) ← ( SP) - 2
( SS,SP) ← ( CS)
( SP) ← ( SP) - 2
( SS,SP) ← ( IP)
( IP) ← ( 0,N× 4)
( CS) ← ( 0,N× 4 + 2)
执行 INT前 SS,SP
(PSW)
(CS)
(IP)SS,SP
IF=0,TF=0
从中断向量表获取中断子程的入口地址,
CS:IP转至中断子程入口取指令
INT指令
中断返回指令 IRET
格式 IRET
执行
( IP) ← ( SS,SP)
( SP) ← ( SP) + 2
( CS) ← ( SS,SP)
( SP) ← ( SP) + 2
( PSW) ← ( SS,SP)
( SP) ← ( SP) + 2
从堆栈取返回地址,
并恢复现场
CS:IP转至主程被中断处取指令执行 IRET后 SS,SP
(PSW)
(CS)
(IP)
执行 IRET前 SS,SP,、、
、、、
、、、
、、、
、、、
、、、
、、、
内 存
0000,0000 →,、
、、
0:1C× 4 =70h → FF53H 中断向量表
0:1C× 4+2=72h→ F000H (1K字节 )
、、
0,03FFH →,、
、、
、、
INT 1CH 中断调用
1271:0102H →,、
、、
、、
、、
、、
F000:FF53H →,、
、,中断子程
、、
IRET 中断返回
、、
、、
F000:FFFFH →,、
(PSW)=0300H
IF=1,TF=1
2000:0106
SS:SP
INT 1C执行前 IF=1,TF=1(PSW) =0300H
(CS) )=1271H
2000:0100SS:SP
12
71
00
03
01
02
INT 1C执行后
(IP) =0102H(PSW)=0000H
IF=0,TF=0
IRET执行后
2000:0106SS:SP
(CS)=F000,(IP)=FF53
、、
、、
了解 INT指令调用中断子程
IRET指令中断返回过程
D:\TEACH\DEBUG
-A ;汇编一条中断指令
2F68:0100 INT 1C
2F68:0102
-R ;查看执行指令前各寄存器内容
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0F68 ES=0F68 SS=0F68 CS=2F68 IP=2100 NV UP EI PL NZ NA PO NC
0F68:0100 CD1C INT 1C
-T ;T单步执行 INT 1C
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=0F68 ES=0F68 SS=0F68 CS=F000 IP=FF53 NV UP DI PL NZ NA PO NC
F000:FF53 CF IRET
-D SS:FFE8 L08 ;查看执行完后堆栈内容
0F68:FFE0 02 01 68 2F 02 F2 00 00,,h.....
-D 0:70 L10 ;查看中断向量表 0:70–0:73
0000:0070 53 FF 00 F0 A4 F0 00 F0-22 05 00 00 35 58 00 C0,......."...5X..
-U F000:FF53 ;查看 1C类型的中断子程
F000:FF53 CF IRET
.,,
利用 DEBUG学习 INT指令,
▲ 清 IF目的:进入中断子程后,禁止可屏蔽中断清 TF目的:进入中断子程后不单步执行中断子程
▲ 不随意修改中断向量表的内容,否则易造成死机
▲ 不随意修改堆栈内容
溢出中断调用 INTO
格式 INTO
执行 OF为 1时,执行 INT 4;
OF为 0时,执行 INTO下一条执行 。
例,、、
INTO
、、、
、、、
、、、
、、、
类型 4中断子程 →,、、
、、、
、、、