430 likes | 503 Views
五.控制转移指令( Control transfer instructions ) (一)、控制转移指令概述 控制转移指令包括四种: 转移指令,循环控制指令,过程调用指令,中断指令。 1 、转移指令 转移指令包括两种: (1) 、 JMP(Jump) 无条件转移指令 (2) 、 Jcc 条件转移指令. (1) 、 JMP(Jump) 无条件转移指令 转移分成两类: 段内 或 段间 转移。 无条件转移指令有五种格式: 段内直接短转移 段内直接近转移 段内间接转移 段间直接远转移
E N D
五.控制转移指令(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
(二).控制转移指令(Control transfer instructions) 1、转移指令 转移指令将程序控制从一处转换到另一处的最直接方法。 在CPU内部,转移是通过将目标地址传送给IP来实现的。 注意:CS—段地址 转移地址 IP—偏移量 调用地址寻址
控制和非控制转移指令 • 非控制转移指令:指令本身对CS和IP均无操作,形成顺序执行 • 结构。 • 顺序执行结构: 顺序存放,顺序执行 • 控制转移指令: 以CS和IP为主要操作对象,改变CS和IP寄存 • 器的值, 就改变了程序执行的流程。 • 程序是指令的集合 • 指令在内存中顺序存放
在8086/8088中,指令的地址固定由CS和IP两个寄存器决定。在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内部的硬件自动完成)
控制转移指令以CS和IP为主要操作对象 • 控制转移指令改变CS和IP的值, • 使程序产生分支、调用结构。 • 顺序存放,非顺序执行 • 例:比较(AX)、(BX)的大小,将大数存于( max )单元。 • CMP AX, BX • JGE great • XCHG AX, BX • great: MOV [max], AX
(1)、JMP(Jump)无条件转移指令 JMP(jmp)跳转指令。 JMP指令必须指定转移的目标地址(或转向地址)。 转移分成两类:段内或段间转移。 段内转移:只要改变IP寄存器的内容 指在同一段的范围之内进行转移 即用新的转移目标地址代替原有的IP值。 段间转移:要修改IP、 CS寄存器的内容 转到另一段去执行程序。 即转移目标地址= 新的段地址和偏移地址两部分组成。
( 2)、Jcc 条件转移指令 根据单个条件标志的设置情况转移(10种) 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)。 • 当需往一个较远地方进行条件转移时, • 选用条件转移转到附近一个单元, • 然后,再用无条件转移转到较远的目的地。 • ② 条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移, • ③ 条件转移指令不影响标志位
按转移条件不同,条件转移指令可以分为四大类:按转移条件不同,条件转移指令可以分为四大类: ① 以单个状态标志作为转移条件助记符 转移条件 ② 以CX的值为0作为转移条件
③以两个无符号数比较的结果作为转移条件 ④以两个带符号数比较的结果作为转移条件
条件转移指令应用 例:比较二个数是否相等 如相等做动作1 否则做动作2 …… CMP AX,BX JE action_1 action_2: …… …… action_1 :…… 或 …… CMP AX,BX JNZ action_2 action_1: …… action_2: ……
2、 过程( 子程序 )调用指令 子程序—程序中具有独立功能的部分编写成独立程序模块。 子程序(过程)定义格式: 过程名 PROC 类型 …… 过程名 ENDP 子程序调用和返回指令: CALL RET(RETURN) 过程有两种类型: 按过程与调用语句间的位置,过程有两种类型。 NEAR类型:调用指令与过程在同一个段中 FAR类型:调用指令与过程不在同一个段中 CALL指令和RET指令都不影响条件码。
(1)、 CALL( Call a procedure)调用 • CALL调用指令 调用地址由指令给出 CALL调用指令有4种: • 段内直接调用 段间直接调用 • 段内间接调用 段间间接调用
段内直接调用 格式:CALL DST ;(SP)←(SP)-2, ((SP)+1,(SP))←(IP) ; (IP) ← (IP)+D16 DST—给出转向地址(子程序的入口地址)。 D16—机器指令中的位移量(转向地址和返回地址之差)。 位移量为D16范围-32768~+32767H,占有两个字节。
工作过程: NEAR 类型过程 … CALL subp ;调用 指令 YYY入栈 ,D16 =subp-yyy XXX:YYY … … subp PROC NEAR ;过程定义 … RET ;返回 subp ENDP
段内间接调用: 格式: CALL DST; ↑ WORD PTR OPR OPR —为16位寄存器, 或存储器(除立即数以外的任何一种寻址方式) 执行操作: (SP)←(SP)-2 ((SP)+1,(SP))←(IP) (IP)←(EA) EA—由DST寻址方式所确定的有效地址。
段间直接调用: 格式: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字节 )
段间间接调用: 格式: 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的寻址方式确定的有效地址。
(2)、 RET( Reture from procedure)返回 • RET返回指令 放在子程序的末尾 使子程序在功能完成后返回调用程序继续执行。 *为能准确返回 ,返回指令类型与调用指令类型相对应。 RET返回指令有4种: • 段内返回 段间返回 • 段内带立即数返回 段间带立即数返回 • 在子程序调用时,返回地址入栈 • 返回时:将返回地址出栈 (IP)(段内或段间)。 • (CS)(段间)。
段内返回: 格式: 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)+2
段内带立即数返回 格式: RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 (SP)←(SP)+D16 EXP—是一个表达式 计算出来的常数成为机器指令中位移量D16,修改堆栈 指针。
XXXXH CALL DELCHAR RET (CX) PUSH CX PUSH BX (BX) (SP) RET 4 例如:RET EXP 堆栈使用情况: …… PUSH BX PUSH CX CALL DELCHAR CS:XXXX …… DELCHAR PROC …… RET 4
段间带立即数返回: 格式:RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 (CS)←((SP)+1,(SP)) (SP)←(SP)+2 (SP)←(SP)+D16 CALL指令和RET指令都不影响条件码。
(3) 、小结 : • 指令格式: JMP 操作数 • 当前IP的值为控制转移指令下一条指令的偏移地址。 • 位移量 = 符号地址的偏移量 - 当前IP的值。 • 符号地址(目标地址)= 当前IP的值 + 位移量
3、循环控制指令 格式 : LOOPxx 符号地址 执行 操作 : ①(CX) ← (CX)- 1 此操作不影响标志 ② 检查转移条件xx,满足转向目标地址去执行; 不满足执行LOOPxx后一条指令 转移方式 只允许段内直接短方式,跳转范围-128~127
与条件转移指令不同的是:循环指令隐含 ( CX ) 减1操作。 LOOP指令 …… DEC CX JNZ next …… LOOP next
循环指令说明: • LOOP退出循环条件是(CX)=0 • LOOPZ和LOOPNZ提供了提前结束循环的可能, • 不一定要等到(CX)=0才退出循环。 • ▲ 在串中查找字符,查到了,就可退出, • 可用LOOPNZ,不相等时继续查找。 • ▲比较两串时,当有字符不等,就可退出,说明两字符串不等。 • 可用LOOPZ,当相等时继续比较。 • ▲执行完 LOOPNZ或LOOPZ后,根据ZF标志的值判断结果 • 对查找字符,ZF=1,说明找到;否则没有找到。 • 对串比较,ZF=1, 说明两串相等;否则不等。
4、中断指令 • 中断(Interrupt): • 有时当系统运行或程序运行期间遇到某些特殊情况, • 需要计算机自动执行一组专门的例行程序来进行处理。 • 中断例行程序(或中断子程序)(Interrupt routine): 所执行的这组程序就称为中断子程序。 • 种类: • 中断分为内部(软)中断和外部(硬)中断两种。 • 内部中断—如除法运算中除数为0、中断指令引起的中断。 • 外部中断—处理I/O设备与CPU之间的通信。
中断与过程调用: • 中断是随机事件或异常事件引起,调用则是事先已在程序中安排好 ; • 响应中断请求不仅要保护断点地址,还要保护FLAGS内容; • 调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中。
六、处理器控制指令 (一)标志处理指令 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. 标志处理指令 • 设置和清除标志的指令,只影响指令指定的标志。 CF
2.其他处理机控制指令 ① 暂停指令HLT 格式 : HLT 执行 : 使CPU处于暂停状态 用于等待外部中断,中断处理结束后, 继续执行HLT后的下一条指令 例 …….. …….. STI ;允许外部中断 HLT ;等待中断 MOV AX, 0 ……..
只有以下几种情况才能脱离暂停状态: • RESET线上有复位信号 • 在NMI线上有请求 • 在中断允许情形下(IF=1),在INTR线上有请求
② 空操作指令NOP • 格式 : NOP • 指令不执行任何操作, • 但占有3个时钟周期,继续执行下条指令。 • 其机器码占一个字节单元, 在调试程序时,修改程序用。 • 做短暂延时
③处理器脱离(processor Escape) *ESC——交权指令(换码) 格式:ESC mem mem——指出一个存储单元, 不能是寄存器和立即数寻找方式 执行:处理器从存储器中读出操作数并放到总线上, 协处理器由此知道要执行什么操作,得到操作数,从而 代替处理器操作。 调动协处理器工作的联络手段,ESC二字节指令。 能区分要调用哪个协处理器进行什么操作; 能指出放在存储器中的操作数。
④ 处理器等待(Process OR wait) 格式: WAIT ;处理器等待 执行: 处理器等待,CPU处于空操作, 等待外中断发生, 中断结束后,可继续执行下面程序 ⑤ LOCK总线锁定 LOCK实际上是一个指令前缀,可以放在任何一条指令前面。 用来维持总线的锁存信号直到与其联合的指令执行完; CPU与其他协处理器协同工作时,可以避免破坏有用信息。
4.5 80x86的寻址方式及新增指令 一、虚地址方式下的寻址方式 比例因子 具有比例因子的变址寻址 具有比例因子的基址加变址寻址 具有比例因子的相对基址加变址寻址
二、80286增强与增加的指令 1 增强的指令 PUSH IMUL 移位指令 2 增加的指令 PUSHA/POPA INS/OUTS 高级语言类
三、80386/80486增强与增加的指令 1 数据传送 2 算术运算 3 逻辑运算与移位 4 位操作 5 字节置‘1’ 6 Cache管理类