ARM汇编LDR/LDRB指令无法从指定地址加载值问题求助
ARM汇编LDRB指令失效及编译警告问题解决方案
指令执行异常问题原因
你出现LDRB执行后目标寄存器无变化的核心原因是混淆了寄存器存储值与内存地址的概念:LDRB/LDR属于内存访问指令,LDRB r6, [r1]的含义是:将r1寄存器中存储的数值作为内存地址,到该内存地址读取1字节数据存入r6。你当前r1中存储的是0x2A078CE2这个立即数本身,并非指向可读写内存段的合法地址,访问该地址无法得到有效数据,因此r6始终保持初始值0,即使替换为LDR指令也会因为同一个原因失效。
正确实现代码
要提取寄存器内部的指定字节,需要使用位运算+移位操作实现,符合你需求的代码如下:
@ 加载预设立即数到r1~r4 LDR r1, =0x2A078CE2 LDR r2, =0x0C82B182 LDR r3, =0x9F46452E LDR r4, =0x31F1D1B9 @ 逐字节提取合并到目标寄存器r0 AND r0, r1, #0xFF @ 提取r1第0字节(bit0~bit7) AND r6, r2, #0xFF00 @ 提取r2第1字节(bit8~bit15) ORR r0, r0, r6, LSR #8 @ 移位后合并到r0对应位置 AND r6, r3, #0xFF0000 @ 提取r3第2字节(bit16~bit23) ORR r0, r0, r6, LSR #16 AND r6, r4, #0xFF000000 @ 提取r4第3字节(bit24~bit31) ORR r0, r0, r6, LSR #24 stop B stop .end
A1581W警告说明
该警告是汇编器检测到当前代码段地址不符合指令对齐要求,自动添加了2字节的填充内容保证后续指令地址对齐。ARM架构下32位指令要求4字节对齐,Thumb指令要求2字节对齐,该自动填充操作不会影响程序正常运行。如果需要消除警告,可以在代码段入口位置添加.align 2伪指令强制4字节对齐。
内容的提问来源于stack exchange,提问作者turkishjedi21
相关产品推荐
相关产品推荐

