汇编中跳转到标号执行然后返回的问题

[复制链接]
4420|14
 楼主| 2012CMD 发表于 2013-4-23 22:21 | 显示全部楼层 |阅读模式
本帖最后由 2012CMD 于 2013-4-23 22:24 编辑


如图,一个原来已经编译好的运行正常的程序,为了好看,我将汇编启动代码中的每一步写成标号,然后在主程序中进行调用,使用BX lr返回,可是不知为什么:仿真是OK,但实际运行时却不对啦,不知怎么回事,

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
比如我修改后有这样一段:
    bl     disable_watch_dog
    bl     disable_intterrupt
    bl     cpu_clock_init
    bl     memsetup
    bl    initstacks

    bl boot_flash_select;检查启动方式并进行相应操作
   
    bl IRQ_setup        ;调用宏定义安装中断向量表
   
    b    Main            ;跳转到Main函数,此处可修改为除main外任何名称

;===========初始化:包括看门狗.中断.时钟.内存.堆栈=======================
disable_watch_dog
    ldr    r0,=WTCON      
    ldr    r1,=0x0
    str    r1,[r0]
    BX lr                ;返回

disable_intterrupt
    ldr    r0,=INTMSK
    ldr    r1,=0xffffffff  
    str    r1,[r0]

    ldr    r0,=INTSUBMSK
    ldr    r1,=0x7fff        
    str    r1,[r0]
    BX lr                ;返回
   
cpu_clock_init
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
汇编就懂几句,求各位大神看看这个究竟是什么问题,不这样调用直接顺序写下去是可以的,不知为啥这样调用就不行啦


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
阿南 发表于 2013-4-24 10:00 | 显示全部楼层
你把程序恢复到没改以前,重新编译下载进去看是否正常运行
 楼主| 2012CMD 发表于 2013-4-24 12:58 | 显示全部楼层
阿南 发表于 2013-4-24 10:00
你把程序恢复到没改以前,重新编译下载进去看是否正常运行

是正常的,修改后在SDRAM地址用Jlink仿真也是正常的,就是下载到板子上运行不正常(nand nor都不正常),貌似我的没错啊,BX lr就相当于MOV PC,LR就跳装会原来指令的吓一跳指令出啦,
LDTEST 发表于 2013-4-24 13:39 | 显示全部楼层
是不是 不管nand 还是nor 都 copy到内存中运行了?
jlass 发表于 2013-4-24 14:35 | 显示全部楼层
感觉不是bl和b的差别就是BX lr的使用不当。
阿南 发表于 2013-4-24 14:48 | 显示全部楼层
查下跳转的地址范围
 楼主| 2012CMD 发表于 2013-4-25 10:46 | 显示全部楼层
本帖最后由 2012CMD 于 2013-4-25 10:55 编辑
LDTEST 发表于 2013-4-24 13:39
是不是 不管nand 还是nor 都 copy到内存中运行了?

这个肯定木有,原来程序中的选择nand还是nor的这句        
bne        copy_proc_beg                ;do not read nand flash
adr        r0, ResetEntry                ;OM[1:0] == 0, NAND FLash boot
我从没修改过,这一处的还是原来的
 楼主| 2012CMD 发表于 2013-4-25 10:50 | 显示全部楼层
本帖最后由 2012CMD 于 2013-4-25 10:53 编辑
jlass 发表于 2013-4-24 14:35
感觉不是bl和b的差别就是BX lr的使用不当。

仿真也没看出来啊,比如执行bl disable_watchdog后lr为0x300000f8,跑完关狗程序后pc就为0x300000f8,也即 bl  disable_intterrupt地址,然后就执行啦这一句
:(
 楼主| 2012CMD 发表于 2013-4-25 10:51 | 显示全部楼层
本帖最后由 2012CMD 于 2013-4-25 10:53 编辑
阿南 发表于 2013-4-24 14:48
查下跳转的地址范围

跳转没有错,仿真时比如执行bl disable_watchdog后lr为0x300000f8,跑完关狗程序后pc就为0x300000f8,也即 bl  disable_intterrupt地址,然后就执行啦这一句,后面的都差不多
bald 发表于 2013-4-25 12:27 | 显示全部楼层
查一下链接属性,一个位置固定的程序段不可能在flah 和 ram中同样运行,除非加载后使用了remap指令。
xinzha 发表于 2013-4-25 12:28 | 显示全部楼层
2012CMD 发表于 2013-4-24 12:58
是正常的,修改后在SDRAM地址用Jlink仿真也是正常的,就是下载到板子上运行不正常(nand nor都不正常),貌 ...

你把它们放在SDRAM中跑修改scatter或者链接器选项了吗?如果没有修改就能跑那就是问题,顺序执行的代码不涉及到跳转所以对链接地址不敏感,而如果有跳转的话,你的代码链接到SDRAM地址却在FLASH中执行,那就肯定跳不回来了。
 楼主| 2012CMD 发表于 2013-4-25 13:48 | 显示全部楼层
xinzha 发表于 2013-4-25 12:28
你把它们放在SDRAM中跑修改scatter或者链接器选项了吗?如果没有修改就能跑那就是问题,顺序执行的代码不 ...

这个只是相对前面的地址的链接,应该不会吧,比如在nand启动时,在SRAM中的话跳转地址为0x0000这样的,而当复制完成跳到SDRAM之后,程序就变成了跳转到0x30000这样的,而如果nor的话不也是要把加载域搬移到执行域吗,同样的是在SDRAM??
 楼主| 2012CMD 发表于 2013-4-25 13:48 | 显示全部楼层
bald 发表于 2013-4-25 12:27
查一下链接属性,一个位置固定的程序段不可能在flah 和 ram中同样运行,除非加载后使用了remap指令。 ...

神马意思????看不懂
xinzha 发表于 2013-4-25 14:12 | 显示全部楼层
2012CMD 发表于 2013-4-25 13:48
这个只是相对前面的地址的链接,应该不会吧,比如在nand启动时,在SRAM中的话跳转地址为0x0000这样的,而 ...

你把二进制代码和flash的地址贴出来就能看出来是不是因为地址空间的问题了,我猜可能是这儿。
阿南 发表于 2013-4-25 14:32 | 显示全部楼层
从0x30000000执行能到实现lr为0x300000f8不代表0x0区也到实现到0x300000f8
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

80

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部