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

[复制链接]
1471|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不会修改的吧
阿南 发表于 2015-11-5 14:05 | 显示全部楼层
当调用一个函数时,返回地址被自动保存到lr链接寄存器
bald 发表于 2015-11-6 01:09 | 显示全部楼层
看一下ATPCS规则
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
 楼主| liminbo 发表于 2015-11-6 09:06 | 显示全部楼层
ayb_ice 发表于 2015-11-6 08:01
有些寄存器是库用的,使用需要保存再恢复
这样试试
    mov r1,r9

很有可能是这样的原因,我避免使用r8以上的寄存器就可以正常返回了!手册上也没有任何说明啊!
谢谢!
john_lee 发表于 2015-11-6 09:23 | 显示全部楼层
这玩意的术语叫做“调用约定(calling convention)”,要在C和汇编之间互相调用,这东西是必须了解的。
阿南 发表于 2015-11-6 13:55 | 显示全部楼层
john_lee 发表于 2015-11-6 09:23
这玩意的术语叫做“调用约定(calling convention)”,要在C和汇编之间互相调用,这东西是必须了解的。 ...

学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

9

帖子

1

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