You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:06:04