导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→大家早上好,昨天我写了个程序,结构如下:[carryonli]

 *第14512篇: 大家早上好,昨天我写了个程序,结构如下:

  
楼 主:carryonli 2003年7月17日09:11
 大家早上好,昨天我写了个程序,结构如下:
org 00h
ajmp start
org 30h
start:
       ajmp init
       ajmp rd_sec
       .
       .
       .
rd_sec:
       .
       .
       ret
init:
      .  
      .
      ret
end
不知为什么,程序编译通过了,无错误,但发现当运行到init的ret后,程序不返回,而是跳到别的地方去了,不知为什么?请各位大侠帮助分析一下。

  
2楼:btzhy 2003年7月18日20:44
 sp没有初始化,它的缺省值是07h,可能
sp没有初始化,它的缺省值是07h,可能被你的INIT程序占用了
  
3楼:eastzsp 2003年7月18日21:32
 看看问题的根源
程序初始化的时候不要用跳转,就是跳转了也不能用RET去返回,
org 00h
ajmp start
org 30h
start:
       acall init
       acall rd_sec
       ljmp start             ;循环执行。
       .
       .
rd_sec:
       .
       .
       ret
init:
      .  
      .
      ret
end
这样就没有问题了。

//**************************************

  
4楼:xdkjason 2003年7月19日10:33
 他怎么调用子程序用跳转呢:)
  
5楼:bizhenke 2003年7月19日11:46
 呵呵,是的,开始还没有注意!
呵呵,是的,开始还没有注意!
  
6楼:bizhenke 2003年7月19日11:40
 你的init模块内有没有改写堆栈中的数据
你的init模块内有没有改写堆栈中的数据或者某些特殊寄存器中的数据?
  
7楼:Kuang-chingTsui 2003年7月19日17:31
 RET指令必须与CALL指令共用。。。
  
8楼:avant 2003年7月19日19:12
 看你的语言是51系列,ACALL和RET也不一定必须配合使用,看情况而定,要是MOV SP,#xxxxH又可以达到跳转功能
  
9楼:guest 2003年7月19日22:24
 回复
可能是你的程序的散转长度超出了AJMP的散转范围吧?
  
10楼:zizzfish 2003年7月21日08:31
 我的看法!
1、编译可以通过,那么AJMP是不会有问题,否则编译时会提示错误。
2、你在调用子程序AJMP那么你就不能用RET返回主程序。而也应该用AIMP跳转。
3、你就好不要用MOV SP,#XXXXH,除非你汇编高手中的高手,否则不要破坏程序的结构。
  
11楼:carryonli 2003年7月22日17:40
 非常感谢大家,问题我找到了,就是跳转的问
非常感谢大家,问题我找到了,就是跳转的问题,acall命令应该与ret配合使用,匆忙之中犯了低级错误,给大家舔麻烦了。:)

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

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


[上一篇主题]:请教各位ARM学习应从什么地方入手,看些什么基础书,网上哪能下载?

[下一篇主题]:[求助]大家看看这个延时程序