3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述 控制传送指令包括四种: 转移指令,循环控制指令,过程调用指令,中断指令。 1、转移指令 转移指令包括两种: (1)、JMP(Jump) 无条件转移指令 (2)、Jcc 条件转移指令
(1)、JMP(Jump)无条件转移指令 转移分成两类:段内或段间转移。 无条件转移指令有五种格式: 段内直接短转移 段内直接近转移 段内间接转移 段间直接远转移 段间间接转移 JMP指令的操作:无条件地转移到指令中规定的目的地开始往 下执行指令。 目标地址可以是:直接方式/间接方式给出。 JMP指令不影响标志位。
(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的值为零转移 JCXZ
2、 过程(子程序)调用指令 如果有一些程序段在不同地方反复出现,可以将这些程序段设计成为过程(子程序)供调用。过程结束,返回调用处。 子程序:在一个实际程序中,有些操作要执行多次,把要 重复执行(subroutine)操作编为子程序。 常把一些常用的操作编为标准化、通用化的子程序。 主程序(Main program):往往要调用子程序 或处理 中断, 即执行子程序或中断服务程序。
过程调用指令包括:过程调用指令和返回指令 (1)、 CALL( Call a procedure)调用 CALL调用指令 段内直接调用 段间直接调用 段内间接调用 段间间接调用 (2)、 RET( Return from procedure)返回 RET返回指令 段内返回 段间返回 段内带立即数返回 段间带立即数返回
循环控制指令用于使一些程序段反复执行形成循环程序。 循环控制指令有三种: 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”循环
4、中断指令 8086/8088CPU 可以在程序中安排一条中断指令引起中断过程,这种中断称为软中断。 8086/8088CPU共有三条中断指令: (1)、INT (Interrupt) (2)、INTO(Interrupt if overflow) (3)、IRET(Interrupt Return)
归纳控制转移指令分类 指令类型 助记符 无条件转移 JMP 条件转移 JE/JZ, JNE/JNZ, JS, JNS, JP/JPE, JNP /JPO,JO, JNO, JC, JNC, JB/JNAE, JAE/JNB, JA/JNBE, JBE/JNA,JG/JNLE, JGE/JNL, JL/JNGE, JLE/JNG ,JCXZ 循环控制 LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ 过程调用 CALL, RET 中断指令 INT, INTO, IRET
(二)、控制转移指令(Control transfer instructions) 1、转移指令 转移指令是将程序控制从一处转换到另一处的最直接方法。 在CPU内部,转移是通过将目标地址传送给CS(段地址 )、IP(偏移量)来实现的。 注意: 转移、调用地址寻址方式
指令在内存中是顺序存放的,分控制和非控制转移指令。 8086/8088 中CS和IP的变化规则: reset复位后,( CS ) = FFFFH,( IP ) = 0 故8088从内存FFFF:0000H处取第一条指令执行, 第一条指令在内存的ROM区。 非控制转移指令 CPU取指后,自动增加IP的值,使IP顺序指向下一条指令, 取紧接着的指令执行。 (此时IP的变化由CPU内部的硬件自动完成) 控制转移指令 以CS和IP为主要操作对象控制转移指令改变CS和IP的值,使程序产生分支、调用结构。 *分支、调用结构: 顺序存放,非顺序执行,特别是条件转移指令体现计算机的智能作用。
例:比较(AX)、(BX)的大小,将大数存于( max )单元。 CMP AX, BX JGE great ;有符号数比较, (AX)大于或等于转 XCHG AX, BX great: MOV [max], AX
(1)、JMP(Jump)无条件转移指令 JMP指令必须指定转移的目标地址(或转向地址)。 转移分成两类:段内或段间转移。 段内转移:只要改变IP寄存器的内容,指在同一段的范围之内进行转移。即(CS)不变,只改变(IP) 段间转移:要修改IP、 CS寄存器的内容 转到另一段去执行程序。
段内直接短转移: EB(操作码) 8位位移量D8 格式:JMP SHORT OPR OPR—在汇编语言中使用符号地址 段内直接短转移: 格式:JMP SHORT OPR OPR—在汇编语言中使用符号地址 在机器语言中存放8位位移量D8 位移量D8 = 符号地址的偏移地址 – 当前IP的值 执行操作:(IP)←(IP)当前+D8 SHORT 短属性标号 8位位移量D8的范围在(-128 ~ 127)之间,占有一个字节。 该指令共占有两个字节。 EB(操作码) 8位位移量D8
例:代码段内有一条无条件转移指令(在汇编语言中使用符号地址。)JMP SHORT NEXT指令执行过程: (IP)←(IP)当前+D8
8位位移量D8的范围在(-128 ~ 127)之间,否则出错。 如:TAGER: …… JMP TAGER JMP SHORT TAGER …… TAGER: 标号与控制转移指令在同一段中,后引用的标号可以不用SHORT,前引用的标号必须使用SHORT。
段内直接近转移: E9(操作码) 低8位位移量 高8位位移量 格式:JMP NEAR PTR OPR OPR—在汇编语言中使用符号地址 段内直接近转移: 格式:JMP NEAR PTR OPR OPR—在汇编语言中使用符号地址 在机器语言中存放16位位移量D16 位移量D16 = 符号地址的偏移地址 - 当前IP的值 执行操作: (IP)←(IP)当前+D16 NEAR:近属性标号 位移量D16范围:-32768~+32767H,占有两个字节。 该指令为三字节指令。可以转移到段内的任一位置,转移过程如同SHORT转移。 E9(操作码) 低8位位移量 高8位位移量
设有一段程序如下表所示,(CS)=1005H 程序转移地址? 汇编语句 机器指令 偏移地址 NEXT: MOV BX,AX JMP NEAR PTR NEXT XOR BX,BX 8B D8 E9 FB FF 33 DB 0000 0002 0005 转移地址偏移地址=当前(IP)+位移量 =0005H+FFFBH =0000H 转移地址段地址=当前(CS)=1005H 所以转移目的地址=1005:0000H即10050H(NEXT)处
段内间接转移: 格式:JMP WORD PTR OPR OPR —为16位寄存器、 或存储器(除立即数以外的任何一种寻址方式) 段内间接转移: 格式: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]
例: (DS)=1000H, (BX)=1000H, (CX)=5000H, (CS)=3000H (11000H)=1234H, ( 11002H)=5678H JMP CX ;(CS)=3000H ,(IP)=5000H JMP WORD PTR [BX] ;(CS)=3000H , (IP)=1234H (IP)的获得: (PA)=(16d(DS)+(BX))=(11000H)=1234H 例: (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
段间直接(远)转移: (CS) 、 (IP)都改变 格式:JMP FAR PTR OPR; OPR—在汇编语言中使用符号地址。 符号地址与指令不在同一个段里。 在机器语言中则要指定转向地址的偏移地址和段地址 FAR:远属性标号 执行操作: (IP)←OPR所在的段内偏移地址。 (CS)←OPR所在的段的段址。 指令占有5个字节: 用1个字节存放操作码; 用2个字分别存放符号地址的偏移地址、段地址。
FAR 远属性标号, 标号与控制转移指令不在同一段中。 在汇编语言中,在机器语言中存放如下: 例: C1 SEGMENT … JMP FAR PTR next_prog C1 ENDS C2 SEGMINT next_prog: … C2 ENDS C1段 … … E A OP码 5 0 新(IP)=0250H JMP指令 0 2 0 0 新(CS)=2000H 2 0 … … C2段 20000H … … next_prog: 20250H 2000:0250H … …
段间间接转移:(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)=4433H
根据单个条件标志的设置情况转移(10种) ( 2)、Jcc 条件转移指令 JZ(JE)/JNZ(JNE),JP(JPE)/JNP(JPO), JS/JNS, JO/JNO, JB(JNAE、JC)/JNB(JAE、JNC), 根据两个无符号数比较结果转移(4种) JB(JNAE、JC)/JNB(JAE、JNC),JBE(JNA)/JNBE(JA) 比较两个带符号数,并根据比较结果转移(4种) JL(JNGE)/JNL(JGE),JLE(JNG)/JNLE(JG)
指令格式:J cc OPR 操作:根据上一条指令所设置的标志位来判别测试条件转移。 每一种条件转移指令都有它的测试条件。 满足条件时 : (IP)←(IP)当前+ 符号扩展到16位后的位移量D8, 所有条件转移指令使用段内直接短转移——相对寻址方式 范围: -128~+127个字节 不满足条件时: (IP)不变,顺序执行下一条指令。
注意几点: 所有条件转移指令都是相对转移形式, 范围(-128~+127)。超过转移范围怎么办? ② 条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移, ③ 条件转移指令不影响标志位 * 当条件转移超过转移范围时, 先选用条件转移转到附近一个单元, 然后,再用无条件转移转到较远的目的地。
按转移条件不同,条件转移指令可以分为四大类: ① 以单个状态标志作为转移条件助记符 转移条件 ① 以单个状态标志作为转移条件助记符 转移条件 助记符 转移条件 JZ/JE ZF=1 JNZ/JNE ZF=0 JS SF=1 JNS SF=0 JO OF=1 JNO OF=0 JP/JPE PF=1 JNP/JPO PF=0 JC CF=1 JNC CF=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 小于或等于/不大于
例:比较二个数是否相等 如相等做动作1 否则做动作2 …… 条件转移指令应用 例:比较二个数是否相等 如相等做动作1 否则做动作2 …… CMP AX,BX JE action_1;或JZ Action_2: …… action_1 : …… 或 …… CMP AX,BX JNZ action_2 action_1: …… action_2: ……
例: X,Y放在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: ……
2、 过程( 子程序 )调用指令 子程序—程序中具有独立功能的部分,编写成独立程序模块。 子程序(过程)定义格式: 符号名 PROC 类型 …… 符号名 ENDP ;符号名即过程名 子程序调用和返回指令: CALL / RET(return) 过程有两种类型: 按过程与调用语句间的位置,过程有两种类型。 NEAR类型:调用指令与过程在同一个段中 FAR类型:调用指令与过程不在同一个段中 CALL指令和RET指令都不影响标志位。
(1)、CALL( Call a procedure)调用 段内直接调用 段间直接调用 段内间接调用 段间间接调用
段内直接调用 入栈 格式:CALL DST ;(SP)←(SP)-2, ((SP)+1,(SP))←(IP) 段内直接调用 入栈 格式:CALL DST ;(SP)←(SP)-2, ((SP)+1,(SP))←(IP) ; (IP) ← (IP)+D16 DST—通常是过程名,给出转向地址(子程序的入口地址 )。 D16—机器指令中的位移量(转向地址和返回地址之差)。 位移量为D16范围-32768~+32767H,占有两个字节。
NEAR 类型工作过程如下: code SEGMENT ;code段 … CALL subp ;调用指令, XXX入栈, D16 =subp-XXX XXX: … subp PROC NEAR ;过程定义 RET ;返回 subp ENDP code ENDS
段内间接调用 格式: CALL DST; ↑ WORD PTR OPR OPR —为16位寄存器, 段内间接调用 格式: CALL DST; ↑ WORD PTR OPR OPR —为16位寄存器, 或存储器(除立即数以外的任何一种寻址方式) 执行操作: (SP)←(SP)-2 ((SP)+1,(SP))←(IP) (IP)← 16位寄存器内容 或(EA) EA—由DST寻址方式所确定的有效地址。
段间直接调用: 格式:CALL FAR PTR DST; 执行操作 : (SP)←(SP)-2 ((SP)+1,(SP))←(CS) 段间直接调用: 格式:CALL FAR PTR DST; 执行操作 : (SP)←(SP)-2 ((SP)+1,(SP))←(CS) ((SP)+1,(SP))←(IP) (IP)←DST偏移地址(指令中第2,3字节 ) (CS)←DST段地址(指令中第4,5字节 )
例 : … CSEG1 SEGMENT CALL FAR PTR subp;AA处的CS:IP入栈,转subp AA: … … 例 : … CSEG1 SEGMENT CALL FAR PTR subp;AA处的CS:IP入栈,转subp AA: … … CSEG1 ENDS CSEG2 SEGMENT subp PROC RET subp ENDP CSEG2 ENDS
段间间接调用: 格式: CALL DWORD PTR DST 执行操作: (SP)←(SP)-2 ((SP)+1,(SP))←(CS) 段间间接调用: 格式: CALL DWORD PTR DST 执行操作: (SP)←(SP)-2 ((SP)+1,(SP))←(CS) ((SP)+1,(SP))←(IP) (IP)←(EA) (CS)←(EA)+2 转子程序入口 EA—由DST的寻址方式确定的有效地址。
(2)、RET( Return from procedure)返回 放在子程序的末尾 使子程序在功能完成后返回调用程序继续执行。 *为能准确返回 ,返回指令类型与调用指令类型相对应。 RET返回指令有4种: 段内返回 段间返回 段内带立即数返回 段间带立即数返回 在子程序调用时,返回地址入栈 返回时:将返回地址出栈 (IP)(段内或段间) (CS)(段间)
段内返回: 段间返回: 格式: RET; 执行操作:(IP)←((SP)+1,(SP)) (SP)←(SP)+2 段内返回: 格式: RET; 执行操作:(IP)←((SP)+1,(SP)) (SP)←(SP)+2 段间返回: 执行操作: (IP)←((SP)+1,(SP)) (CS)←((SP)+1,(SP))
段内带立即数返回 格式: RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 段内带立即数返回 格式: RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 (SP)←(SP)+D16 EXP—是一个表达式 计算出来的常数成为机器指令中位移量D16,修改堆栈 指针。
例:RET EXP 堆栈使用情况
段间带立即数返回: 格式:RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 段间带立即数返回: 格式:RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 (CS)←((SP)+1,(SP)) (SP)←(SP)+D16 CALL指令和RET指令都不影响标志位。
例:段内、段间直接调用指令的使用及堆栈情况 主程序 MAIN在一个代码段中 子程序 PRO-A PRO-B PRO-C 在另一个代码段 程序调用关系: 另一个代码段 PRO-A PRO-B …… …… CALL near ptr PRO-B CALL near ptr PRO-C (IP)=2500H (IP)=4000H …… …… CALL near ptr PRO-C RET (IP)=3700H …… PRO-C …… RET RET (SP)=0100H MAIN …… CALL far ptr PRO-A (CS)=0500H (IP)=1000H
堆栈情况:
(3) 、小结 : 指令格式: JMP 操作数 操作数 执行操作 ◢ 位移量 = 符号地址的偏移量 - 当前IP的值。 符号地址 (SHORT) (IP) ← (IP)当前+ 8位位移量 符号地址 ( NEAR属性) (IP) ← (IP)当前+ 16位位移量 reg (16位)或 mem ( DW类型 ) (IP) ← ( reg ) 或(IP) ← (mem) 符号地址 ( FAR属性) (IP) ← 符号地址的偏值 (CS) ← 符号地址的段值 mem ( DD类型 ) (IP) ← ( mem ), (CS) ← (mem+2 ) ◢ 当前IP的值为控制转移指令下一条指令的偏移地址。 ◢ 位移量 = 符号地址的偏移量 - 当前IP的值。 ◢ 符号地址(目标地址)= 当前IP的值 + 位移量
转移方式:由CS是否变化、以及操作数类型决定情况如下表 跳转范围 段内直接短 方 式 不变 符号地址(SHORT) -128 ~ 127即0~FFH 段内直接近 方 式 符号地址(NEAR属性) 一个段内0~FFFFH 段 内间接方式 Reg mem (DW类型) 段 间直接方式 变 符号地址(FAR属性) 整个内存0~FFFFFH 段 间间接方式 mem(DD类型)
各控制转移指令允许使用的转移方式 转移方式 无条件转移JMP 条件转移 Jcc 循环转移 LOOPxx 子程调用CALL 段内直接短 方 式 √ × 段内直接近 方 式 段 内间接方式 段 间 直接方式 段 间间接
例 : 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本身对标志无影响。
3、循环控制指令(Iteration control) 格式 : 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操作。 例 用循环指令设计软件延时程序 DS5MS PROC PUSH CX MOV CX, 500 NEXT:NOP NOP LOOP NEXT; DEC CX JNZ NEXT POP CX RET DS5MS ENDP
循环指令说明: LOOP退出循环条件是(CX)=0 LOOPZ和LOOPNZ提供了提前结束循环的可能, 不一定要等到(CX)=0才退出循环。 ▲ 在串中查找字符,查到了,就可退出, 可用LOOPNZ,不相等时继续查找。 ▲ 比较两串时,当有字符不等,就可退出,说明两字符串不等。 可用LOOPZ,当相等时继续比较。 ▲ 执行完 LOOPNZ或LOOPZ后,根据ZF标志的值判断结果 对查找字符,ZF=1,说明找到;否则没有找到。 对串比较,ZF=1, 说明两串相等;否则不等。
4、中断(Interrupt)和中断返回(Interrupt return)指令 有时当系统运行或程序运行期间遇到某些特殊情况,需要计算机自动执行一组专门的例行程序称中断服务子程序来进行处理。 种类: 中断分为内部(软)中断和外部(硬)中断两种。 内部中断—如除法运算中除数为0、中断指令引起的中断。 外部中断—处理I/O设备与CPU之间的通信。
IBM-PC中,存储器的最底地址00000H——003FFH为中断向量区,存放256种类型中断服务程序入口地址, 每个中断向量占4个单元。 CPU响应一次中断自动完成三件事情: (PSW)入栈 — 保护现场, (CS),(IP)保存入栈 — 保留断点, 转中断例行程序去执行。 中断返回时: 恢复(IP)、(CS)及(PSW) 中断向量:中断服务程序入口地址。 IBM-PC中,存储器的最底地址00000H——003FFH为中断向量区,存放256种类型中断服务程序入口地址, 每个中断向量占4个单元。 中断指定类型号N × 4——取得指定类型的中断向量地址。
(1)、 中断指令:INT n 格式:INT n ; n—常数或表达式,n=0—255 执行操作: (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,避免进入中断后被外面其它中断所打断 及进入中断以后按单步执行。
(2)、溢出中断 INTO 指令 格式: INT O ; 该指令检测OF标志, OF=1执行 INT O,否则执行INTO下一条指令。 执行操作: (SP)←(SP)-2 , ((SP)+1,(SP)) ←(PSW) (SP)←(SP)-2 ,((SP)+1,(SP)) ←(CS) (SP)←(SP)-2 ,((SP)+1,(SP)) ←(IP) (IP) ←(0010H) (CS) ←(0012H) IF=TF=0
执行: OF为1时,执行 INT O ; OF为0时,执行INTO下一条执行。 例 : 、、、 INTO 、、、 类型4中断子程 → 、、、
(3) 、 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
3.4.6 处理器控制指令(自学) (一)标志设置指令 (二)其他处理机控制指令 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 ) 总线锁定
1. 标志处理指令 ▲ 设置和清除标志的指令,只影响指令指定的标志。 指令格式 执行操作 CLC CF=0 STC CF=1 CLM CF ← CLD DF=0 STD DF=1 CLI IF=0 STI IF=1
2.其他处理机控制指令 ① 暂停指令HLT 格式 : HLT 执行 : 使CPU处于暂停状态 用于等待外部中断,中断处理结束后, 例 、、、 、、、 STI ;允许外部中断 HLT ;等待中断 MOV AX, 0
● 在中断允许情形下(IF=1),在INTR线上有请求 只有以下几种情况才能脱离暂停状态: ● RESET线上有复位信号 ● 在NMI线上有请求 ● 在中断允许情形下(IF=1),在INTR线上有请求 ② 空操作指令NOP 格式 : NOP 指令不执行任何操作, 但占有3个时钟周期,继续执行下条指令。 其机器码占一个字节单元, 在调试程序时,修改程序用。 做短暂延时 只有以下几种情况才能脱离暂停状态: ●RESET线上有复位信号 ●在NMI线上有请求 ●在中断允许情形下(IF=1),在INTR线上有请求 ② 空操作指令NOP 格式 NOP 指令不执行任何操作,但占有3个时钟周期,继续执行下条指令。 ①其机器码占一个字节单元, 在调试程序时,修改程序用。 ②做短暂延时
③处理器脱离(processor Escape) 格式:ESC mem mem——指出一个存储单元, 不能是寄存器和立即数寻找方式 执行: 8088从存储器中读出操作数并放到总线上, 协处理器由此知道要执行什么操作,得到操作数,从而 代替8088操作。 调动协处理器工作的联络手段,ESC二字节指令。 能区分要调用哪个协处理器进行什么操作; 能指出放在存储器中的操作数。
④ 处理器等待(Process OR wait) 执行: 处理器等待,CPU处于空操作, 等待外中断发生, 中断结束后,可继续执行下面程序 ⑤ LOCK总线锁定 LOCK实际上是一个指令前缀,可以放在任何一条指令前面。 用来维持总线的锁存信号直到与其联合的指令执行完; CPU与其他协处理器协同工作时,可以避免破坏有用信息。
8086/8088指令助记符表
8086/8088指令助记符表(续)
作业三(续2): 教材:P123 习题 16 , 17
判断下列指令是否正确 3 .MOV DX, [SP] ;错 无[SP]寻址方式,存储器地址只能 通过BX,BP,SI,DI寻址 1 .MOV DS,2010H ;错 不能将立即直接给段寄存器 2 .PUSH AL ;错 不能对字节进行堆栈操作 3 .MOV DX, [SP] ;错 无[SP]寻址方式,存储器地址只能 通过BX,BP,SI,DI寻址 4 .IN AL,0A00H ;错 端口地址大于FFH应用DX寻址端口 5 .XCHG CL,CH ;对 6 .SHR AX,3 ;错 移位次数大于1时,应将其放于CL中
7.MOV AX,ES:[BX];对 8.ADD [BP+DI],[1000H] ;错 两个操作数不能均为存储器 9.OUT DX,CL ;错 端口只能通过AL或AX传送数据 10.CBW BH ;错 CBW为无操作数指令,默认操作数AL 11.ADD 03ECH,AX ;错 目的操作数不能为立即数 12.MOV BX,[SI+DI];错 无[SP+DI]寻址,必须是基址 (BX或BP)+变址(SI或DI) 13.MOV DI,[AX] ;错 无[AX]寻址,存储器地址只能 通过BX,BP,SI,DI寻址
14.LEA BX,1000H ;错 LEA源操作数应为一个存储器操作数, 不能是立即数 15.LEA DX,DI ;错 LEA源操作数应为一个存储器操作数, 不能是寄存器 16.MOV AX,[BX+BP];错 无[BP+BX]寻址, 必须是基址(BX或BP)+变址(SI或DI) 17.CMP [BX],[SI] ;错 双操作数不能均为存储器 18.MUL 24H ;错 MUL为单操作数指令, 且源操作数不能为立即数 19.OUT DX,BX ;错 端口只能通过AL或AX传送数据
20.AND 0FH,AL ;错 目的操作数不能为立即数 21.SAL [BX],CX ;错 移位次数大于1时, 应将其放于CL中 22.MOVS ;错 应该给出属性,是B还是W 23.JMP DWORD PTR[BX+SI];对 24.JNZ AAA ;错 AAA是一条指令.不能作为符号地址 25.JMP NEXT ;对 26.SBB AX,[DX] ;错 DX不能间接寻址