- 1、本文档共34页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
五、控制转移(Control Jump)类指令 1. 无条件转移、调用和返回指令 (1)无条件转移指令(JUMP) 指令格式: JMP 目标标号(TARGET) 这类指令又分成两种类型: 第一种类型 段内转移或近(NEAR)转移。 第二种类型 段间转移,又称为远(FAR)转移。 不论是段内还是段间转移,又可分为两种方式: ①直接转移,指令码中直接给出转移的目的地址。 ②间接转移,目的地址包含在某个16位R/M中,CPU必须根据R/M寻址方式,间接地求出转移地址。 ① 段内直接转移。指令格式为: JMP 标号 建议写成: JMP NEAR PTR 标号 ;IP?IP+16位位移量,NEAR PTR为运算符。 目标偏移地址=当前IP值 + 指令中的位移量 位移量可以是8位也可以是16位。 若位移量是16位,最高位为符号位,此时指令为3字节,可在±32?KB范围内转移; 若位移量是8位,则为段内短转移,此时指令为2字节,转移范围在–128~+127之间。 段内短转移写成: JMP SHORT 标号 ;IP ? IP+8位位移量,SHORT为运算符。 ② 段内间接转移。 这类指令要转向的段内目标地址存放于某16位通用R/M中的某两个连续地址中,指令中只需给出R/M地址即可。 用寄存器间接寻址的段内转移指令,要转向的有效地址存放在寄存器中,执行的操作为:IP ? 寄存器内容。 JMP BX 对于用存储器间接寻址的段内转移指令,要转向的有效地址存放在存储单元中,所以JMP指令先要计算出存储单元的物理地址,再从该地址处取一个字送到IP,即: IP ? 字存储单元内容。 JMP WORD PTR 5[BX] 这种指令的目的操作数前要加WORD PTR,进行字操作。 JMP WORD PTR [SI] JMP TAB ;TAB为DS段中的字型变量 JMP TAB[BX+2] ③ 段间直接转移。 目标在其它代码段中,指令中用远标号直接给出了转向的段地址和偏移量,所以只要用指令中的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容,就可使程序从一个代码段转到另一个代码段去执行。 指令格式: JMP FAR PTR 标号 它是一个5字节指令,机器码的排列次序为:操作码、偏L、偏H、段L、段H 。 ④ 段间间接转移。 将目的地址的段地址和偏移量事先放在存储器中的4个连续地址单元中,其中前两个字节为偏移量,后两个字节为段地址,转移指令中只需给出存放目标地址的存储单元的首字节的偏移地址即可。这种指令的目的操作数前常加运算符DWORD PTR,表示转移地址需取双字。低字取代当前的IP,高字取代当前的CS。 JMP TAB1 ;TAB1为DS段内的双字型变量 JMP DWORD PTR VAR ;VAR为DS段中非双字型变量 JMP DWORD PTR [BX] ;目的地址在DS段存放 JMP DWORD PTR [BP][DI] ;目的地址在SS段存放 JMP DWORD PTR [BX][SI] ;目的地址在DS段存放 注意:间接寻址的转移指令,从存储器中取出一个字或双字,默认的段地址为DS。 (2)调用指令CALL 在编写程序时,往往把某些能完成特定功能而又经常要用到的程序段,编写成独立的模块,并把它称为过程(Procedure),习惯上也称作子程序(Subroutine),然后在程序中用CALL语句调用这些过程,调用过程的程序称为主程序。CALL指令迫使CPU暂停执行后续的下一条指令(形成断点),转去执行指定的过程,待过程执行完毕再返回断点继续运行。 子程序和调用程序可以在同一个代码段内,也可在不同的段内,前者称为段内调用(近过程),用NEAR表示;后者称为段间调用(远过程),用FAR表示。 要保证正确返回断点,必须将断点保护起来(进栈),它由机器自动完成。 格式: CALL NEAR PTR 过程名 ;段内调用 CALL FAR PTR 过程名 ;段间调用 CALL指令执行时分两步进行: ① 第一步是保护断点,也就是将当前的IP值推入堆 栈。对于段内近调用来说,执行的操作是: SP ? SP – 2 (SP + 1,SP)? IP 对于段间远调用来说,执行的操作是: SP ? SP – 2 (SP+1,SP)? CS SP ? SP – 2 (SP+1,SP)? IP ② 第二步是转到子程序的
文档评论(0)