ARM GNU汇编STR指令无法写入内存,如何设置.data段可写?
问题原因
你遇到的.data段不可写问题本质是两个配置错误导致的:
- 你当前将
0x4000地址作为写入目标,这个地址属于QEMU挂载的pflash(并行闪存)范围,闪存默认是只读属性,直接执行STR指令无法修改闪存内容 - 链接配置没有区分只读代码区(Flash)和可写数据区(RAM),将
.data段直接放在了Flash的地址范围内
解决步骤
1. 确认开发板存储映射
你使用的connex是基于PXA255的开发板,默认存储映射如下:
- 只读Flash区:起始地址
0x00000000,最大16MB,你编译出的flash.bin就挂载在这个区域 - 可写RAM区:起始地址
0xa0000000,最大64MB,所有可读写数据都要放在这个地址区间
2. 修改汇编代码的目标地址
把你汇编代码里的RAM地址修改为可写的RAM区间:
.text .equ ram_address,0xa0000000 ; 改为RAM起始地址 .equ pattern,0x55 .equ counter,50 mov r0,#pattern mov r1,#counter mov r2,#ram_address back: str r0,[r2] add r2,#4 subs r1,r1,#1 bne back here: b here .data i: .word 0xffffffff
3. 修改Makefile的链接配置
调整链接参数,将.data和.bss段都放到可写RAM区间:
# 把原来的Link_Options替换成下面的配置 Link_Options=-Ttext=0x0 -Tdata=0xa0000000 -Tbss=0xa0001000
4. (可选)如果需要测试写入Flash
如果你的业务场景确实需要修改Flash内容,需要在QEMU启动命令里开启Flash可写权限,同时在汇编代码里先操作Flash控制器解锁,修改后的启动命令如下:
qemu-system-arm -S -M connex -drive if=pflash,file=flash.bin,format=raw,readonly=off -nographic -serial /dev/null
验证方法
重新编译后启动QEMU,在GDB里执行x/16xw 0xa0000000,可以看到连续50个地址都被写入了0x00000055,说明写入成功。
内容的提问来源于stack exchange,提问作者peyman khalili
相关产品推荐
相关产品推荐

