- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编语言与接口技术课件 h3-4 子程序设计
3.4 子程序设计 将程序中经常出现或者具有通用性的某一段指令组定义为子程序,可以缩短程序长度,节省内存空间,在80x86汇编程序中,子程序常常以过程的形式出现(过程的定义与调用)。 3.4.1 过程定义 格式: 过程名 PROC [TYPE][USES REG] ┆ } 过程体 RET [n n] 过程名 ENDP TYPE:为过程类型,分为近程NEAR(本段调用)和远程FAR(跨段调用)。 USES REG:规定需要保护的通用寄存器(过程开始入栈,返回之前再出栈恢复)。 例3.36 定义一个过程名为SUB1的近程过程。 SUBl PROC NEAR ADD AX,BX MOV SI,CX MOV AX,DX RET SUB1 ENDP 例3.37 定义一个过程名为SUB2的远程过程。 SUB2 PROC FAR MOV BX,AX MOV CL,3 SHL BX,CL ADD AX,BX RET SUB2 ENDP 3.4.2 调用指令(直接调用和间接调用) 1.段内直接调用 格式:CALL NEAR PTR PROC NAME 功能:①将当前IP/EIP寄存器内容进栈(即保存CALL下一条指令的偏移地址)。 ②将过程名为PROC NAME的16位/32位偏移地址和当前IP/EIP值相加后,送IP/EIP寄存器中,采用相对寻址控制程序转移到过程。在16位模式下,转移位移量为-215~+215-1字节内。在32位模式下,转移位移量为-231~+231-1字节内。 例3.38 CALL SUB1 ;NEAR可以省略。 2.段内间接调用 格式1:CALL NEAR PTR[REG] 格式2:CALL REG 功能:①将当前IP/EIP寄存器内容进栈(即保存CALL的下一条指令的偏移地址)。 ②将过程的入口偏移地址送IP/EIP寄存器中,在寄存器寻址方式下,偏移地址在16位或32位REG中。在存储器寻址方式下,间接给出存放在数据段的偏移地址。 例3.39 CALL NEAR PTR[BX] CALL EBX 3.段间直接调用 格式:CALL FAR PTR PROC NAME 功能:①将当前CS、IP/EIP寄存器内容进栈(即保存CALL的下一条指令的偏移地址)。 ②将过程名为PROC NAME的段基址或段选择符送CS,16位或32位偏移地址送IP/EIP寄存器中。 例3.40 CALL FAR PTR SUB2 4.段间间接调用 格式:CALL FAR PTR[REG] 功能:①当前CS、IP/EIP寄存器内容进栈(即保存CALL指令下一条指令的偏移地址)。 ②指令以存储器间接寻址方式给出过程的偏移地址、段基址或段选择符,将段基址或段选择符和偏移地址取出送CS 及IP/EIP寄存器中。 5.返回指令 格式1:RET 格式2:RET OPR ; OPR为偶数 功能:根据过程类型( NEAR、 FAR)确定返回类型。 近程返回是从堆栈弹出调用时保存的偏移地址送IP/EIP。 远程返回是从堆栈弹出调用时保存的偏移地址送IP/EIP,再弹出段基址或段选择符送CS,控制程序返回。 指定OPR的作用:完成RET操作后根据OPR的值修改堆栈指针SP/ESP,用于清除过程调用时入栈的参数。 3.4.4
文档评论(0)