qemu 中模拟的 ARM 汇编程序在尝试写入有效内存地址时抛出段错误

ARM assembly program emulated in qemu throws segfault when trying to write to a valid memory address

我正在尝试模拟一个小型 ARM 汇编程序:

.equ _STACK_SIZE,  64

.align 4
_stack_start:
    .fill _STACK_SIZE, 1, 0
_stack_end:

.text
.global _start
_start:
    ldr     r0, =0x101
    ldr     r1, =0x102
    ldr     r0, =_stack_start
    str     r1, [r0]
    push    {r0,r1}

这个程序正在抛出一个段。到达 str 行时出错。据我了解,该指令正在写入一个有效的内存区域,该内存区域已分配 .fill。另外,反汇编显示如下:


empty:     file format elf32-littlearm


Disassembly of section .text:

00008000 <_stack_start>:
    ...

00008040 <_start>:
    8040:   e59f0034    ldr r0, [pc, #52]   ; 807c <_start+0x3c>
    8044:   e59f1034    ldr r1, [pc, #52]   ; 8080 <_start+0x40>
    8048:   e59f0034    ldr r0, [pc, #52]   ; 8084 <_start+0x44>
    804c:   e5801000    str r1, [r0]

[...]

所以 _stack_start 实际上就在那里。 为什么那个内存区域无效?

正如@fuz 所解释的,我需要在 _stack_start:

之前添加 .data
.data
.align 4
_stack_start:
[...]