加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

汇编语言---调用与返回指令1

(2013-01-25 14:02:30)
分类: 汇编
为了实现主程序调用子程序以及子程序自动返回主程序,几乎所有的指令系统都会提供一组调用和返回指令;8086/8088指令系统中的调用与返回指令的助记符格式以及指令的基本功能如下:
指令格式         功能描述
CALL OPR           [SP]<--[SP]-2,([SP]+1:[SP])<--[IP],[IP]<--[IP]+16位偏移量
CALL OPR1          [SP]<--[SP]-2,([SP]+1:[SP])<--[IP],[IP]<--[EA]
CALL FAR PTR OPR   [SP]<--[SP]-2,([SP]+1:[SP])<--[CS];压入返回地址的段地址
                   [SP]<--[SP]-2,([SP]+1:[SP])<--[IP];压入返回地址的偏移地址
                   [IP]<--OPR的偏移地址,即:待转向地址或子程序入口地址的偏移地址
                   [CS]<--OPR的段地址,即:待转向地址或子程序入口地址所在段的段地址
CALL OPR1          [SP]<--[SP]-2,([SP]+1:[SP])<--[CS];压入返回地址所在段的段地址
                   [SP]<--[SP]-2,([SP]+1:[SP])<--[IP];压入返回地址的偏移地址
                   [IP]<--[EA],[CS]<--[EA+2];设置待转向地址的偏移地址和段地址
RET                [IP]<--([SP]+1:[SP]),[SP]<--[SP]+2;弹出返回地址
RETF               [IP]<--([SP]+1:[SP]),[SP]<--[SP]+2;弹出返回地址的偏移地址
                   [CS]<--([SP]+1:[SP]),[SP]<--[SP]+2;弹出返回地址的段地址
RET n 或 RETF n    完成RET或RETF指令的功能之后,[SP]<--[SP]+n

1.调用指令CALL
调用指令CALL的基本功能就是将返回地址(即:调用指令的下一条指令的地址)压入堆栈,并转向子程序的入口地址处;调用指令可分为段内调用和段间调用;段内调用时,由于主程序与子程序在同一个段内,因此,调用前后,段寄存器CS的内容不会发生变化,因而,返回地址只需保存偏移地址即可,比如上述调用指令中的前两条指令;段间调用时,主程序与子程序不在同一个段内,此时,调用指令执行后,CS和IP的内容都会发生变化,因此,保存的返回地址必须要包含它的段地址和段内偏移地址两个部分;
子程序入口地址的寻址方式与无条件转移指令的待转向地址的寻址方式基本相同;
(1).段内直接调用指令"CALL OPR":指令中的OPR为子程序名,它代表了子程序的入口地址,其寻址方式为相对寻址方式;相对位移量是16位,它是子程序入口地址与返回地址的差值;
(2).段内间接调用指令"CALL OPR1":指令中的OPR1指出了存放子程序入口地址的那个存储单元,上述指令中的EA即为OPR1的有效地址,其寻址方式可以是除了立即数寻址方式和段寄存器寻址方式之外的任何寻址方式;因为是段内调用,所以,EA对应存储单元中存放的是子程序入口地址的16位偏移地址;
(3).段间直接调用指令"CALL FAR PTR OPR":指令中的OPR为过程名或子程序名,同样代表了过程或子程序的入口地址,其寻址方式为直接寻址方式,即:指令的机器码中直接给出了过程或子程序入口地址的段地址和偏移地址;
(4).段间间接调用"CALL OPR1":指令中OPR1的含义和寻址方式与段内间接调用指令相同,不同的是有效地址EA对应存储单元中存放的是子程序入口地址的段地址和偏移地址;
假设某程序中已经定义了子程序SEARCH1和PMOVE,以及变量SADR,那么,我们有以下调用指令:
CALL SREACH1        ;段内直接调用
CALL FAR PTR PMOVE  ;段间直接调用
CALL BX             ;段内间接调用
CALL WORD PTR [BX]  ;段内间接调用
CALL SADR           ;SADR是字变量,则是段内间接调用;SADR是双字变量,则是段间间接调用
2.返回指令RET
返回指令的功能是从栈顶弹出返回地址,并把弹出的返回地址送入指令指针寄存器IP和段寄存器CS,以保证子程序能够正确地返回到主程序;指令的寻址方式实际上都是以SP间接寻址;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有