使用ARM Assembly写入内存时出现问题。
我正在使用Raspberry Pi(Raspbian)并使用GNU Assembler。
first.s:
.global main
.func main
main:
ldr r5, =0x10000000
mov r1, #19
str r1, [r5]
bx lr
当我运行以上内容时:
pi@raspberrypi ~/assembly $ make first
as -o first.o first.s
gcc -o first first.o
pi@raspberrypi ~/assembly $ ./first ; echo $? > output.txt
Segmentation fault
如您所见,分段错误。 output.txt文件保存值139,我理解这是指分段错误。 内存地址无效吗? 我已经检查了datasheet和内存地址SEEMS。
答案 0 :(得分:0)
存储空间有几种不同的“类型”。例如,在Windows系统上,有未提交,保留,只读,可执行等。写入未标记为“保留”的内存的任何部分,或者未指向有效内存地址的地址,导致seg故障。这是大多数现代系统的关键安全功能。我的猜测是你需要在写入内存之前保留内存才能成功完成。
在汇编中保留内存的最简单方法是创建数据段。在许多汇编语言中,数据段由.data继续,但我在很长一段时间内没有使用ARM汇编来验证。一旦在数据段中保留了一些内存,就可以轻松获取“变量”的地址并像在示例中一样写入它。