Ошибка сегментации, когда STR в область памяти, указанную меткой в ​​сборке ARM - PullRequest
1 голос
/ 23 февраля 2020

Это всего лишь второй день моего обучения сборке 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

1 Ответ

1 голос
/ 23 февраля 2020

Ошибка сегментации происходит из-за того, что 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 нельзя использовать для обозначения метки в другом разделе, так как он может сломаться.

...