nullnull*五.控制传送指令(Control transfer instructions)
(一)、控制传送指令概述
控制传送指令包括四种:
转移指令,循环控制指令,过程调用指令,中断指令。
1、转移指令
转移指令包括两种:
(1)、JMP (Jump) 无条件转移指令
(2)、Jcc 条件转移指令
null*(1)、JMP(Jump)无条件转移指令
JMP指令的操作:无条件地将控制转移到指令中
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
的目的地
目标地址可以是:直接方式/间接方式给出。
JMP指令不影响标志位。
转移分成两类:段内或段间转移。
无条件转移指令有五种格式:
段内直接短转移
段内直接近转移
段内间接转移
段间直接远转移
段间间接转移null*(2)、Jcc 条件转移指令
汇编程序设计中常利用条件转移指令来实现分支。
“cc”-表示条件。
操作数必须是短标号。转移范围为:-128~+127
具体条件转移指令分四种情况讨论:
根据单个条件标志的设置情况转移
JZ(JE)/JNZ(JNE),JS/JNS,JO/JNO,JP(JPE)/JNP(JPO), JB(JNAE、JC)/JNB(JAE、JNC),
根据两个无符号数比较结果转移
JB(JNAE、JC)/JNB(JAE、JNC),JBE(JNA)/JNBE(JA)
比较两个带符号数,并根据比较结果转移
JL(JNGE)/JNL(JGE),JLE(JNG)/JNLE(JG)
测试CX的值为零转移 JCXZnull*2、 过程调用指令
如果有一些程序段在不同地方反复出现,可以将这些程序段设计成为过程(子程序)供调用。过程结束,返回调用处。
过程调用指令包括:过程调用指令和返回指令
(1)、 CALL( Call a procedure)调用
CALL调用指令
段内直接调用 段间直接调用
段内间接调用 段间间接调用
(2)、 RET( Reture from procedure)返回
RET返回指令
段内返回 段间返回
段内带立即数返回 段间带立即数返回null*3、循环控制指令
循环控制指令用于使一些程序段反复执行形成循环程序。
循环控制指令有三种:
(1)、LOOP (Loop) 循环指令
(2)、LOOPE/LOOPZ (Loop if equal / Loop if zero)
当相等/为“0”循环
(3)、LOOPNE/LOOPNZ (Loop if not equal/ Loop if not zero)
当不相等/不为“0”循环null*4、中断指令
8086/8088CPU 可以在程序中安排一条中断指令引起中断过程,这种中断称为软中断。
8086/8088CPU共有三条中断指令:
(1)、INT (Interrupt)
(2)、INTO(Interrupt if overflow)
(3)、IRET(Interrupt Return)null*
归结控制转移指令分类null*(二) 控制转移指令(Control transfer instructions)
1、转移指令
转移指令将程序控制从一处转换到另一处的最直接方法。
在CPU内部,转移是通过将目标地址传送给CS:IP来实现的。
注意:CS—段地址
IP—偏移量 null* 先介绍控制和非控制转移指令的概念
非控制转移指令:指令本身对CS和IP均无操作,形成顺序
执行结构。
顺序执行结构: 顺序存放,顺序执行
控制转移指令: 以CS和IP为主要操作对象,
改变CS和IP寄存器的值, 就改变了程序执行的流程。null*在8086/8088中,指令的地址固定由CS和IP两个寄存器决定。
CS和IP两寄存器的内容决定了程序的流程 ,
改变CS和IP寄存器的值, 就改变了程序执行的流程。
8086/8088 中CS和IP的变化规则:
reset复位后, CS = FFFFH, IP = 0
故8088从内存FFFF:0000H处取第一条指令执行,
第一条指令在内存的ROM区。
非控制转移指令
CPU取来一条指令后, 自动将IP的值加上该指令的字节数,
使IP顺序指向下一条指令, CPU取来紧接着的指令执行。
(此时IP的变化由CPU内部的硬件自动完成)null* 控制转移指令以CS和IP为主要操作对象
控制转移指令改变CS和IP的值,
使程序产生分支、调用结构。
分支结构、调用结构: 顺序存放,非顺序执行
例:比较 AX 、 BX 的大小,将大数存于( max )单元
CMP AX, BX
JGE great
XCHG AX, BX
great: MOV [max], AXnull*(1)、JMP(Jump)无条件转移指令
JMP(jmp)跳转指令。
JMP指令必须指定转移的目标地址(或转向地址)。
转移分成两类:段内或段间转移。
段内转移:只要改变IP寄存器的内容
指在同一段的范围之内进行转移
即用新的转移目标地址代替原有的IP值。
段间转移:要修改IP、 CS寄存器的内容
转到另一段去执行程序。
即转移目标地址= 新的段地址和偏移地址两部分组成。null* 段内直接短转移:
格式:JMP SHORT OPR
OPR—在汇编语言中使用符号地址。
在机器语言中存放位移量D8
位移量D8 = 符号地址的偏移地址 - 当前IP的值
执行操作: IP ← IP 当前+D8
SHORT 短属性标号
8位位移量D8的范围在(-128 ~ 127)之间,占有一个字节。
而指令本身占有两个字节。
null*例如:代码段内有一条无条件转移指令,在汇编语言中使用符号地址JMP SHORT NEXT指令执行过程:
NEXT—在汇编语言中使用符号地址
IP ← IP当前 + D8null* 段内直接近转移:
格式:JMP NEAR PTR OPR
OPR—在汇编语言中使用符号地址。
在机器语言中存放位移量D16
位移量D16 = 符号地址的偏移地址 - 当前IP的值
执行操作: IP ← IP 当前 +D16
NEAR近属性标号
位移量为D16范围:-32768~+32767H,占有两个字节。
而指令本身占有三个字节。可以转移到段内的任一位置。
过程:如同SHORT,只是位移量为D16范围-32768~+32767H,
占有两个字节。null* 段内间接转移: CS 不变,只改变 IP
格式:JMP WORD PTR OPR
OPR —为16位寄存器、
或存储器(除立即数以外的任何一种寻址方式)
执行操作: IP (EA)
或 IP reg16
指令格式举例:
JMP AX JMP SI
JMP TABLE [BX] ; 操作数已定义为16位存储器
JMP ALPHA_WORD ;操作数已定义为16位存储器
JMP WORD PTR [BP][DI]null*例:
DS =1000H, BX =1000H, CX =5000H, CS =3000H
(11000H)=1234H, ( 11002H)=5678H
JMP CX ;IP =5000H
JMP WORD PTR [BX] ; CS =3000H , IP =1234H
(PA) = (16d DS + BX)=(11000H)=1234H null* 段间直接(远)转移: (CS) 、 (IP)都改变
格式:JMP FAR PTR OPR;
OPR—在汇编语言中使用符号地址。
符号地址与指令不在同一个段里。
在机器语言中则要指定转向地址的偏移地址和段地址
执行操作: IP ←OPR所在的段内偏移地址。
CS ←OPR所在的段的段址。
而指令本身占有5个字节:
用2个字分别存放符号地址的段值、偏移值,
用1个字节存放操作码。null*FAR 远属性标号, 标号与控制转移指令不在同一段中。
在汇编语言中,在机器语言中存放如下:
例:
C1 SEGMENT
…
JMP FAR PTR next_prog
…
C1 ENDS
C2 SEGMINT
…
next_prog: …
…
C2 ENDS2000:0250Hnull* 段间间接转移:(CS) 、 (IP)都改变
格式:JMP DWORD PTR OPR
OPR —使用存储器
(除立即数和寄存器以外的任何一种寻址方式)
执行操作: IP ←(EA)
CS←(EA+2)
例:已知 BX =1000H, SI =2000H , DS =2000H
(23000H)=2211H, (23002H)=4433H
JMP DWORD PTR [BX][SI]
则: BX + SI =3000H
IP=(PA)=( 16d(DS)+(BX)+(SI) )=(23000H)=2211H
CS =(PA+2)=4433Hnull* ( 2) Jcc 条件转移指令
根据单个条件标志的设置情况转移(10种)
JZ(JE) / JNZ(JNE), JP(JPE) / JNP(JPO), JS/JNS, JO/JNO,
JC/JNC
根据两个无符号数比较结果转移(4种)
JB(JNAE) / JNB(JAE), JBE(JNA) / JNBE(JA)
比较两个带符号数,并根据比较结果转移(4种)
JL(JNGE) / JNL(JGE), JLE(JNG) /JNLE(JG)null*指令格式:J cc OPR
操作:根据上一条指令所设置的条件码来判别测试条件转移。
每一种条件转移指令都有它的测试条件。
满足条件时 :
IP ← IP 当前+ 符号扩展到16位后的位移量D8,
使用相对寻址方式,范围-128~+127个字节
即条件转移指令都是“直接短转移”
不满足条件时: IP 不变,顺序执行下一条指令null*注意几点:
所有条件转移指令都是相对转移形式,
范围(-128~+127)。
当需往一个较远地方进行条件转移时,
选用条件转移转到附近一个单元,
然后,再用无条件转移转到较远的目的地。
② 条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移,
③条件转移指令不影响标志位null*按转移条件不同,条件转移指令可以分为四大类:
① 以单个状态标志作为转移条件助记符 转移条件② 以CX的值为0作为转移条件null*③以两个无符号数比较的结果作为转移条件④以两个带符号数比较的结果作为转移条件null*条件转移指令应用
例:比较二个数是否相等 如相等做动作1 否则做动作2
……
CMP AX,BX
JE action_1
Action_2: ……
……
action_1: ……
或 ……
CMP AX,BX
JNZ action_2
action_1: ……
……
action_2: ……null*例: 两个数放在X,Y单元里,(带符号数判断)
先判X>50,YES→too_high,
NO→ 做X-Y , 溢出→overflow ,否则求|X-Y|→result … …
MOV AX, X CMP AX, 50
JG too_high ;大于转too_high
SUB AX,Y
JO overflow ;溢出转overflow
JNS nonneg ; S=0转nonneg
NEG AX
nonneg: MOV result , AX
too_high: ……
overflow: ……null* 例:在存储器中有一个首地址为array的N个字的数组,要求测试其中正数、0及负数的个数. (带符号数判断)
正数个数放在: DI 中,
0的个数放在: SI 中,
负数个数N-DI-SI 送AX
如果没有负数转skip,
如果有负数转neg_val程序: mov cx, N ;N字数组
mov bx, 0
mov di, bx
mov si, bx
again: 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, N
sub ax, di
sub ax, si
jz skip ;没有负数
jmp near ptr neg_val ;有负数
skip: ……
neg_val: ……null*2、 过程( 子程序 )调用指令
过程—程序中具有独立功能的部分编写成独立程序模块。
过程(子程序)定义格式:
符号名 PROC 类型
……
符号名 ENDP
子程序调用和返回指令: CALL RET
过程有两种类型:
按过程与调用语句间的位置,过程有两种类型。
NEAR类型:调用指令与过程在同一个段中
FAR类型:调用指令与过程不在同一个段中
CALL指令和RET指令都不影响条件码。null*(1)、 CALL( Call a procedure)调用
CALL调用指令 调用地址由指令给出
CALL调用指令有4种:
段内直接调用 段间直接调用
段内间接调用 段间间接调用
null* 段内直接调用
格式:CALL DST ; SP ← SP -2 , (SP+1 ),(SP) ← IP
; IP ← IP +D16
DST—给出转向地址(子程序的入口地址)。
D16—机器指令中的位移量(转向地址和返回地址之差)
位移量为D16范围-32768~+32767H,占有两个字节。null*工作过程如下:
例: NEAR 类型过程
code SEGMENT ;code段
…
CALL subp ;指令YYY的IP入栈, D16 =subp-yyy
XXX:YYY …
…
subp PROC NEAR ;过程定义
…
RET ;返回
subp ENDP
code ENDSnull* 段内间接调用:
格式: CALL DST
↑
WORD PTR OPR
OPR —为16位寄存器,或存储器
(除立即数以外的任何一种寻址方式)
执行操作:
SP ← SP -2
(SP+1 ),(SP) ← IP
IP ←(EA)
EA—由DST寻址方式所确定的有效地址。null* 段间直接调用:
格式:CALL FAR PTR DST
执行操作 :
SP ← SP -2
( SP +1 ),(SP)← CS
SP ← SP - 2
(SP+1 ), (SP)← IP
IP ←DST偏移地址(指令中第2,3字节 )
CS ←DST段地址(指令中第4,5字节 )null*例 : …
CSEG1 SEGMENT
CALL FAR PTR subp ;a处的CS:IP入栈, 转subp
a: …
…
CSEG1 ENDS
CSEG2 SEGMENT
…
subp PROC
…
…
RET
subp ENDP
…
CSEG2 ENDSnull* 段间间接调用:
格式: CALL DWORD PTR DST
执行操作:
SP ← SP -2
( SP+1 ) ,(SP) ← CS
SP ← SP -2
( SP+1 ) ,(SP) ← IP
IP ←(EA)
CS ←(EA)+2 转子程序入口
EA—由DST的寻址方式确定的有效地址。null*(2)、 RET( Reture from procedure)返回
RET返回指令
放在过程 (子程序)的末尾
使过程(子程序)在功能完成后返回调用程序继续执行
*为能准确返回,返回指令类型与调用指令类型相对应。
RET返回指令有4种:
段内返回 段间返回
段内带立即数返回 段间带立即数返回
返回时:将返回地址出栈 IP (段内或段间)
CS (段间)null* 段内返回:
格式: RET
机器码: C3H或者C2H
执行操作: IP ←(SP+1 ) ,(SP)
SP ← SP + 2
段间返回:
格式: RET
机器码: CBH或CAH
执行操作: IP ← (SP+1 ),(SP)
SP ← SP +2
CS ← (SP+1 ) ,(SP)
SP ← SP +2null* 段内带立即数返回
格式: RET imm16
执行操作: IP ←(SP+1 ),(SP)
SP ← SP +2
SP ← SP + D16
SP ← SP + D16用于废除一些在执行CALL指令之前的入栈的参数null*例如:RET imm16 堆栈使用情况
……
CODE SEG MENT
ASSUME CS : CODE, DS : DATA
MAIN PROC FAR
START: MOV AX,DATA MOV DS,AX
……
PUSH BX
PUSH CX
CALL DELCHAR
CS:XXXX MOV AH,4CH
INT 21H
MAIN ENDP DELCHAR PROC
……
RET 4
DELCHAR ENDP
CODE ENDS
END START
RET imm16 堆栈使用情况 null*
段间带立即数返回:
格式:RET EXP
执行操作:
IP ← (SP+1 ),(SP)
SP ← SP + 2
CS ← (SP+1 ),(SP)
SP ← SP +2
SP ← SP +D16
CALL指令和RET指令都不影响条件码。null*另一个代码段
PRO-A PROC PRO-B PROC
…… ……
CALL near ptr PRO-B CALL near ptr PRO-C (IP)=2500H (IP)=4000H
…… ……
CALL near ptr PRO-C RET
(IP)=3700H …… PRO-C PROC
…… RET RET
例:学习使用 段内、段间直接调用指令的使用及堆栈情况
主程序 MAIN在一个代码段中
子程序 PRO-A PRO-B PRO-C 在另一个代码段
程序调用关系:(SP)=0100H
MAIN
……
……
CALL far ptr PRO-A
(CS)=0500H
(IP)=1000H
……
null*堆栈情况: null* ◢ 当前IP的值为控制转移指令下一条指令的偏移地址。
◢ 位移量 = 符号地址的偏移量 - 当前IP的值。
◢ 符号地址(目标地址)= 当前IP的值 + 位移量(3) 、小结 :
指令格式: JMP 操作数 null* 转移方式:由CS是否变化、以及操作数类型决定情况如下表null* 各控制转移指令允许使用的转移方式null*例 : JMP again (√)
JMP BX (√)
JMP WORD PTR [BX] (√)
JMP DWORD PTR [BX] (√)
JZ AX (×)
LOOP BX (×)
JNZ next (?)
(若 next的位移量超出-128~127)
指令JMP、CALL 、Jcc、LOOPxx本身对标志无影响。null*3、循环控制指令
格式 : LOOPxx 符号地址
执行 操作 :
① CX ← CX - 1 此操作不影响标志
② 检查转移条件xx,满足转向目标地址去执行;
不满足执行LOOPxx后一条指令
转移方式 只允许段内直接短方式,跳转范围-128~127
null*与条件转移指令不同的是:循环指令隐含 ( 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 nextnull*循环指令说明:
LOOP退出循环条件是 CX =0
LOOPZ和LOOPNZ提供了提前结束循环的可能,
不一定要等到 CX =0才退出循环。
例:查找字符:
▲ 在串中查找字符,查到了,就可退出,
可用LOOPNZ,不相等时继续查找。
▲比较两串时,当有字符不等,就可退出,说明两字符串不等。
可用LOOPZ,当相等时继续比较。
▲执行完 LOOPNZ或LOOPZ后,根据ZF标志的值判断结果
对查找字符,ZF=1,说明找到;否则没有找到。
对串比较,ZF=1, 说明两串相等;否则不等。例:检查当前数据段所在的64K字节内存是否能够正确地进行读写操作。可先向每个字节写入数据01010101B,然后读出来进行比较。如正确则转至目标标号OK的程序段,否则进入出错处理程序段ERROR。*例:检查当前数据段所在的64K字节内存是否能够正确地进行读写操作。可先向每个字节写入数据01010101B,然后读出来进行比较。如正确则转至目标标号OK的程序段,否则进入出错处理程序段ERROR。 MOV CX, 0000H
MOV BX, 0000H
MOV AL, 01010101H
AGAIN: MOV BYTE PTR[BX], AL
INC BX
CMP BYTE PTR[BX-1],AL
LOOPZ AGAIN
JCXZ OK
ERROR: …. ;出错处理
….
OK: …. ;读写正确null* 例: 在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: 找到处理
……
null*用条件转移: 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
未找到处理
JMP exit
find:找到处理
exit:结束出口 用循环指令:LOOP NZ next
MOV CX, N
MOV AX, SEG string
MOV DS, AX
LEA BX, string
MOV AL,20H
DEC BX
next: INC BX
CMP AL, [BX]
LOOPNZ next
JZ find
未找到处理
JMP exit
find: 找到处理
exit: 结束出口 null*思考:
① 去掉指令JMP exit ,程序执行结果会怎样?
② 执行完LOOPNZ后,可否根据CX=0来判断查找结果?
有人认为CX=0,即说明没找到,对吗?
null* MOV CX,28H
MOV SI,0FFH
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 ……
RET
DISPLAY2 ……
RETnull*4、中断指令
中断(Interrupt):
有时当系统运行或程序运行期间遇到某些特殊情况,
需要计算机自动执行一组专门的例行程序来进行处理。
中断例行程序(或中断子程序)(Interrupt routine): 所执行的这组程序就称为中断子程序。
种类:
中断分为内部(软)中断和外部(硬)中断两种。
内部中断—如除法运算中除数为0、中断指令引起的中断
外部中断—处理I/O设备与CPU之间的通信。null*CPU响应一次中断自动完成三件事情:
PSW 入栈 — 保护现场,
CS , IP 保存入栈 — 保留断点,
转中断例行程序去执行。
中断返回时:
恢复 IP 、 CS 及 PSW
中断向量:中断例行程序入口地址。
在微机中,存储器的最低地址00000H——003FFH为中断向量区,存放256种类型中断例行程序入口地址, 每个中断向量占4个单元。
中断指定类型号N 乘以 4——取得指定类型的中断向量地址。 null*例:中断类型9,9 × 4=36
00024H——00027H单元中放中断向量。
IBM-PC机中为每个类型规定了一种功能:*除非特别注明,类型号是以16进制形式表示的。null*内存0000H:0000H~0000H:03FFH区域中,构成中断向量表,存放中断处理程序入口地址。每4个单元对应1个中断源。关系如下表:null*(1). 介绍几条指令:INT n,IRET
格式:INT n ; n—常数或表达式,n=0—255
或INT
执行操作:
SP ← SP -2,( SP+1 ),(SP) ← PSW
SP ← SP -2,( SP+1 ),(SP) ← CS
SP ← SP -2,( SP+1 ),(SP) ← IP
IP ←(n×4)
CS ←(n×4+2)
清除IF、TF,避免进入中断以后不被外面其它中断所打断
及进入中断以后按单步执行。null* 类型0~3的中断称为内部中断。
类型0 :指令系统没有INT0这条指令
除数为0中断
除数为0 :它既不是外部中断 也不是软件中断, 是由 CPU自身产生的,所以无对应中断指令。
有符号数进行除法所得的商超出规定范围
有符号数进行除法运算,所得的商超出规定范围,
CPU自动产生类型为0的中断,转入响应的中断处理程序。null* 类型1——单步中断
TF=1进入单步中断。
单步中断不是由外部硬件或程序中的中断产生, 而是CPU测试TF=1时产生的。
单步中断——每执行一条指令,进行一次单步中断处理,
显示出一系列内 部寄存器的值,并告 示一些
附带的信息。
一般用于调试程序中逐条执行用户程序。
对于有重复前缀串操作指令——单步操作下,每重复一次将产生一个单步中断,而不是整个串操作结束后进入单步操作。null* 类型2——NMI中断,非屏蔽中断
NMI中断是由NMI引腿引入,不受IF屏蔽,
只要NMI腿出现中断请求
中断处理子程序入口地址在:
0000H:0008H——0000H000BH中。
CPU予以响应, 进入对应的中断处理。
一般用于处理系统的重大故障。null* 类型3——断点中断8088提供的一种调试手段。
设置断点过程(在DEBUG下):
用户程序指定断点:
用断点的中断指令INT3来代替原有指令,
把用户原有指令进栈保存,
这样运行到断点处执行INT3,转入中断处理程序 , 显示一系列寄存器值,并给出一些重要信息,用户可 判断正误。
断点中断还负责恢复进入中断前的被INT3替换掉的那条指令。null*(2) 类型4——溢出中断,INTO指令
格式: INTO ; 该指令检测OF标志,
OF=1执行 INTO,否则执行INTO下一条执行。
执行操作:
SP ← SP -2 , (SP+1 ),(SP) ← PSW
SP ← SP -2 , (SP+1 ),(SP) ← CS
SP ← SP -2 , (SP+1 ),(SP) ← IP
IP ←(10H)
CS ←(12H)
IF=TF=0null*执行: OF为1时,执行 INTO ;
OF为0时,执行INTO下一条执行。
例
INTO
… …
… …
… …
类型4中断子程 → … …
… …
… …null*(3) IRET——从中断返回指令(Interrupt return)
IRET退出中断过程,返回中断时断点。
不管是硬中断还是软中断,所有中断过程(服务程序)的最后一条指令一定是 IRET。
格式:IRET
执行操作:
IP ←( SP+1 ), (SP) , SP ← SP +2
CS ← ( SP+1 ), (SP) , SP ← SP +2
PSW ← ( SP+1 ), (SP) , SP ← SP +28086/8088的指令系统*8086/8088的指令系统六、处理器控制指令,包括两种
(一)标志处理指令
(二)其他处理机控制指令null*六、处理器控制指令
(一)标志处理指令
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 ) 总线锁定null*1. 标志处理指令
▲ 设置和清除标志的指令,只影响指令指定的标志。null*2.其他处理机控制指令
① 暂停指令HLT
格式 : HLT
执行 : 使CPU处于暂停状态
用于等待外部中断,中断处理结束后,
继续执行HLT后的下一条指令
例 ……
……
STI ;允许外部中断
HLT ;等待中断
MOV AX, 0
……null*只有以下几种情况才能脱离暂停状态:
● RESET线上有复位信号
● 在NMI线上有请求
● 在中断允许情形下(IF=1),在INTR线上有请求
② 空操作指令NOP
格式 : NOP
指令不执行任何操作,
但占有3个时钟周期,继续执行下条指令。
其机器码占一个字节单元, 在调试程序时,修改程序用。
做短暂延时null*③处理器脱离(processor Escape)
*ESC——交权指令(换码)
格式:ESC mem
mem——指出一个存储单元,
不能是寄存器和立即数寻找方式
执行: 8088从存储器中读出操作数并放到总线上,
协处理器由此知道要执行什么操作,得到操作数,从而 代替8088操作。
调动协处理器工作的联络手段,ESC二字节指令。
能区分要调用哪个协处理器进行什么操作;
能指出放在存储器中的操作数。 null*④ 处理器等待(Process OR wait)
格式: WAIT ;处理器等待
执行: 处理器等待,CPU处于空操作, 等待外中断发生, 中断结束后,可继续执行下面程序
⑤ LOCK总线锁定
LOCK实际上是一个指令前缀,可以放在任何一条指令前面。
用来维持总线的锁存信号直到与其联合的指令执行完;
CPU与其他协处理器协同工作时,可以避免破坏有用信息。