C调用ARM汇编触发A1114E: Expected register relative expression报错含义咨询
错误原因分析
- 核心触发点是你标注的
LDR R1, R0行存在指令语法错误:ARM架构中LDR是专门用于内存读取的指令,仅支持从内存地址加载数据到寄存器,合法用法为LDR 目标寄存器, [内存地址寄存器],不支持两个通用寄存器直接作为操作数的写法。如果要实现寄存器之间的数值拷贝,应当使用MOV指令。 - 代码存在不必要的冗余操作:按照ARM平台的C语言调用约定(AAPCS),函数的第一个入参默认存放在
R0寄存器中,你的in_word函数的入参就是要读取的内存地址,本身已经在R0里了,不需要额外转存到其他寄存器。同时R0-R3属于调用者负责保存的寄存器,子函数内使用不需要手动压栈、弹栈,你写的PUSH {R1-R7}和对应POP操作属于多余逻辑。
修复方案
修正后的汇编代码
PRESERVE8 AREA myCode, CODE, READONLY EXPORT in_word EXPORT out_word in_word LDR R0, [R0] ; 直接读取R0指向的内存值,作为返回值存回R0 BX LR out_word STR R1, [R0] ; 原逻辑正确:将R1的入参值写入R0存的目标地址 BX LR END
逻辑说明
C语言调用汇编函数时,返回值默认通过R0传递。修正后的in_word直接将入参R0作为内存地址,读取对应位置的值存回R0,刚好符合返回uint32_t类型的需求,逻辑简洁没有冗余操作。你的C代码不需要做任何修改,直接替换汇编代码即可正常运行。
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

