打印

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

[复制链接]
3916|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到内存中运行了?

使用特权

评论回复
5
jlass| | 2013-4-24 14:35 | 只看该作者
感觉不是bl和b的差别就是BX lr的使用不当。

使用特权

评论回复
6
阿南| | 2013-4-24 14:48 | 只看该作者
查下跳转的地址范围

使用特权

评论回复
7
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
我从没修改过,这一处的还是原来的

使用特权

评论回复
8
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地址,然后就执行啦这一句
:(

使用特权

评论回复
9
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地址,然后就执行啦这一句,后面的都差不多

使用特权

评论回复
10
bald| | 2013-4-25 12:27 | 只看该作者
查一下链接属性,一个位置固定的程序段不可能在flah 和 ram中同样运行,除非加载后使用了remap指令。

使用特权

评论回复
11
xinzha| | 2013-4-25 12:28 | 只看该作者
2012CMD 发表于 2013-4-24 12:58
是正常的,修改后在SDRAM地址用Jlink仿真也是正常的,就是下载到板子上运行不正常(nand nor都不正常),貌 ...

你把它们放在SDRAM中跑修改scatter或者链接器选项了吗?如果没有修改就能跑那就是问题,顺序执行的代码不涉及到跳转所以对链接地址不敏感,而如果有跳转的话,你的代码链接到SDRAM地址却在FLASH中执行,那就肯定跳不回来了。

使用特权

评论回复
12
2012CMD|  楼主 | 2013-4-25 13:48 | 只看该作者
xinzha 发表于 2013-4-25 12:28
你把它们放在SDRAM中跑修改scatter或者链接器选项了吗?如果没有修改就能跑那就是问题,顺序执行的代码不 ...

这个只是相对前面的地址的链接,应该不会吧,比如在nand启动时,在SRAM中的话跳转地址为0x0000这样的,而当复制完成跳到SDRAM之后,程序就变成了跳转到0x30000这样的,而如果nor的话不也是要把加载域搬移到执行域吗,同样的是在SDRAM??

使用特权

评论回复
13
2012CMD|  楼主 | 2013-4-25 13:48 | 只看该作者
bald 发表于 2013-4-25 12:27
查一下链接属性,一个位置固定的程序段不可能在flah 和 ram中同样运行,除非加载后使用了remap指令。 ...

神马意思????看不懂

使用特权

评论回复
14
xinzha| | 2013-4-25 14:12 | 只看该作者
2012CMD 发表于 2013-4-25 13:48
这个只是相对前面的地址的链接,应该不会吧,比如在nand启动时,在SRAM中的话跳转地址为0x0000这样的,而 ...

你把二进制代码和flash的地址贴出来就能看出来是不是因为地址空间的问题了,我猜可能是这儿。

使用特权

评论回复
15
阿南| | 2013-4-25 14:32 | 只看该作者
从0x30000000执行能到实现lr为0x300000f8不代表0x0区也到实现到0x300000f8

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

80

帖子

0

粉丝