3538|8

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51汇编 ret返回迷惑 [复制链接]

qing0: mov r0,#0FFH
QING_GOON: MOV @R0,#0
DJNZ R0,QING_GOON
   RET


调用这个函数怎么返回到了0000h呢??

最新回复

同意上位大哥的说法,不能给0ffh中全清零。  详情 回复 发表于 2009-5-18 15:26
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你用的是CALL吗?

如果不是,那不会先把之前的PC压栈

进行到RET的时候也会把栈里的东西弹出来

如果你的栈内容是0000的话,那就是回到0000了

呵呵
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是啊,,我是用的调用。lcall
是这样
  org 0000
  jmp start

  org 0030h
start:  lcall qing0.
  .....
  在这执行的时候总是回到00h。我没有堆栈。。有点搞不明白。。最后我就用了两个ljmp来解决问题。。这个想不明白是为什么。。
请各位指教下
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
这是因为你的R0变化范围是从FFH-0,这样将堆栈中的返回地址修改为0了,所以这段程序返回到00H;堆栈是物理上存在的,不管你用不用。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼上正解。
楼主是要把0~FF的地址都清零吧,可是这样做把堆栈也清零了,
比如堆栈指针SP=07,lcall qing0 的时候会自动把下一条指令的地址(0032还是0033不清楚,因为我不知道lcall指令的长度)放到SP指向的08号寄存器里,以便调用ret的时候从堆栈里取出数据作为PC指针返回调用处的下一条指令,
可是你把它都=0了,堆栈也=0了,堆栈弹出的数据自然=0,ret指令放到PC中的也=0,当然从0开始运行了
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
有没有初始化栈指针?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
堆栈指针初始化也不管用
内部RAM全清零了
包括堆栈内容
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

8
 
RET:子程序返回指令
PC15~8←((sp)),sp←(sp)-1
PC7~0←((sp)),sp←(sp)-1
RAM中最低32个字节可既可以当数据存储器(用8位地址来访问),也可以当能用寄存器R0-R7( 有4组,这4组的号码由PWS中的2位标志F1F0来决定,用寄存器+号码访问,如R0、R7),还可以作堆栈(通过与访问堆栈有关的指令访问,如CALL LCALL,RET RETI PUSH POP等),所以使用时用注意,否则容易冲突。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
同意上位大哥的说法,不能给0ffh中全清零。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表