当STR到ARM程序集中标签所指向的内存位置时出现分段错误

问题描述 投票:1回答:1

这只是我学习ARM汇编的第二天,我陷入了STR出现分段错误的问题。

@P = Q+R+S
@Q=2, R=4, S=5

.global main
main:
    adrl r4,vals
    ldr r1,[r4,#Q] @load Q=2 into r1
    ldr r2,[r4,#R]
    ldr r3,[r4,#S]
    add r0,r1,r2
    add r0,r0,r3
    str r0,[r4,#P]
    mov r7,#1
    svc 0

.equ P,0
.equ Q,4
.equ R,8
.equ S,12

vals:   .space 4
    .word 2
    .word 4
    .word 5
    .align
    .end

有人可以帮忙,为什么会崩溃?

编辑

我将变量添加到数据部分。

@P = Q+R+S
@Q=2, R=4, S=5
.data
vals:   .space 4
    .word 2
    .word 4
    .word 5
    .align

.text
.global main
main:
    adrl r4,vals
    ldr r1,[r4,#Q] @load Q=2 into r1
    ldr r2,[r4,#R]
    ldr r3,[r4,#S]
    add r0,r1,r2
    add r0,r0,r3
    @str r0,[r4,#P]
    mov r7,#1
    svc 0

.equ P,0
.equ Q,4
.equ R,8
.equ S,12
.end

如下所示进行编译和链接:

$ as -o main.o main.s
main.s: Assembler messages:
main.s:13: Error: symbol .data is in a different section
assembly arm gnu
1个回答
1
投票
发生分段错误是因为vals默认情况下被组装到文本部分中,因此变得不可写。

解决方案是在数据部分中定义如下所示的vals

@P = Q+R+S @Q=2, R=4, S=5 .data vals: .space 4 .word 2 .word 4 .word 5 .align .text .global main main: ldr r4,=vals ldr r1,[r4,#Q] @load Q=2 into r1 ldr r2,[r4,#R] ldr r3,[r4,#S] add r0,r1,r2 add r0,r0,r3 @str r0,[r4,#P] mov r7,#1 svc 0 .equ P,0 .equ Q,4 .equ R,8 .equ S,12 .end

也将adrl r4,vals替换为ldr r4,=vals,因为adrl不能用于引用不同部分中的标签,因为它可能会损坏。
© www.soinside.com 2019 - 2024. All rights reserved.