《X86的寻址方式和指令系统.ppt》由会员分享,可在线阅读,更多相关《X86的寻址方式和指令系统.ppt(47页珍藏版)》请在三一办公上搜索。
1、五控制转移指令(Control transfer instructions)(一)、控制转移指令概述 控制转移指令包括四种:转移指令,循环控制指令,过程调用指令,中断指令。1、转移指令 转移指令包括两种:(1)JMP(Jump)无条件转移指令(2)Jcc 条件转移指令,(1)JMP(Jump)无条件转移指令 转移分成两类:段内或段间转移。无条件转移指令有五种格式:段内直接短转移段内直接近转移段内间接转移段间直接远转移段间间接转移JMP指令的操作:无条件地将控制转移到指令中规定的目的地。目标地址可以是:直接方式/间接方式给出。JMP指令不影响标志位。,(2)、Jcc 条件转移指令汇编程序设计中常
2、利用条件转移指令来实现分支。“cc”表示条件。操作数必须是短标号。转移范围为:128127根据转移条件可分为四种情况讨论:根据单个条件标志的设置情况转移 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,段内直接短转移,(二)控制转移指令(Contro
3、l transfer instructions)1、转移指令转移指令将程序控制从一处转换到另一处的最直接方法。在CPU内部,转移是通过将目标地址传送给IP来实现的。注意:CS段地址 转移地址 IP偏移量调用地址寻址,控制和非控制转移指令 非控制转移指令:指令本身对CS和IP均无操作,形成顺序执行 结构。顺序执行结构:顺序存放,顺序执行 控制转移指令:以CS和IP为主要操作对象,改变CS和IP寄存 器的值,就改变了程序执行的流程。程序是指令的集合指令在内存中顺序存放,在8086/8088中,指令的地址固定由CS和IP两个寄存器决定。CS和IP两寄存器的内容决定了程序的流程,改变CS和IP寄存器的
4、值,就改变了程序执行的流程。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 gr
5、eat XCHG AX,BX great:MOV max,AX,AX、BX中是有符号/无符号数?,(1)JMP(Jump)无条件转移指令JMP(jmp)跳转指令。JMP指令必须指定转移的目标地址(或转向地址)。转移分成两类:段内或段间转移。段内转移:只要改变IP寄存器的内容 指在同一段的范围之内进行转移 即用新的转移目标地址代替原有的IP值。段间转移:要修改IP、CS寄存器的内容 转到另一段去执行程序。即转移目标地址=新的段地址和偏移地址两部分组成。,(2)Jcc 条件转移指令 根据单个条件标志的设置情况转移(10种)JZ(JE)/JNZ(JNE),JP(JPE)/JNP(JPO),JS/JN
6、S,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)测试CX的值为零转移 JCXZ,指令格式:J cc OPR操作:根据上一条指令所设置的条件码来判别测试条件转移。每一种条件转移指令都有它的测试条件。满足条件时:(IP)(IP)当前+符号扩展到16位后的位移量D8,使用相对寻址方式,范围-128+127个字节不满足条件时:(IP)不变,顺序执行下一
7、条指令,注意:所有条件转移指令都是相对转移形式,范围(-128+127)。当需往一个较远地方进行条件转移时,选用条件转移转到附近一个单元,然后,再用无条件转移转到较远的目的地。条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移 条件转移指令不影响标志位,按转移条件不同,条件转移指令可以分为四大类:以单个状态标志作为转移条件助记符转移条件,以CX的值为0作为转移条件,以两个无符号数比较的结果作为转移条件,以两个带符号数比较的结果作为转移条件,(1)根据Z标志,可判断两者是否相等例:CMP AX,BXZF=1,(AX)=(BX),两者相等ZF=0,(AX)=(BX),两者
8、不相等(2)根据CF标志,判断两个无符号数的大小例:比较AX,BX寄存器,将大数(AX)CMP AX,BX JNC NEXT;CF=0转NEXT XCHG AX,BX NEXT:结论:CF=0,(AX)(BX);CF=1,(AX)(BX),(3)用SF、OF标志,判断二个带符号数的大小 设:被比较二个带符号数分别为:A、B 分四种情况讨论:A0,B0 A0,B0,分析以上四种情况得出如下结论:(1)OF=0 时:SF=0,则:AB SF=1,则:AB SF=0,则:AB,用JG/JNLE转移指令;SO=1时,AB,用JL/JNGE转移指令。,条件转移指令应用 例:比较二个数是否相等 如相等做动
9、作1 否则做动作2CMP AX,BXJE action_1action_2:action_1:,或 CMP AX,BX JNZ action_2action_1:action_2:,2、过程(子程序)调用指令子程序程序中具有独立功能的部分编写成独立程序模块。子程序(过程)定义格式:过程名 PROC 类型 过程名 ENDP 过程有两种类型:按过程与调用语句间的位置,过程有两种类型。NEAR类型:调用指令与过程在同一个段中FAR类型:调用指令与过程不在同一个段中子程序调用和返回指令:CALL RET(RETURN)CALL指令和RET指令都不影响条件码。,(1)CALL(Call a proced
10、ure)调用 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,段内间接调用:格式
11、: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)(S
12、P)(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)+
13、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,修改堆栈 指针。,例如:RET EXP 堆栈使用情况:PUSH BX PUSH CX CALL DELCHARCS:XXXX DELCHAR PROC RET 4,段间带立即数返回:格式:RET EXP;执行操作:(IP)(SP)+1,(SP)(SP)(
14、SP)+2(CS)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+D16 CALL指令和RET指令都不影响条件码。,当前IP的值为控制转移指令下一条指令的偏移地址。位移量=符号地址的偏移量-当前IP的值。符号地址(目标地址)=当前IP的值+位移量,(3)、小结:指令格式:JMP 操作数,各控制转移指令允许使用的转移方式,3、循环控制指令格式:LOOPxx符号地址 执行 操作:(CX)(CX)-1 此操作不影响标志 检查转移条件xx,满足转向目标地址去执行;不满足执行LOOPxx后一条指令转移方式 只允许段内直接短方式,跳转范围-128127,与条件转移指令不同的是:循环指令隐含(C
15、X)减操作。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):有时当系统运行或程序运行期间遇到某
16、些特殊情况,需要计算机自动执行一组专门的例行程序来进行处理。中断例行程序(或中断子程序)(Interrupt routine):所执行的这组程序就称为中断子程序。种类:中断分为内部(软)中断和外部(硬)中断两种。内部中断如除法运算中除数为0、中断指令引起的中断。外部中断处理I/O设备与CPU之间的通信。,中断与过程调用:中断是随机事件或异常事件引起,调用则是事先已在程序中安排好;响应中断请求不仅要保护断点地址,还要保护FLAGS内容;调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中。,六、处理器控制指令(一)标志处理指令1、CLC(Clear
17、 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等待状
18、态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个时钟周期,继续执行下条指令。其机器码占一个字节单元,在调
19、试程序时,修改程序用。做短暂延时,处理器脱离(processor Escape)*ESC交权指令(换码)格式:ESC mem mem指出一个存储单元,不能是寄存器和立即数寻找方式执行:处理器从存储器中读出操作数并放到总线上,协处理器由此知道要执行什么操作,得到操作数,从而代替处理器操作。调动协处理器工作的联络手段,ESC二字节指令。能区分要调用哪个协处理器进行什么操作;能指出放在存储器中的操作数。,处理器等待(Process OR wait)格式:WAIT;处理器等待执行:处理器等待,CPU处于空操作,等待外中断发生,中断结束后,可继续执行下面程序 LOCK总线锁定 LOCK实际上是一个指令前缀,可以放在任何一条指令前面。用来维持总线的锁存信号直到与其联合的指令执行完;CPU与其他协处理器协同工作时,可以避免破坏有用信息。,3.5 80 x86的寻址方式及新增指令,一、虚地址方式下的寻址方式比例因子具有比例因子的变址寻址具有比例因子的基址加变址寻址具有比例因子的相对基址加变址寻址,二、80286增强与增加的指令1 增强的指令PUSHIMUL移位指令2 增加的指令PUSHA/POPAINS/OUTS高级语言类,三、80386/80486增强与增加的指令1 数据传送2 算术运算3 逻辑运算与移位4 位操作5 字节置16 Cache管理类,