SegFault при вызове функции в asm - PullRequest
1 голос
/ 20 марта 2019

Я начал учиться вызывать функцию в сборке.Я следовал многому учебнику в Интернете и внес в него некоторые изменения.

Но на самом деле он работает не так, как ожидалось.

.data
 hello:  .ascii "hello everyone\n"
 len= . - hello
 .text

.global _start

exit:
       mov %r1,#0
       mov %r2,#0
       mov %r0, #0
       mov %r7, #1
       swi #0

println:
        mov %r7, #4
        swi #0
        mov %pc, %lr
        bx %r7
_start:
        ldr %r1, =hello
        ldr %r2, =len
        b println
        b exit

и вывод идет

hello everyone
Segmentation fault

Я не знаю, где я был не прав.

1 Ответ

2 голосов
/ 20 марта 2019

Для вызовов функций используйте инструкцию bl (ветвь и ссылка).Это устанавливает lr для хранения обратного адреса.В вашем коде используется b (ветвь), а не bl, поэтому lr не настроен, и возврат из println идет по непредсказуемому адресу, что может привести к сбою вашей программы.

Чтобы это исправить,используйте bl вместо b для вызовов функций:

    bl println
    bl exit
...