打印
[ARM入门]

求助C语言调用ARM汇编程序返回的问题

[复制链接]
832|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liminbo|  楼主 | 2015-11-4 10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过c调用ARM9汇编子程序,汇编代码中奖mov pc,lr放到第一条执行时能返回调用程序:
.globl subroute
subroute:
        mov    pc, lr
但只要在mov pc,lr前加一条语句,就返回不了调用程序,死机:
.globl subroute
subroute:
        mov     r9,  r0
        mov    pc, lr

请问这是什么原因?

相关帖子

沙发
阿南| | 2015-11-4 13:59 | 只看该作者
这个需要单步跟踪进去看看,或是多加几条语句试试

使用特权

评论回复
板凳
liminbo|  楼主 | 2015-11-4 16:45 | 只看该作者
运行在目标板上,且运行在svc模式,无法进行单步跟踪。

奇怪的是那条mov R9,R0会改变lr的值么?有人碰到过这样的情况吗?

使用特权

评论回复
地板
阿南| | 2015-11-5 14:04 | 只看该作者
lr链接寄存器应该是R14,mov R9,R0不会修改的吧

使用特权

评论回复
5
阿南| | 2015-11-5 14:05 | 只看该作者
当调用一个函数时,返回地址被自动保存到lr链接寄存器

使用特权

评论回复
6
bald| | 2015-11-6 01:09 | 只看该作者
看一下ATPCS规则

使用特权

评论回复
7
ayb_ice| | 2015-11-6 08:01 | 只看该作者
本帖最后由 ayb_ice 于 2015-11-6 08:03 编辑
liminbo 发表于 2015-11-4 16:45
运行在目标板上,且运行在svc模式,无法进行单步跟踪。

奇怪的是那条mov R9,R0会改变lr的值么?有人碰到过 ...

有些寄存器是库用的,使用需要保存再恢复
这样试试
    mov r1,r9
    mov r9,r0
    mov r9,r1

    mov pc,lr

使用特权

评论回复
8
liminbo|  楼主 | 2015-11-6 09:06 | 只看该作者
ayb_ice 发表于 2015-11-6 08:01
有些寄存器是库用的,使用需要保存再恢复
这样试试
    mov r1,r9

很有可能是这样的原因,我避免使用r8以上的寄存器就可以正常返回了!手册上也没有任何说明啊!
谢谢!

使用特权

评论回复
9
john_lee| | 2015-11-6 09:23 | 只看该作者
这玩意的术语叫做“调用约定(calling convention)”,要在C和汇编之间互相调用,这东西是必须了解的。

使用特权

评论回复
10
阿南| | 2015-11-6 13:55 | 只看该作者
john_lee 发表于 2015-11-6 09:23
这玩意的术语叫做“调用约定(calling convention)”,要在C和汇编之间互相调用,这东西是必须了解的。 ...

学习了

使用特权

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

本版积分规则

3

主题

9

帖子

1

粉丝