导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→帮帮忙,关于子程序[fansuyan]

 *第14349篇: 帮帮忙,关于子程序

  
楼 主:fansuyan 2003年7月11日14:51
 帮帮忙,关于子程序

我有问题请您帮忙,是关于子程序的结束问题,假如有这样一条指令lcall jsxl,这是调用子程序,而在jsxl子程序中间 还有ljmp m1,在m1结束的时候有ret,那等程序执行到m1结束的ret,那您说这个调用lcall jsxl结束了吗,   
  
2楼:我是一条鱼 2003年7月11日15:28
 我回答你
我有问题请您帮忙,是关于子程序的结束问题,假如有这样一条指令lcall jsxl,这是调用子程序,而在jsxl子程序中间 还有ljmp m1,在m1结束的时候有ret,那等程序执行到m1结束的ret,那您说这个调用lcall jsxl结束了吗,   
      在m1结束的时候,执行RET后,它就回到 jsxl,继续执行直到jsxl结束,这个lcall jsxl才算结束。 
  
3楼:Lichunfu 2003年7月12日08:42
 回答错误!
当程序执行到M1结束的RET时,CPU会把当时栈顶的两字节数据弹出到PC(针对51系列),如果在进入子程序JSXL后到M1的RET指令时没有做过压栈,或者压入的数据已经弹出,那么此时栈顶内容应该是指令LCALL JSXL后面将要执行的指令地址,也就是说程序执行了RET语句后,PC已经指向LCALL JSXL后面的语句,故LCALL JSXL已经结束。不信你可以用仿真软件执行一下就知道了。
  
4楼:luz 2003年7月14日13:57
 同意,
小鱼同学搞错嘞。
不过这样很

同意,
小鱼同学搞错嘞。
不过这样很容易出错哦,其他进栈的东东都出不来了。
  
5楼:xdkjason 2003年7月15日12:05
 能告诉我在什么情况下会出错吗?
  
6楼:我是一条鱼 2003年7月15日09:34
 我真的搞错了
不好意思,我错了,我对  LCALL  指令过程中的堆栈和压栈不是很明白,所以出错了。谢谢大家批评指正。
  
7楼:xdkjason 2003年7月15日12:05
 仔细看一下执行RET时有那些操作。
  
8楼:guest 2003年7月15日17:30
 如果不需要数据保护的话, 没有问题。
如果不需要数据保护的话,就不会出问题。
我以前用PIC16C711做过一个项目,时间要求很严格。我于是在中断里面用了3个RETI分支,程序跑到现在我也没有听技术支持的同事说有问题。
  
9楼:luz 2003年7月15日18:14
 不管怎样,进入中断后遇到RET命令一定可
不管怎样,进入中断后遇到RET命令一定可以返回的,因为ret命令就是把程序指针弹出来嘛,但是一定要把压栈的数据逐一退出,如果用jmp命令容易遗漏进栈的数据,我个人的习惯是一个中断只留一个ret,其余分支都在执行完后跳传到出栈的地方

>>>>>>对该主题发表你的看法

本主题贴数9,分页: [第1页]


[上一篇主题]:各位哥哥姐姐谁能告诉我在哪里能买到连PC机PS2口的带液晶屏的小键盘----拜托!!!!!!!!

[下一篇主题]:[求助]