【发布时间】:2022-01-12 06:39:04
【问题描述】:
我想通过 STR 指令更改内存中的一些位。
.text
.equ ram_address,0x4000
.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
并使用这样的makefile:
TOOLCHAIN=arm-none-eabi
Assembler=${TOOLCHAIN}-as
Linker=${TOOLCHAIN}-ld
Objcpy=${TOOLCHAIN}-objcopy
Compile_Options= -g
Link_Options=-Ttext=0x0 -Tbss=0x4000 # -Tdata=0x4000 #
.PHONY : clean
.PRECIOUS : %.bin %.elf %.o
all : create
create : flash.bin
flash.bin:main.bin
dd if=/dev/zero of=flash.bin bs=4096 count=4096
dd if=main.bin of=flash.bin bs=4096 conv=notrunc
%.bin:%.elf
$(Objcpy) -O binary $< $@
%.elf:%.o
$(Linker) $(Link_Options) -o $@ $<
%.o:%.S
$(Assembler) $(Compile_Options) $< -o $@
clean :
rm -f *.o *.bin *.elf
这是 qemu 命令:
qemu-system-arm -S -M connex -pflash flash.bin -nographic -serial /dev/null
QEMU 模拟器版本 6.1.0
我通过 qemu-arm-system 和 gdbserver 以及x/16xw 0x4000 命令检查内存。结果是:
0xffffffff 0x00000000 0x00000000 0x00000000
这意味着 .data 部分是只读的。我怎样才能将其设置为可写?
【问题讨论】:
-
您的入口点在哪里?如果是
start,那么为什么它在你的数据部分,为什么没有从那里到你的循环的分支? -
@Michael 我只是删除数据部分(不需要)。它是一样的。
-
在调试器中单步执行代码时会看到什么?如果
start:现在位于.text部分中的代码之后,那么它仍然不会执行。 -
你确定你的模拟机器实际上在地址 0x4000 有 RAM 吗?你能用 QEMU 监视器检查吗?
-
你没有说你的 QEMU 命令行是什么,或者你正在使用什么 QEMU 版本。我同意迈克尔的观点,可能的原因是 0x4000 要么什么都没有,要么是 ROM/flash。您需要设置链接器映射以匹配您正在运行的任何(模拟)硬件。
标签: arm gdb qemu gnu-assembler gnu-arm