我开始学习在程序集中调用函数。我在网上看了很多教程,并做了一些修改。
但它并没有如预期的那样工作。
.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
我不知道我错在哪里。
最佳答案
对于函数调用,使用bl
(分支和链接)指令。这将设置lr
以包含返回地址。您的代码使用b
(branch)而不是bl
,因此未设置lr
,并且从println
返回到一个不可预知的地址,可能会导致程序崩溃。
要解决此问题,请对函数调用使用bl
而不是b
:
bl println
bl exit
关于linux - 在ASM中调用函数时出现SegFault,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55263305/