第八讲 8088 指令系统(续) 2006.11.7 (星期二)
DESCRIPTION
第八讲 8088 指令系统(续) 2006.11.7 (星期二). 课程内容: 五、控制传送指令 六、处理器控制指令. 如何利用地址线产生脉冲. 两态总线. 三态总线. KKK : M OV AL ,( BX ) CALL DELAY INC BX MOV AL ,( BX ) CALL DELAY JMP KKK. 五.控制传送指令 ( Control transfer instructions ) 控制传送指令概述 控制传送指令包括四种: 转移指令,循环控制指令,过程调用指令,中断指令。. - PowerPoint PPT PresentationTRANSCRIPT
第八讲 8088 指令系统(续) 2006.11.7 (星期二)
课程内容:五、控制传送指令五、控制传送指令六、处理器控制指令六、处理器控制指令
如何利用地址线产生脉冲
8284时钟
+5VMN/MX
A19-A16
CLKRESETREADY
AD15-AD0DEN DT/R
BHE
ALE STB
RD
WR
M/ I O
BHE
存储器 I /O接口
数据总线
地址总线
控制总线
8282锁存器(3 )片
OE
RESET
DI R TOE
8286收发器
(2 )片
8086
奇 偶
READY
三态总线
两态总线
KKK : MOV AL ,( BX )
CALL DELAY
INC BX
MOV AL ,( BX )
CALL DELAY
JMP KKK
五.控制传送指令五.控制传送指令( Control transfer instructions )
控制传送指令概述控制传送指令概述
控制传送指令包括四种:控制传送指令包括四种:
转移指令,循环控制指令,过程调用指令,中断指令。转移指令,循环控制指令,过程调用指令,中断指令。
指令类型指令类型 助记符助记符无条件转移无条件转移 JMPJMP
条件转移条件转移 JE/JZ, JNE/JNZ, JS, JNS, JP/JPE, JNP /JPO,JO, JE/JZ, JNE/JNZ, JS, JNS, JP/JPE, JNP /JPO,JO, JNO, JC, JNC, JB/JNAE, JAE/JNB, JA/JNBE, JNO, JC, JNC, JB/JNAE, JAE/JNB, JA/JNBE, JBE/JNA,JG/JNLE, JGE/JNL, JL/JNGE, JBE/JNA,JG/JNLE, JGE/JNL, JL/JNGE, JLE/JNG ,JCXZJLE/JNG ,JCXZ
循环控制循环控制 LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZLOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ
过程调用过程调用 CALL, RETCALL, RET
中断指令中断指令 INT, INTO, IRETINT, INTO, IRET
(一)、无条件转移指令无条件转移指令1. JMP ( jmp )目标标号
JMP 指令必须指定转移的目标地址(或转向地址)。
转移分成两类:段内或段间转移。
( 1 )段内直接转移:只要改变 IP 寄存器的内容
指在同一段的范围之内进行转移
( IP )←( IP )当前 + 目标标号所代表的地址偏移量
地址偏移量又称为符号地址
目标标号为 8 位,称为短转移。
目标标号为 16 位,称为近转移。
例如:代码段内有一条无条件转移指令在汇编语言中使用符号地址。JMP SHORT NEXT 指令执行过程:NEXT— 在汇编语言中使用符号地址( IP )←( IP )当前 +D8 ( 8 位带符号数)
源程序 :条件转移指令: JMP SHORT next
...
...
...
next: MOV AL,03H
OP
...
...
OP
03H
...
...
3000:1000H
3000:1050H
(IP)当前( NEXT 的值定义为 50H )
(IP)=(IP) 当前 +D8
内存
向前跳, D8 为正数,
往回跳, D8 用补码
JMP SHORT ABC
若 ABC = 0F0H ,则回跳 16字节
( 2 ) 段内间接转移: ( CS) 不变,只改变 (IP)
格式: JMP OPR
OPR — 为 16 位寄存器、
或存储器(除立即数以外的任何一种寻址方式)
执行操作: ( IP ) ( EA ) 或( IP ) (reg16)
IP 指针的内容根据寄存器或存储器(数据段、附加段、堆栈段)的内容而改变。
指令格式举例:
JMP BX JMP SI
JMP TABLE [BX] ; 操作数已定义为 16 位存储器
JMP ALPHA_WORD ;操作数已定义为 16 位存储器
JMP WORD PTR [BP][DI] ;操作数已定义为 16 位存储器
例: (IP)=5000H, (CS)=3000H , (DS)=1000H, (BX)=1000H
(11000H)=1234H,
JMP BX ; (IP)=1000H, 在当前段内,属于 ;寄存器寻址
JMP WORD PTR [BX] ;(CS)=3000H , (IP)=1234H
在当前段内, (PA)=(16d(DS)+(BX))=(11000H) 为 1234H
将 PA 地址存储器的内容( 1234H )给 IP
;属于寄存器间接寻址。
( 3 )段间直接转移:要修改 IP 、 CS 寄存器的内容。 转到另一段去执行程序。
转移目标地址 = 新的段地址和偏移地址两部分组成。
格式: JMP FAR PTR OPR ;
OPR— 在汇编语言中使用 符号地址
( 如标号 AKK, 假设定义在另一程序段 CC00 : 0044) 。
转移地址与指令不在同一个段里。
在机器语言中则要指定转向地址的偏移地址和段地址
JMP FAR PTR AKK
执行操作: ( IP )← OPR 所在的段内偏移地址 0044H 。
( CS )← OPR 所在的段的段址 CC00H 。
直接转移通过符号地址加载 IP 和 CS ,间接转移通过存储器内容加载 IP 和 CS .
( 4 ) 段间间接转移:( CS) 、 (IP) 都改变格式: JMP DWORD PTR OPR
OPR — 存储器操作数(除立即数和寄存器以外的任何一种寻址方式)
执行操作:将 4 字节连续地址分别送给 IP 和 CS
( IP )←( EA ) ( CS )←( EA+2 )例:已知 ( BX ) =1000H ,( SI ) =2000H , (DS)=2000H
(23000H)=2212H, (23002H)=4434H
JMP DWORD PTR [BX][SI]
则: ( BX ) + ( SI ) =3000H
(IP)= ( PA ) =(16d(DS)+(BX)+(SI))=(23000H)=2212H
( CS ) =(PA+2)=4434H
2. 条件转移指令
指令格式: J cc OPR
操作:根据上一条指令所设置的条件码来判别测试条件转移。
每一种条件转移指令都有它的测试条件。
满足条件时 :
( IP )←( IP )当前 + OPR ( D8 )
使用相对寻址方式,范围 -128~+127 个字节
不满足条件时:( IP )不变,顺序执行下一条指令
(该指令为两字节长度,一字节为指令功能码,一指令为一个字节的相对跳转地址偏移量)
按转移条件不同,条件转移指令可以分为四大类:① 以单个状态标志作为转移条件助记符 转移条件
助记符助记符 转移条件转移条件 助记符助记符 转移条件转移条件
JZ/JEJZ/JE ZF=1ZF=1 JNZ/JNEJNZ/JNE ZF=0ZF=0
JSJS SF=1SF=1 JNSJNS SF=0SF=0
JOJO OF=1OF=1 JNOJNO OF=0OF=0
JP/JPEJP/JPE PF=1PF=1 JNP/JPOJNP/JPO PF=0PF=0
JCJC CF=1CF=1 JNCJNC CF=0CF=0
② 以 CX 的值为 0 作为转移条件
助记符助记符 转移条件转移条件
JCXZ CX=0
助记符助记符 转移条件转移条件
JA/JNBE CF ZF=0∨ 高于 / 不低于等于不低于等于
JAE/JNB/JNC CF=0 高于或等于 / 不低于不低于 / 无进位
JB/JNAE/JC CF=1 低于低于 / 不高于等于 / 有进位
JBE/JNA CF ZF=1∨ 低于或等于低于或等于 / 不高于
③ 以两个无符号数比较的结果作为转移条件
④ 以两个带符号数比较的结果作为转移条件
助记符助记符 转移条件转移条件JG/JNLE ( SF OF⊕ )∨ ZF=0 大于 / 不小于等于不小于等于JGE/JNL SF OF=0⊕ 大于或等于 / 不小于不小于JL/JNGE SF OF=1⊕ 小于小于 / 不大于等于
JLE/JNG ( SF OF⊕ )∨ ZF=1 小于或等于小于或等于 / 不大于
注意几点:注意几点:
① 所有条件转移指令都是相对转移形式,(两字节指令)
范围( -128~+127 )。
当需往一个较远地方进行条件转移时,
选用条件转移转到附近一个单元,
然后,再用无条件转移转到较远的目的地。
② 条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移,
③ 条件转移指令不影响标志位
例: 程序段 2000H : 3040H DONE : MOV AX , 05H
…………
2000H : 3079H JNE DONE
求 DONE 为何值
(IP)=(IP) 当前
程序段
2000H : 3040H DONE : MOV AX , 05H
…………
2000H : 3079H JNE DONE
执行此指令时,
IP 指针为何OP
05H
...
...
OP
C5H
...
...
2000:3079H
2000:3040H(IP)当前
内存
2000:307BH
DONE
0011000001111011
1111111111000101
0011000001000000
+
307BH
C5H
条件转移指令应用
例:比较二个数是否相等 如相等做动作 1 否则做动作 2
……
CMP AX , BX
JE action_1JE action_1
Action_2: ……
……
action_1 action_1 : : ……
或 …… CMP AX , BX
JNZ action_2JNZ action_2
action_1: ……
action_2action_2 :: ……
=?AX BXY
action_1action_1 action_2action_2
N
=?AX BXN
action_2action_2 action_1action_1
Y
例:在 M 中有一个首地址为 array 的 N 字数组 ,
要求测试其中正数、 0 及负数的个数 . ( 带符号数判断 )
正数个数放在 : ( DI )中, 0 的个数放在 : ( SI )中,
负数的个数放在 : N- ( DI ) - ( SI )送( AX )
如果没有负数转 skip, 如果有负数转 neg_val
程序: mov cx,N ; N 字数组 mov bx,0
mov di,bxmov si,bx ag
ain: cmp word ptr arrary[bx],0 jle less_or_ag inc di ; 正数个数 jmp short neat
less_or_ag: jl neat inc si ; 0 的个数
neat: add bx,2 dec cx jnz again
mov ax,Nsub ax,disub ax,sijz skip; 没有负数jmp near ptr neg_val; 有负
数skip: ……neg_val: ……
(三) 过程 ( 子程序 ) 调用指令子程序—程序中具有独立功能的部分编写成独立程序模块。子程序(过程)定义格式: 符号名 ( AA ) PROC 类型( FAR/NEAR ) ……
RET ( RETURN ) 符号名( AA ) ENDP
子程序调用和返回指令: CALL AA
过程有两种类型:按过程与调用语句间的位置,过程有两种类型。NEAR 类型:调用指令与过程在同一个段中FAR 类型:调用指令与过程不在同一个段中
CALL 指令和 RET 指令都不影响条件码。
CALL( Call a procedure) 调用 CALL 调用指令 调用地址由指令给出
调用时:将当前地址入栈 ( CS )。
( IP )。
CALL 调用指令有 4种:
段内直接调用 段间直接调用
段内间接调用 段间间接调用
例 :
CSEG1 SEGMENT
CALL FAR PTR subp ;此处的 CS : IP入栈转 subp
…
CSEG1 ENDS
CSEG2 SEGMENT
…
subp PROC FAR
…
RET
subp ENDP
CSEG2 ENDS
(2) 、 RET ( Reture from procedure)返回 RET返回指令
放在子程序的末尾
使子程序在功能完成后返回调用程序继续执行。
* 为能准确返回 ,返回指令类型与调用指令类型相对应。
RETRET返回指令有返回指令有 44种:种:
段内返回 段间返回
段内带立即数返回 段间带立即数返回
在子程序调用时,返回地址入栈
返回时:将返回地址出栈 ( IP )(段内或段间)。
( CS )(段间)。
操作数 执行操作符号地址 (SHORT ) (IP) ← (IP) 当前 + 8 位符号地址位移量(段内短跳)符号地址 ( NEAR 属性 ) (IP) ← (IP) 当前 + 16 位符号地址位移量(段内近
跳)reg ( 16 位)或 mem (W 类型 )
(IP) ← ( reg ) 或 (IP) ← (mem) (段内间接跳)
符号地址 ( FAR 属性 ) (IP) ← 符号地址的偏值 (段间直接跳)
(CS) ← 符号地址的段值mem ( DW 类型 ) (IP) ← ( mem ), (CS) ← (mem+2 ) (段内短跳)
◢ 当前 IP 的值为控制转移指令下一条指令的偏移地址。
◢ 位移量 = 符号地址的偏移量 - 当前 IP 的值。
◢ 符号地址(目标地址) = 当前 IP 的值 + 位移量
(3) (3) 、小结 :、小结 :
指令格式: JMP 操作数
转移方式:转移方式:由 CS 是否变化、以及操作数类型决定情况如下表
转移方式 CS 操作数 跳转范围段内直接短 方 式 不变 符号地址 (SHOR
T )-128 ~ 127 即 0~FF
H
段内直接近 方 式 不变 符号地址 (NEAR 属性 )
一个段内 0~FFFFH
段 内间接方式 不变 Reg mem (W 类型 ) 一个段内 0~FFFFH
段 间直接方式 变 符号地址 (FAR 属性 )
整个内存 0~FFFFFH
段 间间接方式 变 mem(DW 类型 ) 整个内存 0~FFFFFH
各控制转移指令允许使用的转移方式
转移方式 无条件转移JMP
条件转移Jcc
循环转移LOOPxx
子程调用CALL
段内直接短 方 式 √ √ √ ×
段内直接近 方 式 √ × × √
段 内间接方式 √ × × √
段 间 直接方式 √ × × √
段 间间接 √ × × √
例 : JMP again (√)
JMP BX (√)
JMP WORD PTR [BX] (√)
JMP DWORD PTR (√)
JZ AX ( 不能是字, AX) (×)
JNZ next (?)
(若 next 的位移量超出 -128~127)
(四)循环控制指令格式 : LOOPxx 符号地址
执行 操作 :
① ( CX ) ← ( CX ) - 1 此操作不影响标志
② 检查转移条件 xx ,满足转向目标地址去执行 ;
不满足执行 LOOPxx 后一条指令
转移方式 只允许段内直接短方式,跳转范围 -128~127
助记符 转移条件 不转移条件LOOP CX≠0 CX=0
LOOPZ CX≠0且 ZF=1 (相等) CX=0 或 ZF=0 (不等)
LOOPNZ CX≠0且 ZF=0 (不等) CX=0 或 ZF=1 (相等)
与条件转移指令不同的是:循环指令隐含 ( CX ) 减1操作。
例:用循环指令将 BL 寄存器的内容按二进制形式显示出来
学习: LOOP 指令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
循环指令说明:• LOOP退出循环条件是( CX ) =0
• LOOPZ 和 LOOPNZ提供了提前结束循环的可能 ,
不一定要等到 (CX)=0才退出循环。
▲ 在串中查找字符,查到了,就可退出,
可用 LOOPNZ ,不相等时继续查找。
▲比较两串时,当有字符不等,就可退出,说明两字符串不等。
可用 LOOPZ ,当相等时继续比较。
▲执行完 LOOPNZ 或 LOOPZ 后,根据 ZF 标志的值判断结果
对查找字符, ZF=1,说明找到;否则没有找到。
对串比较, ZF=1, 说明两串相等;否则不等。
例: 在 string 字符串中查找空格字符,串长度为 N 。
用条件转移: JZ 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
未找到处理 ……
Find: 找到处理 ……
修改偏址 BX
Y
N
AL 关键字
CX 串长度N
DS : BX 串首址
判 [BX] 是关键字?
(CX) (CX)-1
找到处理未找到处理
(CX) = 0 ?Y
N
结束出口
MOV CX , 28H
MOV SI , 0FFFFH
NEXT1 : INC SI
CMP BYTE PTR [SI] , 0
LOOPZ NEXT1 ;当 Z=1 、( CX )≠ 0 循环;
当 Z=0 ,或( CX ) =0 结束循环。
JNZ OKK ;当找到非零元素转 OKK 。
CALL DISPLAY1 ;当找不到非零元素转 DISPLAY1
……OKK : CALL DISPLAY2
……
用 LOOPZ 和 LOOPNZ 指令提供提前结束循环的可能性。有时需要字符串中查找一个字符,找到后可提前结束循环,
用 LOOPZ 、 LOOPNZ 来处理。
例: 40 个元素构成的数组,找出第一个非零元素。DISPLAY1 ……
RETDISPLAY2 ……
RET
指令 JMP 、 CALL 、 Jcc 、 LOOPxx 本身对标志无影响。
4 、中断指令 中断( Interrupt ):
有时当系统运行或程序运行期间遇到某些特殊情况,
需要计算机自动执行一组专门的例行程序来进行处理。
中断例行程序(或中断子程序)( Interrupt routine ) :所执行的这组程序就称为中断子程序。
种类:
中断分为内部(软)中断和外部(硬)中断两种。
内部中断—如除法运算中除数为 0 、中断指令引起的中断。
外部中断—处理 I/O 设备与 CPU 之间的通信。
CPU 响应一次中断自动完成三件事情:
( PSW )入栈 — 保护现场,
( CS ),( IP )保存入栈 — 保留断点,
转中断例行程序去执行。 中断返回时:
恢复( IP )、( CS )及( PSW )
中断向量:中断例行程序入口地址。
IBM-PC 中,存储器的最底地址 00000H——003FFH 为中断向量区, 存放 256 种类型中断例行程序入口地址,每个中断向量占 4 个单元。
中断指定类型号 N × 4——取得指定类型的中断向量地址。
例:中断类型 9 , 9 ×× 4=36
00024H——00027H 单元中放中断向量。
IBM-PC 机中为每个类型规定了一种功能。
中断类型 功能类型 0 除数为 0 中断例行程序
类型 1 单步
类型 2 非屏蔽中断, NMI类型 3 设置断点
类型 4 溢出处理中断, INTO 指令
类型 10 显示设备中断
类型 20 程序结束中断
类型 21 DOS系统功能调用功能程序
* 除非特别注明,类型号是以 16 进制形式表示的。
(1). 介绍几条指令: INT n , IRET
格式: INT n ; n—常数或表达式, n=0—255
或 INT
执行操作:
(SP)←(SP)-2 , (SP)) ←(PSW)
(SP)←(SP)-2 , (SP)) ← (CS)
(SP)←(SP)-2 ,← (IP)
(IP) ←(N×4)
(CS) ←(N×4+2)
清除 IF 、 TF ,避免进入中断以后不被外面其它中断所打断
及进入中断以后按单步执行。
类型 0~3 的中断称为内部中断。
类型 0 :指令系统没有 INT0这条指令
除数为 0 中断
除数为 0 :它既不是外部中断 也不是软件中断。
是由 CPU自身产生的,所以无对应中断指令。
有符号数进行除法所得的商超出规定范围
有符号数进行除法运算,所得的商超出规定范围,
CPU自动产生类型为 0 的中断,转入响应的中断处理程序。
。
内存内存 00 :: 0000H~0:03FFH0000H~0:03FFH 区域中,构成中断向量表,存放中断处理程序入口地区域中,构成中断向量表,存放中断处理程序入口地址。址。每每 44 个单元对应个单元对应 11 个中断源。关系如下表:个中断源。关系如下表:
中断处理程序入口地址的地址 类型
00000H~00001H 类型 0(IP)
00002H~00003H 类型 0(CS)
00004H~00005H 类型 1(IP)
00006H~00007H 类型 1(CS)
00008H~00009H 类型 2(IP)
0000AH~0000BH 类型 2(CS)
0000CH~0000DH 类型 3(IP)
0000EH~0000FH 类型 3(CS)
00010H~00011H 类型 4(IP)
00012H~00013H 类型 4(CS)
…… ……
003FCH~003FDH 类型 255(IP)
003FEH~003FFH 类型 255(CS)
∴ INTO跟在有符号数 + 、 - 后面:
* 这条指令可以写在一条算术指令后面。
若产生溢出, OF=1 ,则启动中断过程,不进行任何操作。
(2) IRET——从中断返回指令( Interrupt return ) 所有中断过程(服务程序)不管是硬还是软,最后一条指令一定是:
IRET退出中断过程,返回中断时断点。
格式: IRET
执行操作:执行操作: (IP)←((SP)+1,(SP)) , (SP) ←(SP)+2
(CS)←((SP)+1,(SP)) , (SP) ←(SP)+2
( PSW)←((SP)+1,(SP)) , (SP) ←(SP)+2
六、处理器控制指令
(一)标志处理指令
1 、 CLC ( Clear carry flag ) 清 CF 标志2 、 STC ( Set carry flag ) 置 CF 标志3 、 CMC ( Complement carry flag ) 对 CF 求反4 、 CLD ( Clear direction flag ) 清 DF 标志5 、 STD ( Set direction flag ) 置 DF 标志6 、 CLI ( Clear interrupt flag ) 清 IF 标志7 、 STI ( Set interrupt enable flag ) 置 IF 标志 (二)其他处理机控制指令
1 、 NOP ( No operation ) 空操作2 、 HLT ( Halt ) CPU暂停状态3 、 WAIT ( Wait while pin not asserted ) CPU 等待状态4 、 ESC ( Escape ) 交权5 、 LOCK ( Lock bus ) 总线锁定
TEST
标志处理指令
▲ 设置和清除标志的指令,只影响指令指定的标志。
指令格式 执行操作CLC CF=0
STC CF=1
CLM CF ←
CLD DF=0
STD DF=1
CLI IF=0
STI IF=1
CF
子程序设计寄存器的保存与恢复
FFF PROGPUSH BXMOV BX, AXSHL BX, 1ADD AX, BXPOP BXRET
SUB ENDP
AX 内容乘以11H 的积
CALL 子程序调用指令
CALL FFF
RET
作业:
• P119( 1 ) 3.42 ,( 2 ) 3.43 ,( 3 ) 3.47 , 3.83 ,
( 4 )程序段 2000H : 3062H JNE DONE
………… 2000H : 3090H DONE : MOV AX ,
05H 执行后 DONE 为何值