您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第3章_5 控制转移
第三章指令系统三峡大学陈慈发0717-6394358,13972597617chcf0415@126.com128086CPU的指令格式8086CPU的指令系统38086CPU的寻址方式指令系统指令分类数据传送指令算术运算指令逻辑运算与移位指令串操作指令控制转移指令处理机控制指令程序控制指令用来控制程序的执行顺序,用于实现分支、循环、过程调用/返回、中断调用/返回等程序结构CS:IP总是指向下一条即将执行的指令的地址,通过改变IP和CS的值,可以改变程序的执行顺序,但程序中不能使用MOV指令直接改变CS和IP的值,只能通过程序控制指令实现段间转移段内转移同时改变CS和IP的值,又称远转移,目标属性为FAR。可转移到1MB地址空间的任一位置只改变IP的值,不改变CS的值,又称近转移/短转移,目标属性为NEAR/SHORT,只能在代码段内转移近转移短转移转移距离用1个字表达,转移范围为代码段内相对当前指令地址-32768~+32767,转移类型为NEARPTR转移距离用1个字节表达,转移范围为代码段内相对当前指令地址-128~+127,转移类型为SHORT转移类型实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移。程序员可用操作符short、nearptr或farptr强制成为需要的转移类型。直接转移:在转移指令中直接指明目标地址间接转移:转移的目标地址间接存储于某寄存器或存储器单元中相对转移:把当前的IP值增加或减少某一个值,也就是以当前指令为中心往前或往后转移一个距离(位移量)绝对转移:以新的值完全代替当前的IP值或CS:IP值所有段内直接转移都是相对转移所有段内间接转移都是绝对转移所有段间转移都是绝对转移转移类指令的目标地址通常采用标号,由汇编程序自动计算目标地址无条件转移指令(3条)1、无条件转移指令JMP(JuMP)格式:JMPd功能:程序无条件转移到目标地址d去执行说明:目标地址d常常用标号表示,标号是目标地址的符号表示。有6种目标地址寻址方式。①段内直接转移(短转移):是相对转移,位移量在指令中占1个字节,转移范围不超过-128~+127字节。格式:JMPSHORT标号JMP标号(汇编程序自动计算转移距离生成短转移指令)操作:IP←IP+2±位移量(8位)【例】JMPSTART或JMPSHORTSTART;IP←IP+2+START②段内直接转移(近转移):是相对转移,位移量在指令中占2个字节,转移范围是段内任何地方(-32768~+32767)。格式:JMP有效地址EAJMPNEARPTR标号JMP标号(汇编程序自动计算转移距离生成近转移指令)操作:IP←有效地址EAIP←IP±位移量(16位)【例】JMPSTART或JMPNEARPTRSTART;IP←IP±STARTJMP2000H;IP←2000H③段内间接转移(寄存器间接):是绝对转移,目标地址在16位的通用寄存器中,转移范围是段内任何地方(0~65535)。格式:JMPr16操作:IP←r16【例】JMPSI;IP←SI④段内间接转移(存储器间接):是绝对转移,目标地址在存储器中占2个字节,转移范围是段内任何地方(0~65535)。格式:JMPWORDPTR[mem]操作:IP←[mem]16说明:段寄存器搭配关系同寻址方式,即BP同SS搭配,其它均同DS搭配。【例】JMPWORDPTR[1000H];IP←DS:[1000H]JMPWORDPTR[SI];IP←DS:[SI]JMPWORDPTR[BP];IP←SS:[BP]⑤段间直接转移(远转移):是绝对转移,目标地址在指令中占4个字节(2字节IP,2字节CS),转移范围是存储器任何地方。格式:JMP逻辑地址JMPFARPTR标号操作:IP←目标地址的2字节偏移地址,CS←目标地址的2字节段地址【例】JMPFARPTRpnt;JMP2000H:3000H;CS←2000H,IP←3000H⑥段间间接转移(存储器间接):是绝对转移,目标地址在存储器中占4个字节(2字节IP,2字节CS),转移范围是存储器任何地方。格式:JMPDWORDPTR[mem]操作:IP←[mem]16,CS←[mem+2]16说明:段寄存器搭配关系同寻址方式,即BP同SS搭配,其它均同DS搭配。【例】JMPDWORDPTR[1000H];IP←DS:[1000H],CS←DS:[1002H]JMPDWORDPTR[SI];IP←DS:[SI],CS←DS:[SI+2]JMPDWORDPTR[BP];IP←SS:[BP],CS←SS:[BP+2]2、子程序(过程)调用指令CALL格式:CALLd功能:程序无条件转移到子程序(过程)地址d去执行并保护断点地址说明:CALL指令与JMP指令不同点在于CALL指令包含了保护断点地址的操作,即将断点处的IP(段内调用)值或CS、IP(段间调用)值压入堆栈(PUSHIP或PUSHCS;PUSHIP)。CALL指令应同子程序(过程)返回指令RET搭配使用。CALL指令与JMP指令类似,也分为段内调用、段间调用、直接调用、间接调用、相对调用、绝对调用等5种调用地址寻址方式,但没有短调用。系统设计中把同一代码段(CS)内调用的过程称为“近过程”,用NEAR表示;而把调用其他代码段(即段间)的过程称为“远过程”,用FAR表示。调用的目标地址通常用“过程名”表示,是一种符号地址。①段内直接调用(近过程):是相对调用,位移量在指令中占2个字节。格式:CALL有效地址EACALLNEAR过程名CALL过程名(过程名是已定义过的近过程名)操作:SP←SP-2[SP]←IPIP←有效地址EA或IP←IP±位移量(16位)说明:只在堆栈中保护IP,CS保持不变【例】CALLNEARproc1;IP←IP+proc1CALLproc2;IP←IP+proc2CALL1000H;IP←1000HIPXXXXXXXXXXXXSPSP②段内间接调用(寄存器间接):是绝对调用,子程序地址在16位的寄存器中。格式:JMPr16操作:SP←SP-2[SP]←IPIP←r16说明:只在堆栈中保护IP,CS保持不变【例】CALLBX;IP←BXCALLSI;IP←SIIPXXXXXXXXXXXXSPSP③段内间接调用(存储器间接):是绝对调用,子程序地址在存储器中占2个字节。格式:CALLWORDPTR[mem]操作:SP←SP-2[SP]←IPIP←[mem]16说明:只在堆栈中保护IP,CS保持不变。段寄存器搭配关系同寻址方式,即BP同SS搭配,其它均同DS搭配。【例】CALLWORDPTR[1000H];IP←DS:[1000H]CALLWORDPTR[SI];IP←DS:[SI]CALLWORDPTR[BP];IP←SS:[BP]IPXXXXXXXXXXXXSPSP④段间直接调用(远过程):是绝对调用,子程序地址在指令中占4个字节(2字节IP,2字节CS)。格式:CALL逻辑地址CALLFARPTR过程名CALL过程名(过程名是已定义过的远过程名)操作:SP←SP-2[SP]←CSSP←SP-2[SP]←IPIP←逻辑地址之偏移地址或子程序地址的2字节偏移地址CS←逻辑地址之段地址或子程序地址的2字节段地址说明:在堆栈中先压入CS,再压入IP。【例】CALLproc3;CALL1000H:2000H;CS←1000H,IP←2000HIPCSXXXXXXXXSPXXXXSP⑤段间间接调用(存储器间接):是绝对调用,子程序地址在存储器中占4个字节(2字节IP,2字节CS)。格式:CALLDWORDPTR[mem]操作:SP←SP-2[SP]←CSSP←SP-2[SP]←IPIP←[mem]16CS←[mem+2]16说明:在堆栈中先压入CS,再压入IP。段寄存器搭配关系同寻址方式,即BP同SS搭配,其它均同DS搭配。【例】CALLproc3;CALLDWORDPTR[2000H];IP←[2000H],CS←[2002H]IPCSXXXXXXXXSPXXXXSP3、子程序(过程)返回指令RET(RETurn)格式:RETRETn功能:无条件从子程序返回说明:返回指令RET执行与CALL指令相反的操作,RET指令安排在子程序中,实现从子程序返回到主程序断点处继续执行。如果子程序被定义的是一个NEAR(段内)过程,则RET实现段内返回,即恢复断点时将栈顶的字内容弹出到IP,然后将SP+2→SP;如果子程序被定义的是一个FAR(段间)过程,则RET实现段间返回,即再次将栈顶的字内容弹出到CS,并再次将SP+2→SP。最后,检查RET指令中是否带有参数n(n可以是0~FFFFH中的任一偶数),如果没有,操作结束;如果有,则把这个n加到SP中,以便丢弃一些在执行CALL指令前入栈的参数。段内(近过程)返回指令(与段内调用相呼应):RET;IP←(SP),SP←SP+2IPXXXXXXXXXXXXSPSPIP段间(远过程)返回指令(与段间调用相呼应):RET;IP←(SP),SP←SP+2,CS←(SP),SP←SP+2IPCSXXXXXXXXSPSPIPXXXXCS段间返回指令带参数:RETn;IP←(SP),SP←SP+2,CS←(SP),SP←SP+2,SP←SP+nIPCSXXXX...SPSPIPXXXXCSSPXXXXXXXXn个字节条件转移指令(18条)4、条件转移指令格式:J条件标号功能:若满足条件,则程序转移到标号地址去执行,否则继续执行下一条指令说明:条件转移指令是以标志位的状态,或者是以标志位的逻辑运算结果作为转移依据的。如果满足转移条件,则程序转移到指定的目标地址,否则,继续执行下一条指令。条件转移都是短转移,转移距离只能在(-128~+127)内完成。简单转移:条件是由标志寄存器中的标志的状态决定的转移。复杂转移:条件是由有符号数和无符号数比较大小决定的转移。A:Above高于N:Not非、无B:Below低于O:Overflow溢出C:Carry进位S:Sign符号E:Equal等于Z:Zero零G:Great大于PE:ParityEven偶校验L:Less小于PO:ParityOdd奇校验条件字母简单转移指令(10条)FRJC标号;CF=1有进位,则转移到标号所在地址JNC标号;CF=0无进位,则转移到标号所在地址CFJZ/JE标号;ZF=1结果为零,则转移到标号所在地址JNZ/JNE标号;ZF=0结果为非零,则转移到标号所在地址ZFJS标号;SF=1结果为负,则转移到标号所在地址JNS标号;SF=0结果非负,则转移到标号所在地址SFJP标号;PF=1结果1的个数为偶数个,则转移JNP标号;PF=0结果1的个数为奇数个,则转移PFJO标号;OF=1结果溢出,则转移到标号所在地址JNO标号;OF=0结果未溢出,则转移到标号所在地址OF简单转移:条件是由标志寄存器中的标志的状态决定的转移。复杂转移指令(8条)复杂转移:条件是由有符号数和无符号数比较大小决定的转移。无符号数转移指令:比较两个无符号数,并根据比较结果转移JA标号;两数比较,高于则转移(JNBE)JNA标号;两数比较,不高于则转移(JBE)JB标号;两数比较,低于则转移(JNAE)JNB标号;两数比较,不低于则转移(JAE)有符号数转移指令:比较两个有符号数,并根据比较结果转移JG标号;两数比较,大于则转移(JNLE)JNG标号;两数比较,不大于则转移(JLE)JL标号;两数比较,小于则转移(JNGE)JNL标号;两数比较,不小于则转移(JGE)循环控制指令(4条)循环控制指令用来控制程序段循环执行的次数,循环次数必须放在CX寄存器中循环控制指令是段内短距离相对转移指令,转移距离为-128~+1275、循环指令LOOP格式:LOOP标号功能:将CX←CX-1,若CX≠0则转到标号地址去执行,否则执行下一条指令说明:LOOP指令相当于下面两条指令的组合:
本文标题:第3章_5 控制转移
链接地址:https://www.777doc.com/doc-3970036 .html