Linux 在asm中调用函数时出现SEGFULT
我开始学习在汇编中调用函数。我在网上学习了很多教程,并对其进行了一些修改 但它并没有像预期的那样真正起作用Linux 在asm中调用函数时出现SEGFULT,linux,assembly,segmentation-fault,arm,Linux,Assembly,Segmentation Fault,Arm,我开始学习在汇编中调用函数。我在网上学习了很多教程,并对其进行了一些修改 但它并没有像预期的那样真正起作用 .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
.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
(分支)而不是bl
,因此未设置lr
,从println
返回到不可预测的地址,可能会导致程序崩溃
要解决此问题,请对函数调用使用bl
而不是b
:
bl println
bl exit
这段代码是为什么平台编写的?@ThomasJager:32位ARM,带有Linux系统调用,从标记中可以看出。在寄存器名上使用
%
装饰符是不寻常的,但显然是受支持的:arm none-eabi gcc-nostdlib arm.s
汇编+链接到二进制文件中。