微机原理与接口技术-4-3 汇编语言程序设计基本方法(实验3).pptVIP

微机原理与接口技术-4-3 汇编语言程序设计基本方法(实验3).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
微机原理与接口技术-4-3 汇编语言程序设计基本方法(实验3)

* 4.4.4.2 子程序的定义 格式:子程序名 PROC [类型] 过程体 子程序名 ENDP 子程序名也具有段属性,偏移地址属性和类型属性(FAR和NEAR(缺省))。 NEAR类型为段内调用,即主子程序在同一个代码段内,子程序一般定义为NEAR,NEAR可省略。 FAR类型为段间调用,被另外代码段调用的过程要定义为FAR过程(不管这两个代码段是否在一个模块中)。 * 1. 段内直接调用 格式:CALL 子程序名 功能:① (返回地址:跟在CALL后的下一条指令/断点的EA) → ↓(SP) ② 目的地址(子程序名)EA→IP CS:1010H CALL DISP CS:1013H INC SI ┇ CS:1138H DISP PROC NEAR ┇ ;CALL 1138H ;1013H进栈,1138H→IP 下一条指令(IP)1013H ┇ SP→ 4.4.4.3 子程序的调用与返回 * 格式:CALL FAR PTR 子程序名 功能: ① (CS) → ↓(SP);跟在CALL后的下一条 ② (IP) → ↓(SP);指令/断点的段首 ; 址和偏移 ③ 目的地址(子程序名)的段首址→CS ④ 目的地址的(子程序名)EA→IP 1000H:1010H CALL FAR PTR DISP 1000H:1013H INC SI ┇ 1200H:1138H DISP PROC FAR ┇ ;CALL 1200H:1138H ;1000H进栈,1200H→CS ;1013H进栈,1138H→IP 断点EA 断点CS SP→ 下一条指令(IP)1013H 下一条指令(CS)1000H ┇ 2.段间直接调用 * 格式:CALL WORD PTR OPD(16位段) 功能:(IP)→ ↓(SP), (OPD) → IP 3.段内间接调用 4.段间间接调用 格式:CALL DWORD PTR OPD(16位段) 功能:a.(CS) → ↓(SP) b.(IP)→ ↓(SP) c.(OPD)→IP d.(OPD+2)→CS OPD寻址方式与JMP类似BUF DD FDISP * (1) 段内间接调用可用除立即方式以外的其它寻址方式; (2) 段间间接调用可用除立即方式和寄存器寻址方式以外的其它寻址方式。 注意 * 格式:RET/RET n 功能:a. 段内返回 ↑(SP)→IP b. 段间返回 ↑(SP)→IP,↑(SP)→CS 为了能正确返回主程序,在执行子程序过程中,不管是否使用过堆栈,必须保证进入子程序时的栈顶与执行RET时的栈顶一样,否则不能正确返回。 注意: ① CALL和RET不影响标志位; ② 是段内返回还是段间返回要看子程序定义伪指令PROC后面的类; ③ 对于RET n 表示返回时,清除堆栈中栈顶的n/2个无用参数(n为偶数),在前述动作之后再作(SP)+n → SP,当使用堆栈传递子程序参数的时候经常使用。 5. 返回指令RET * 保护现场:主要指调用子程序前后,主程序中使用的寄存器(或者存储单元)的值不因子程序的调用而被破坏。 1. 该工作可在主程序中作,即调用子程序前,将主程序所用到的寄存器的内容保存起来,到返回主程序再恢复。这样很不方便,因为每调用一次子程序,就要作一次保存恢复的工作,麻烦。 ;子程序DISPLAY定义 DISPLAY_BUF PROC NEAR ; LEA DX,BUF MOV AH,9 INT 21H ; RET DISPLAY_BUF ENDP 4.5.4 子程序调用现场的保护方法 …… BUF DB ’OK’,’$’ TEMP DW 0,0 …… MOV TEMP,AX MOV TEMP+2,DX (PUSH AX) (PUSH DX) CALL DISPLAY_BUF MOV AX,TEMP MOV DX,TEMP+2 (POP DX) (POP AX) * 该工作可放在子程序中作,凡是子程序用到的寄存器,在进入子程序后首先入堆栈保存,返回之前由堆栈中弹出恢复。这样在调用子程序时,不用考虑寄存器被破坏的情况(除传递参数到子程序的寄存器除外)。

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档