Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在asm中调用函数时出现SEGFULT_Linux_Assembly_Segmentation Fault_Arm - Fatal编程技术网

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
汇编+链接到二进制文件中。