ARM汇编MOV指令编译报错:RVDS6_13编译Cortex X1代码出现A1616E错误
错误原因
- 第一个编译报错来自
MOV x28,0xD02E7F30:AArch64架构的通用MOV指令仅支持最多16位的无符号立即数,或可通过左移16/32/48位得到的16位立即数,0xD02E7F30是32位随机值,不符合MOV的立即数编码规则,因此触发A1616E错误。 - 原有代码第二行
STR x28,0xB41138A4存在语法错误:AArch64的STR存储指令不支持直接使用立即数作为目标内存地址,必须先将地址加载到通用寄存器,通过寄存器间接寻址完成内存写入。
修复方案
以下两种方案均可在RVDS6_13编译器下正常编译,适配Cortex X1处理器:
方案1:使用LDR伪指令(代码更简洁)
编译器会自动将常量放入文字池,通过PC相对寻址完成加载,不需要手动拆分立即数:
; 加载目标内存地址0xD02E7F30到x28寄存器 LDR x28, =0xD02E7F30 ; 加载待写入的32位值0xB41138A4到w0寄存器 LDR w0, =0xB41138A4 ; 将w0的值写入x28指向的内存地址 STR w0, [x28]
如果需要写入64位值,将w0替换为x0即可。
方案2:使用MOVZ+MOVK手动拼接立即数(无文字池依赖)
适合对代码段位置有严格要求,不需要额外文字池的场景:
; 拆分加载地址0xD02E7F30到x28:低16位0x7F30,高16位0xD02E左移16位 MOVZ x28, #0x7F30 MOVK x28, #0xD02E, LSL #16 ; 拆分加载待写入值0xB41138A4到w0:低16位0x38A4,高16位0xB411左移16位 MOVZ w0, #0x38A4 MOVK w0, #0xB411, LSL #16 ; 写入内存 STR w0, [x28]
内容的提问来源于stack exchange,提问作者user3565150
相关产品推荐
相关产品推荐

