资源预览内容
第1页 / 共58页
第2页 / 共58页
第3页 / 共58页
第4页 / 共58页
第5页 / 共58页
第6页 / 共58页
第7页 / 共58页
第8页 / 共58页
第9页 / 共58页
第10页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
3.3.5 程序控制指令控制转移指令分为:转移指令循环控制指令调用和返回指令中断指令1 1表表4-6 控制转移类指令控制转移类指令类别类别 指令名称指令名称 指令格式指令格式无条件转移无条件转移无条件转移无条件转移 JMP JMP目标标号目标标号调用调用/ /返回返回过程调用过程调用 CALL CALL 过程名过程名 调用调用/ /返回返回条件转移条件转移( (无符号数无符号数) )(CF/ZF)(CF/ZF)过程返回过程返回 RET RET 弹出值弹出值 高于高于/ /不低于也不等于转移不低于也不等于转移 JA/JNBE JA/JNBE 目标标号目标标号 高于或等于高于或等于/ /不低于转移不低于转移 JAE/JNB JAE/JNB 目标标号目标标号 低于低于/ /不高于也不等于转移不高于也不等于转移 JB/JNAE JB/JNAE 目标标号目标标号 低于或等于低于或等于/ /不高于转移不高于转移 JBE/JNA JBE/JNA 目标标号目标标号 2 2续表(续表(2)类别类别 指令名称指令名称 指令格式指令格式条件转移条件转移(CF/ZF)(CF/ZF)条件转移条件转移( (有符号数有符号数) )(OF/SF/ZF)(OF/SF/ZF)进位位为进位位为1 1转移转移 JC JC 目标标号目标标号 进位位为进位位为0 0转移转移 JNC JNC 目标标号目标标号 等于等于/ /结果为结果为0 0转移转移 JE/JZ JE/JZ 目标标号目标标号 不等于不等于/ /结果不为结果不为0 0转移转移 JNE/JNZ JNE/JNZ 目标标号目标标号 大于大于/ /不小于也不等于转移不小于也不等于转移 JG/JNLE JG/JNLE 目标标号目标标号 大于或等于大于或等于/ /不小于转移不小于转移 JGE/JNL JGE/JNL 目标标号目标标号 小于小于/ /不大于也不等于转移不大于也不等于转移 JL/JNGE JL/JNGE 目标标号目标标号 3 3续表(续表(3)类别类别 指令名称指令名称 指令格式指令格式条件转移条件转移( (有符号数有符号数 OF/SF/ZF)OF/SF/ZF)条件转移条件转移(OF/PF/SF)(OF/PF/SF)小于或等于小于或等于/ /不大于转不大于转移移 JLE/JNG JLE/JNG 目标标号目标标号 溢出转移溢出转移 JO JO 目标标号目标标号 不溢出转移不溢出转移 JNO JNO 目标标号目标标号 奇偶位为奇偶位为0/0/奇偶性为奇偶性为奇转移奇转移 JNP/JPO JNP/JPO 目标标号目标标号 奇偶位为奇偶位为1/1/奇偶性为奇偶性为偶转移偶转移 JP/JPE JP/JPE 目标标号目标标号 符号标志位为符号标志位为0 0转移转移 JNS JNS 目标标号目标标号 符号标志位为符号标志位为1 1转移转移 JS JS 目标标号目标标号 4 4续表(续表(4)类别类别 指令名称指令名称 指令格式指令格式循环控制循环控制 (CX/ZF)(CX/ZF)循环循环 LOOP LOOP 目标标号目标标号 等于等于/ /结果为结果为0 0循环循环LOOPE/LOOPZLOOPE/LOOPZ目标目标标号标号 不等于不等于/ /结果不为结果不为0 0循循环环 LOOPNE/LOOPNZLOOPNE/LOOPNZ目目标标号标标号 CXCX内容为内容为0 0转移转移 JCXZJCXZ目标标号目标标号 中断中断 中断中断INT INT 中断类型中断类型 溢出时中断溢出时中断INTO INTO 中断返回中断返回IRET IRET 5 5转移指令的实质转移指令的实质: 改变改变IPIP( (或者或者CSCS和和IPIP) )的内容。的内容。对标志位对标志位flagsflags的影响的影响: : 所有转移指令所有转移指令不会不会影响标志位影响标志位flagsflags。分类分类: : 分为分为无条件无条件转移转移和和条件条件转移转移两种。两种。6 6(1) 无条件转移指令无条件转移指令 - JMP 本指令无条件转移到指定的目标地址, 以执行从该地址开始的程序段。根据设置CS、IP的方法,JMP指令可实现短短 近近 远远距离距离跳转, 指令分成4种情况。 段内段内段内段内直接直接直接直接转移:转移:转移:转移: JMP dispJMP disp 指令中给出的指令中给出的指令中给出的指令中给出的8/168/168/168/16位的位移量位的位移量位的位移量位的位移量加到加到加到加到IPIPIPIP, CS, CS, CS, CS保持不变。保持不变。保持不变。保持不变。 段内段内段内段内间接间接间接间接转移:转移:转移:转移: JMP reg / memJMP reg / mem reg/memreg/memreg/memreg/mem中的中的中的中的16161616位偏移地址位偏移地址位偏移地址位偏移地址送送送送IPIPIPIP, , , , CSCS保持不变。保持不变。保持不变。保持不变。 段间段间段间段间直接直接直接直接转移转移转移转移 JMP segment : offsetJMP segment : offset 指令中给出的指令中给出的指令中给出的指令中给出的1616位的段位的段位的段位的段和和和和1616位的偏移地址位的偏移地址位的偏移地址位的偏移地址送到送到送到送到CSCS和和和和IPIP。 段间段间段间段间间接间接间接间接转移转移转移转移 JMP mem32JMP mem32 mem32mem32mem32mem32中中中中的的的的1616位的段和位的段和位的段和位的段和1616位的偏移地址位的偏移地址位的偏移地址位的偏移地址送到送到送到送到CSCS和和和和IPIP。7 7 转移的目标地址由指令直接给出。指令中给出的目标转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个地址实际上是一个相对于相对于相对于相对于IPIPIPIP的位移量的位移量的位移量的位移量: JMP JMP JMP JMP dispdisp ; ; 位移量位移量 转移范围转移范围 汇编语言中格式汇编语言中格式 8 8位位 -128-128+127+127 JMP JMP SHORTSHORT OPRD; OPRD; 短短短短距离距离距离距离 16 16位位 - -3276832768+ +3276732767 JMP JMP NEAR PTRNEAR PTR OPRD OPRD 或或 OPRDOPRD ; ; 近近近近距离距离距离距离注意注意注意注意: : : : dispdisp的助记符写为新的助记符写为新的助记符写为新的助记符写为新IP,IP, 而而而而dispdisp的机器码为位移量的机器码为位移量的机器码为位移量的机器码为位移量d d( (新新新新IP=IP=原原IP+IP+位移量位移量d)d)例:例:JMPJMP0120H0120H ;直接转向;直接转向01200120H(H(缺省为缺省为NEAR)NEAR) JMP JMPSHORT LPSHORT LP ;转向转向LPLP JMP JMPNEAR PTR BBBNEAR PTR BBB;转向转向BBBBBB 由于是由于是段内段内转移转移, ,故转移后故转移后CSCS内容保持不变内容保持不变 段内直接转移段内直接转移8 8无条件段内转移直接转移:直接转移: JMP LableJMP Lable转移目标地址: 段基地址段基地址CSCS不变;不变; 偏移地址偏移地址IP=IP=当前当前IP+IP+位移量位移量(16(16位位) )JMP LableLabel 代代码码段段位移量位移量近地址标号近地址标号CS : IP=9 9段内间接转移段内间接转移 转移的目标地址由寄存器寄存器或存储单元存储单元的内容给出。 例例1:JMP SI ; 近近距离距离 若(SI)=1200H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址1200H处开始执行。 注意:目标地址以段内偏移的形式给出,而不是相对于IP的位移量,所以它是一个16位的操作数。1010无条件段内转移间接转移: JMP BX JMP WORD PTRBXJMP BX 代代码码段段数数据据段段BX=1200 XXHXXHIP指令码指令码CS : IP1111 例例2:JMP BX+DI 设指令执行前: (DS)=3000H,(BX)=1300H, (DI)=1200H,(32500H)=2350H; 则指令执行后:(IP)=2350H在汇编语言中,段内间接寻址通常写成:JMPJMP WORD PTRWORD PTRBX+DIBX+DI表示所取得的目标地址是一个字。1212段间直接转移段间直接转移 在指令中直接给出要转移到的目的段地址和偏移地址。 例:例:JMP2000H:1000H ;远远距离距离执行时,(IP)1000H,(CS)2000H注意:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符FAR PTR。 例:例:JMP FAR PTR far_label ;远远距离距离其中的far_label为远类型的标号。1313无条件段间转移直接转移: JMP FAR PTR Lable远地址标号远地址标号JMPLabel 代代码码段段1代代码码段段2XXHXXHXXHXXHIPCSCS : IP=1414 转移的目的地址(段和偏移)在两个相邻的字存储单元字存储单元中。例如:JMPJMP DWORDDWORD PTRPTRSI SI ; 远远距离距离设指令执行前:(DS)=4000H,(SI)=1212H, (41212H)=1000H,(41214H)=4A00H则指令执行后:(IP)=1000H,(CS)=4A00H于是转到4B000H处开始执行指令。 例中的DWORD PTRDWORD PTR表示转移地址是一个双字。段间间接转移段间间接转移1515无条件段间转移间接转移: JMP DWORD PTRBXXXHXXHXXHXXHBXIPCSJMP 指令码指令码代代码码段段1代代码码段段2数数据据段段CS : IP161640001212+) 41212DSSI0010004A 4121241213412144121510004A00IPCS段间间接转移操作示意图段间间接转移操作示意图1111111111101100JMP DWORD PTR SI的机器码的机器码DS:SI1717 条件转移指令可实现程序的条件分支。 条件转移指令根据标志位的状态来决定是 否进行分支转移。 格式:JXX label;xx为条件名称缩写 指令的转移范围为-128+127字节(短跳转)。 主要的条件转移指令参见p142表3-7。(2)(2)条件转移指令条件转移指令 - J- JXX1818 根据根据单个标志位单个标志位设置的条件转移指令设置的条件转移指令 JB/JC JB/JC ;低于低于, ,或或CF=1CF=1, , 则转移则转移 JNB/JNC/JAE JNB/JNC/JAE ;不低于不低于, ,或或CF=0CF=0, ,高于或等于高于或等于, , 则转移则转移 JP/JPE JP/JPE ;奇偶标志奇偶标志PF=1PF=1( (偶偶) ), , 则转移则转移 JNP/JPO JNP/JPO ;奇偶标志奇偶标志PF=0PF=0( (奇奇) ), , 则转移则转移 JZ/JE JZ/JE ;结果为零结果为零( (ZF=1ZF=1), ), 则转移则转移 JNZ/JNE JNZ/JNE ;结果不为零结果不为零( (ZF=0ZF=0), ), 则转移则转移 JS JS ;SF=1SF=1, , 则转移则转移 JNS JNS ;SF=0SF=0, , 则转移则转移 JO JO ;OF=1OF=1, , 则转移则转移 JNO JNO ;OF=0OF=0, , 则转移则转移1919这类指令主要用来判断两个数的大小判断两个数的大小。一般指令序列为: CMP dist,src ;比较 Jxx label ;根据比较结果转移 判断无符号数的大小l lJA JA 高于则转移(高于则转移(distsrc) 转移条件为: CF=0ZF=0l lJNA/JBEJNA/JBE 低于或等于则转移(低于或等于则转移(distsrc) 转移条件为: CF=1ZF=1 根据根据组合条件组合条件设置的条件转移指令设置的条件转移指令2020l lJGJG ;大于则转移大于则转移( (distsrc) ) 转移条件为: (SFOF=0)ZF=0l lJGEJGE ;大于或等于则转移大于或等于则转移( (distsrc) ) 转移条件为: (SFOF=0)ZF=1l lJLJL ;小于则转移小于则转移( (distsrc) ) 转移条件为: (SFOF=1)ZF=0l lJLE JLE ;小于或等于则转移小于或等于则转移( (distsrc) ) 转移条件为: (SFOF=1)ZF=1l 判断有符号数的大小2121根据根据CXCX内容来决定是否转移的转移指令内容来决定是否转移的转移指令 JCXZ label 若(CX)=0,则转移到label处开始执行。2222条件转移指令条件转移指令条件转移指令条件转移指令举例:举例:举例:举例:以十六进制数形式显示以十六进制数形式显示以十六进制数形式显示以十六进制数形式显示BXBXBXBX中的内容。中的内容。中的内容。中的内容。MOVMOV BX, 1234HBX, 1234HMOVMOV CH, 4CH, 4 ; CH; CH做循环计数器做循环计数器ROT:ROT: MOVMOV CL, 4CL, 4; CL; CL做移位计数器做移位计数器 ROLROLBX, CLBX, CL; ; 将最高将最高4 4位移到低位移到低4 4位位 MOVMOV AL, BLAL, BL ANDANDAL, 0FHAL, 0FH; ; 取出低取出低4 4位位 ADDADDAL, 30HAL, 30H; ; 转换为转换为ASCIIASCII码码 CMPCMPAL, 39HAL, 39H; ; 与与 9 9 比较比较 JBE JBE DISPDISP; ; 若若( (AL)AL)9, 9, 则转显示则转显示 ADDADDAL, 7AL, 7; ; 若若( (AL)AL) 9, 9, 再加再加7 7转为转为 A-A-FFDISP:DISP: MOVMOV DL, ALDL, AL; (DL); (DL)字符字符 MOVMOV AH, 2AH, 2 INTINT21H21H; ; 显示输出显示输出 DECDECCHCH; 4; 4个十六进制数显示完否个十六进制数显示完否? ? JNZJNZROTROT; ; 没有没有, , 循环循环 MOVMOV DL, 48HDL, 48H; H; H MOVMOV AH, 2AH, 2 INTINT21H21H; ; 最后显示最后显示 HH2323 用在循环程序中以确定是否要继续循环。 循环次数通常置于CX中。 转移的目标应在距离本指令-128+127的范围之内(短跳转)。 循环控制指令不影响标志位。2424(1) LOOP格式:格式:LOOP LOOP label 类比类比 串前缀串前缀REP操作:操作:(CX)-1CX; 若( (CX)0CX)0,则转至label处执行; 否则退出循环,执行LOOP后面的指令。 注:注:LOOP指令与下面的指令段等价:指令与下面的指令段等价: DEC CX JNZ label2525(2)LOOPZ (LOOPE) 类比类比 串前缀串前缀REPZ/E格式:格式:格式:格式:LOOPZLOOPZLOOPZLOOPZ labellabel操作:操作:操作:操作:( (CX)-1CXCX)-1CX; 若若(CX)0ZF=1(CX)0ZF=1(CX)0ZF=1(CX)0ZF=1, ,则转至则转至labellabel处执行处执行; 否则退出循环否则退出循环, ,执行执行LOOPLOOP后面的指令。后面的指令。(3)LOOPNZ (LOOPNE) 类比类比 串前缀串前缀REPNZ/NE格式:格式:格式:格式:LOOPNZ LOOPNZ LOOPNZ LOOPNZ labellabel操作:操作:操作:操作:( (CX)-1CXCX)-1CX; 若若( ( ( (CX)0ZF=0CX)0ZF=0CX)0ZF=0CX)0ZF=0, ,则转至则转至labellabel处执行处执行; 否则退出循环否则退出循环, ,执行执行LOOPLOOP后面的指令。后面的指令。2626例1:给1A000H开始的256个内存单元均减去1,若发现某个单元减为0则立即退出循环,其后的单元不再减1。程序段如下:(逻辑地址为1A00:0H) MOV AX, 1A00H MOV DS, AX ; 1A00H段 MOV DI, -1 MOV CX, 256 GOON: INC DI DEC BYTE PTRDI LOOPNZ GOON HLT 2727例例例例2 2:在在8000H8000H开始的长度为开始的长度为10001000字节的字符串中查找字节的字符串中查找SS ,若找到,把其偏移地址记录在,若找到,把其偏移地址记录在ADDRADDR中,否则中,否则ADDRADDR单元置为单元置为0FFFFH0FFFFH。 MOV DI, 8000HMOV DI, 8000H MOV CX, 1000 MOV CX, 1000 MOV AL, S MOV AL, S MOV ADDR, 0FFFFH MOV ADDR, 0FFFFH GOON: SCASGOON: SCASB B LOOPNZLOOPNZ GOON GOON ; ; 两条可并为两条可并为REPNZ SCASBREPNZ SCASB JNZ DONE JNZ DONE DEC DI DEC DI MOV ADDR,DI MOV ADDR,DI DONE: HLT DONE: HLT 28283. 3. 过程调用和返回指令过程调用和返回指令 过程过程( (子程序子程序) ) 一段具有特定功能的,供其它程序调用的公用程序。一段具有特定功能的,供其它程序调用的公用程序。 特点特点 调用子程序时,调用子程序时,IPIPIPIP( (或或CS:IPCS:IPCS:IPCS:IP) )的内容被压入堆栈栈顶。的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到从子程序返回时,栈顶的内容又被弹出到IPIPIPIP( (或或CS:IPCS:IPCS:IPCS:IP) )。 子程序执行结束后一般均要返回调用程序。子程序执行结束后一般均要返回调用程序。 一次定义,多次调用;一次定义,多次调用; 可带参数调用,以完成不同的功能。可带参数调用,以完成不同的功能。 优点优点 程序代码短程序代码短, ,结构清晰结构清晰, ,便于编程、调试、修改和阅读。便于编程、调试、修改和阅读。 两条相关指令两条相关指令: 子程序调用指令子程序调用指令 CALL CALL 子程序返回指令子程序返回指令 RETRET2929断点断点入口入口地址地址 用于调用一个子过程;用于调用一个子过程; 调用前须调用前须保护断点保护断点地址地址( (断点断点=CALL=CALL的下的下一条指令地址一条指令地址CS:IP)CS:IP);再跳转到子程序入;再跳转到子程序入口地址口地址( (子程序入口地址子程序入口地址= =子程序的第一条子程序的第一条指令地址指令地址CS:IPCS:IP 或或CSCS :IP:IP ) ); 子过程执行结束后要返回原调用处继续子过程执行结束后要返回原调用处继续执行原程序执行原程序 断点恢复断点恢复(RET(RET指令指令) )。调用指令CALL与转移指令JMP的比较RETCALLCALL 子程序入口地址 = JMP 子程序入口地址 + PUSH CALLCALL的下一条指令地址的下一条指令地址CALL指令功能:3030主程序调用子程序的执行过程: 将调用指令的下一条指令的地址(断点)压入堆栈将调用指令的下一条指令的地址(断点)压入堆栈(CALLCALL指令指令);); - -相当于乎相当于乎 PUSH PUSH 下一条指令的地址下一条指令的地址(IP(IP或或 CS:IP)CS:IP) 获取子过程的入口地址(子过程第获取子过程的入口地址(子过程第1 1条指令的偏移地条指令的偏移地址)址) (CALLCALL指令指令) ; - -相当于乎相当于乎 JMPJMP入口地址入口地址(CS:IP(CS:IP 或或CSCS :IP:IP ) ) 执行子过程,含相应参数的保存及恢复(执行子过程,含相应参数的保存及恢复(其它指令其它指令);); 将断点偏移地址由堆栈弹出,返回原程序(将断点偏移地址由堆栈弹出,返回原程序(RETRET指令指令)。 -相当于乎相当于乎 POP IPPOP IP或或 CS:IPCS:IP3131 一般格式:一般格式:一般格式:一般格式:CALL CALL CALL CALL subsubsubsub ; ; ; ;subsubsubsub为子程序的入口为子程序的入口为子程序的入口为子程序的入口 根据子程序入口的寻址方式,子程序调用有根据子程序入口的寻址方式,子程序调用有4 4 4 4类类类类。 段内段内直接直接调用调用 子程序的偏移地址直接由子程序的偏移地址直接由CALLCALL指令给出。指令给出。 格式:格式:格式:格式:CALLCALLCALLCALL nearnearnearnear_proc_proc_proc_proc ; ;近近调用调用 CALL CALL执行时,它首先将执行时,它首先将IPIP内容压栈,然后把指令内容压栈,然后把指令中给出的中给出的位移量位移量加到加到IPIP上得到新上得到新IP跳转到子程序入口跳转到子程序入口地址。地址。 注意:注意:汇编以后的调用地址是相对于汇编以后的调用地址是相对于CALLCALL的下一的下一条指令的位移量。条指令的位移量。例:CALL 0120H ;子程序偏移地址由指令给出子程序偏移地址由指令给出(1)调用指令 CALLCALL3232位移量由汇编程序在汇编时进行计算,如下例: CS:0102CALL 0120H;3字节 CS:0105 则位移量为: 0120-0105H=001BH于是CALL 0120H的机器码为E8 1B 001B 00 CS:0102E8 CS:01031B CALL 0120H CS:010400 CS:0105 3333子程序的偏移地址在寄存器或存储器中子程序的偏移地址在寄存器或存储器中。 格式:格式:CALL CALL mem16/reg16mem16/reg16 ;近调用 CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP得到新IP跳转。 例: CALL CALLBX ;BX ;子程序地址由子程序地址由BXBX给出给出 CALL CALLWORD PTRSI ;WORD PTRSI ;子程序地址在存储器中子程序地址在存储器中段内段内间接间接调用调用3434CALL IPH IPL代码段代码段代码段代码段数据段数据段数据段数据段CALL WORD PTR SICALL WORD PTR SI指令的指令的指令的指令的操作图示:操作图示:假定:假定:假定:假定:( (DS)DS) = = 8000H8000H,(SI)(SI) = = 1200H1200H81200H81201H3535子程序的段地址和偏移地址直接由子程序的段地址和偏移地址直接由子程序的段地址和偏移地址直接由子程序的段地址和偏移地址直接由CALLCALLCALLCALL指令给出。指令给出。指令给出。指令给出。 格式:格式:格式:格式:CALL CALL CALL CALL farfarfarfar_proc_proc_proc_proc ;far_proc ;far_proc ;far_proc ;far_proc为远过程的地址为远过程的地址为远过程的地址为远过程的地址 ;远远远远调用调用调用调用指令的操作为:指令的操作为:指令的操作为:指令的操作为: CSCSCSCS内容压栈内容压栈内容压栈内容压栈 IPIPIPIP内容压栈内容压栈内容压栈内容压栈 CSCSCSCS段地址段地址段地址段地址 IPIPIPIP偏移地址偏移地址偏移地址偏移地址例:CALL 2000H:1000H CALL TIMER ;TIMER为远过程段间段间直接直接调用调用保护断点跳转3636 子程序的段和偏移地址为存储器的连续子程序的段和偏移地址为存储器的连续子程序的段和偏移地址为存储器的连续子程序的段和偏移地址为存储器的连续4 4 4 4个单元中的个单元中的个单元中的个单元中的内容。内容。内容。内容。 格式:格式:格式:格式:CALLCALLCALLCALL mem32 mem32 mem32 mem32 ;远远远远调用调用调用调用 指令的操作为:指令的操作为:指令的操作为:指令的操作为:( ( ( (含保护断点和跳转两步含保护断点和跳转两步含保护断点和跳转两步含保护断点和跳转两步) ) ) ) SP(SP)-2SP(SP)-2SP(SP)-2SP(SP)-2 ( ( ( (SP)+1,(SP)(SP)+1,(SP)(SP)+1,(SP)(SP)+1,(SP)(CSCSCSCS) ;CS) ;CS) ;CS) ;CS压栈压栈压栈压栈 CSCSCSCS(mem32+2)(mem32+2)(mem32+2)(mem32+2) SP(SP)-2SP(SP)-2SP(SP)-2SP(SP)-2 ( ( ( (SP)+1,(SP)(SP)+1,(SP)(SP)+1,(SP)(SP)+1,(SP)(IPIPIPIP) ;IP) ;IP) ;IP) ;IP压栈压栈压栈压栈 IPIPIPIP(mem32)(mem32)(mem32)(mem32)例:例:例:例:CALL DWORDCALL DWORDCALL DWORDCALL DWORD PTRDIPTRDIPTRDIPTRDI调用地址在调用地址在DIDI,DI+1DI+1,DI+2DI+2,DI+3DI+3四个存储单元中。低字内四个存储单元中。低字内容为偏移地址容为偏移地址, ,高字内容为段地址高字内容为段地址。段间段间间接间接调用调用3737CALL代码段代码段代码段代码段数据段数据段数据段数据段 IPH IPL CSH CSLDIDI+1DI+2DI+3段间间接调用示意图段间间接调用示意图CALL DWORDCALL DWORD PTRDIPTRDI3838例:下面的程序执行后,(AX)=? (DX)=? CS:CS:2000H MOV AX, 2012H2000H MOV AX, 2012H 2003H MOV CX, 200CH2003H MOV CX, 200CH(无此指令)(无此指令) 2006H PUSH CX 2006H PUSH CX 2007H 2007H CALL 4000HCALL 4000H 200AH ADD AX, BX 200AH ADD AX, BX 200CH ADD AX, DX 200CH ADD AX, DX 200EH HLT 200EH HLT CS:CS:4000H4000H MOV BX, 200AH MOV BX, 200AH POP DX POP DX RETRET3939段内段内返回指令RET的操作为: 恢复子程序执行前IP的内容。-相当于POP IP段间段间返回指令RET的操作为: 恢复子程序执行前IP和CS的内容。-相当于POP CS:IP 另有一种带立即数的返回指令另有一种带立即数的返回指令另有一种带立即数的返回指令另有一种带立即数的返回指令 “ “ “ “ RET nRET nRET nRET n ”,其中,其中,其中,其中n n n n为偶为偶为偶为偶数,表示从栈顶弹出地址后另外丢弃的字节数。数,表示从栈顶弹出地址后另外丢弃的字节数。数,表示从栈顶弹出地址后另外丢弃的字节数。数,表示从栈顶弹出地址后另外丢弃的字节数。例例:RET 4 ;RET 4 ;返回后再丢弃栈顶的返回后再丢弃栈顶的返回后再丢弃栈顶的返回后再丢弃栈顶的4 4 4 4个字节个字节个字节个字节(2)返回指令 RET4040中断的定义: CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(称为中断服务程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断中断。中断源分类:中断源分类:外部中断、内部中断外部中断、内部中断内部中断内部中断内部中断内部中断( (软件中断软件中断软件中断软件中断) ):CPUCPU内内内内部执行程序部执行程序部执行程序部执行程序( (INT nINT n或或或或INTOINTO) )时自身产生的中断。时自身产生的中断。时自身产生的中断。时自身产生的中断。外部中断外部中断外部中断外部中断( (硬件中断硬件中断硬件中断硬件中断) ):CPUCPU以以以以外外外外的设备、部件产生的的设备、部件产生的的设备、部件产生的的设备、部件产生的中断。用于处理外设与中断。用于处理外设与中断。用于处理外设与中断。用于处理外设与CPUCPU间的通信。间的通信。间的通信。间的通信。4141 中断指令中断指令中断指令中断指令用于产生用于产生软件中断软件中断软件中断软件中断,以执行一段特殊的中断,以执行一段特殊的中断处理过程(即处理过程(即中断服务子程序中断服务子程序中断服务子程序中断服务子程序)。)。 中断指令中断指令中断指令中断指令的主要作用:的主要作用:的主要作用:的主要作用: (1 1)调用操作系统(调用操作系统(OSOS)提供的特殊子程序(系统功)提供的特殊子程序(系统功能调用)能调用) (2 2)实现一些特殊功能,如调试程序时单步运行、断实现一些特殊功能,如调试程序时单步运行、断点等。点等。 (3 3)调用基本调用基本I/OI/O系统(系统(BIOSBIOS)提供的硬件低层服务。)提供的硬件低层服务。 8086/8088 8086/8088 CPUCPU在程序中允许安排一条中断指令来引在程序中允许安排一条中断指令来引起一个中断过程起一个中断过程, ,这种中断叫这种中断叫内部中断内部中断内部中断内部中断, ,或叫或叫软中断软中断软中断软中断。被中。被中断的指令地址处称为断的指令地址处称为“断点断点断点断点”。有关中断的详细情况将在。有关中断的详细情况将在第六章讨论。第六章讨论。 中断指令中断指令中断指令中断指令共有三条:共有三条: (1) (1)INT nINT n 执行执行类型类型n n的中断服务程序,的中断服务程序,n=0n=0255255 (2) (2)INTOINTO 执行执行溢出溢出( (OFOF) )中断的中断服务程序,中断的中断服务程序,=INT 4=INT 4 (3) (3)IRETIRET 从中断服务程序从中断服务程序返回返回调用程序调用程序4242中断中断中断中断INT nINT n与过程与过程与过程与过程CALL CALL 段间间接段间间接段间间接段间间接调用:调用:调用:调用: 中断中断是随机事件或异常事件引起,是随机事件或异常事件引起,调用调用则是事先已在程序中安排好则是事先已在程序中安排好 ; 响应响应中断中断请求不仅要保护断点地址,请求不仅要保护断点地址,还要还要保护保护FLAGSFLAGS内容;内容; 调用调用指令在指令中直接给出子程序指令在指令中直接给出子程序入口地址,入口地址,中断中断指令只给出指令只给出中断向量码中断向量码n n,入口地址则在向量码,入口地址则在向量码n n指向的内存指向的内存单元中。单元中。CALLINTRETIRET4343(1) INT n格式: INT n说明: n4 = 中断中断向量地址向量地址。该。该向量地址向量地址中的内容即为中中的内容即为中断服务程序入口地址断服务程序入口地址( (段段: :偏移偏移) ),入口地址也称为,入口地址也称为“ “中中中中断向量断向量断向量断向量” ”。0000 : n4 XXHXXHYYHYYH中断服务程序入中断服务程序入口的偏移地址口的偏移地址(IP)中断服务程序入中断服务程序入口的段地址口的段地址(CS)中断类型码中断类型码n = 0255内存中断向量中断向量中断向量地址中断向量地址中断向量地址中断向量地址= =4444INT指令的操作: 将FLAGS压入堆栈;-相当于 PUSH FLAGS 将INT指令下一条指令的地址压栈(即把CS和IP的内容压栈); -相当于 PUSH CS:IP 取中断服务程序入口地址送入CS和IP。 -相当于 JMP CS:IPINT指令只影响IF和TF, 对其余标志位无影响INT指令可用于调用系统服务程序,如INT 21H4545INT指令的操作例:INT 21H(软中断软中断)IPLIPHCSLCSHSP=1200FLAGSLFLAGSHSP=11FA执行执行INT 21H指令后指令后保护断点保护断点堆栈堆栈执行执行INT 21H指令前指令前(1)先做:保护标志FLAGS和保护断点地址CS:IP4646(2)再做:跳转到子程序(入口地址CS:IP)执行INT 21H指令后, CS=? IP=?因为因为因为因为n=21Hn=21H,所以,所以,所以,所以n n44=84H=84H。下图中,下图中,下图中,下图中,(0:0084H)=2000H:1123H(0:0084H)=2000H:1123H所以:所以:所以:所以: CS=2000H CS=2000H IP=1123HIP=1123H0000:0084H 23H11H00H20HIP CS0000 : 21H44747格式:格式: INTOINTO INTO检查溢出标志OF,如果OF=1,则启动一个类型4的中断过程;如果OF=0,不做任何操作。 通常INTO指令安排在有符号数算术运算指令后面。如IMULIMUL DXDXINTOINTO ; ;若溢出,则启动若溢出,则启动INT 4, INT 4, 否则往下执行否则往下执行MOVMOV RESULT,AXRESULT,AXMOVMOV RESULT+2,DXRESULT+2,DX (2)溢出中断 INTO相当于相当于INT 44848用于从中断服务程序返回被中断的程序。IRET负责恢复断点(CS和IP)和恢复标志寄存器FLAGS内容。任何中断服务程序不管是外部中断引起的,还是内部中断引起的,最后都要用IRET返回。IRET指令执行的操作为: 栈顶内容弹出到IP 栈顶内容弹出到CS 栈顶内容弹出到FLAGS(3)中断返回指令 IRET4949表表 4- 7 处理器控制类指令处理器控制类指令类别类别 名称名称 操作码操作码标志位操作标志位操作(CF/(CF/DF/IFDF/IF) )( (无无TF)TF)进位标志置进位标志置1 1STCSTC进位标志复位进位标志复位CLCCLC进位标志取反进位标志取反CMCCMC方向标志置方向标志置1 1STDSTD方向标志复位方向标志复位CLDCLD中断标志置中断标志置1 1中断标志复位中断标志复位STISTICLICLI3.3.6 处理器控制指令处理器控制指令5050续表(续表(2)类别类别 名称名称 操作码操作码外同步外同步停机停机HLTHLT等待等待WAITWAIT交权交权ESCESC封锁总线封锁总线LOCKLOCK空操作空操作空操作空操作NOPNOP51513.3.6 3.3.6 处理器控制指令处理器控制指令1.标志操作指令 用来设置标志位的状态。 (1)CF设置指令 CLC CLC 0CF0CF STC STC 1CF1CF CMC CMC CFCF变反变反 (2)DF设置指令 CLD CLD 0DF (0DF (串操作串操作的指针移动方向从低到高的指针移动方向从低到高) )STDSTD 1DF (1DF (串操作串操作的指针移动方向从高到低的指针移动方向从高到低) ) (3)IF设置指令CLICLI 0IF (0IF (禁止禁止INTRINTR中断中断) )STISTI 1IF (1IF (开放开放INTRINTR中断中断) ) 5252 执行HLT指令时,CPU进入暂停状态,设置该指令通常是为了等待中断。 外部中断(包括IF=1时的可屏蔽中断请求INTR及非屏蔽中断请求NMI)或复位信号可让CPU退出暂停状态。 该指令常用来等待中断的产生。2. 2. 外部同步指令外部同步指令(1) 暂停指令 HLT 这类指令都不影响这类指令都不影响FlagsFlags标志位标志位5353(2)空操作指令 NOP NOP指令不做任何实质性的操作,但占用3个时钟周期,然后执行下一条指令。 它多用于:(1)程序的延时; (2)预留存储空间(占位子)。 5454(3) 等待指令 WAITl l CPUCPU每隔每隔5 5个时钟周期就要检查一次个时钟周期就要检查一次 ,WAITWAIT指令可以使指令可以使CPUCPU进入等待状态,等待状态期间(进入等待状态,等待状态期间( 变为无效)变为无效)CPUCPU可被中断。当它为有效时,可被中断。当它为有效时, CPUCPU会停会停止执行止执行WAITWAIT,退出等待状态。,退出等待状态。 l l WAITWAIT主要用于:主要用于: (1 1)CPU (CPU (8086)8086)与协处理器与协处理器( (8087/8089)8087/8089)和外部设备和外部设备 的同步;的同步; (2 2)也可用来等待被允许的外部中断的到来,但中断)也可用来等待被允许的外部中断的到来,但中断 任务执行完后仍返回任务执行完后仍返回WAITWAIT指令,继续等待。指令,继续等待。5555(4) 换码或协处理器指令 ESC ESC指令主处理器可向协处理器提供一条可执行的指令及相应的操作数。 当执行ESC指令时,协处理器监视系统总线, 并可取得操作码。由于8087协处理器无寻址能力,当取得操作需要存储器访问时,8086主处理器将指定存储单元的内容送到数据总线上,否则不需要8086做任何事情。 指令一般格式: ESC OPRD OPRD为存储器操作数。指令执行时,把一个指定的存储单元的内容送到DB上,由协处理器获取后,完成相应的操作。5656 (5) 封锁指令 LOCK LOCK是一个可用在有关指令前面的前缀,使用了这个指令前缀的指令,可在指令执行期间封锁局部总线,以保证在多处理器及多任务下的数据安全。 LOCK指令前缀可使CPU的LOCK 引脚产生一个有效电平,以实现总线封锁,此过程一直持续到该指令执行结束。 5757作业:P1525858
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号