|
目前有一个AVR的汇编例程,BIN文件有8.5K,所用芯片型号是M88
程序编译后,出现诸多错误,超一百个了,但都是同一个问题,“realtive branch out of reach”即跳转超范围了。
查看了一下程序,大多出现在rcall指令上, 这个也是用的最多,函数间的调用。
在网上查,有人见意取消跳转超范围检测选项,不过这样做编译虽然不报错,但全出现在警告上,所以仍旧未解决本质上的问题。
因为手头上的例程还是比较多,我又查看了一个完整无误的例程,上面处理跳转超范围的方法是这样的:
比如:
L0001: //0001
......
. //00AB
......
L00FF: //00ff
......
L0CDF: //0cdf
......
Lxxxx后的注解表示该语句所在的位置,说是地址也一样。那如果L0001中要调用L0CDF,假设两函数的地址已经超出跳转范围了,所以如果
直接在L0001中用rcall L0CDF的话,那编译肯定要出现“realtive branch out of reach”的报错了,解决的正解方法可以这样:
(假定调用L0CDF所在的位置是00AB)
原来语名句是:rcall L0CDF 改成.dw 0XDC33 或者 .dw 0XCC33 就可解决
那么这个数是怎么算来的呢,细心的朋友可能已经猜测到,
其实就是 (目标位置-实际位置-1)+0xD000或0xC000 =》 (0x0CDF-0x00AB-1)+0XD000或0xC000=0XDC33或0xCC33.
至于到底是加0XD000还是0XC000,这样看前面有没有重复的值,如果说有两个调用算得差值都一样,一个加0XD000,一个加0XC000,以错开。
于是我将程序报错的地方都这样修改过后,果然好了。 而且仿真时我尝试着修改0XD000和0XC000,发现其它值都不行,不能跳转到指定函数的位置。
所以我的疑问也出来了,虽然现在是乎知道怎么改,却不明白为什么这样。还望高人指点!!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|