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:
[...]
我正在尝试模拟一个小型 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:
[...]