首页 > 解决方案 > 在 qemu 中模拟的 ARM 汇编程序在尝试写入有效内存地址时抛出段错误

问题描述

我有一个要模拟的小型 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实际上也是如此。为什么该内存区域无效?

标签: assemblymemorysegmentation-faultarmqemu

解决方案


正如@fuz 所解释的,我需要在.data之前添加_stack_start

.data
.align 4
_stack_start:
[...]

推荐阅读