Assembly ARM上my Hello World应用程序中的分段错误 .global main .对齐2 helloworld: .asciz“你好,世界” .文本 主要内容: ldr r0,=helloworld bl看跌期权 mov r7#1 bx-lr

Assembly ARM上my Hello World应用程序中的分段错误 .global main .对齐2 helloworld: .asciz“你好,世界” .文本 主要内容: ldr r0,=helloworld bl看跌期权 mov r7#1 bx-lr,assembly,arm,Assembly,Arm,我必须在我的程序中使用“bl puts”命令,当我运行程序时,输出是 Hello World之后是一个分段错误,我不知道我做错了什么。正如Peter Cordes指出的那样,您的lr寄存器已被puts调用覆盖。因此,程序跳转到lr所在的位置,并一直执行,直到它到达不属于它的内存,它可能会立即执行。此时,操作系统会收到通知,并终止您的程序,给您一个segfault。put覆盖您的lr;您需要保存/恢复它。bx-lr是ARM功能返回的一种方式;请参见和链接的副本。它是指向链接寄存器中地址的间接跳转。

我必须在我的程序中使用“bl puts”命令,当我运行程序时,输出是
Hello World
之后是一个分段错误,我不知道我做错了什么。

正如Peter Cordes指出的那样,您的lr寄存器已被puts调用覆盖。因此,程序跳转到lr所在的位置,并一直执行,直到它到达不属于它的内存,它可能会立即执行。此时,操作系统会收到通知,并终止您的程序,给您一个segfault。

put
覆盖您的
lr
;您需要保存/恢复它。
bx-lr
是ARM功能返回的一种方式;请参见和链接的副本。它是指向链接寄存器中地址的间接跳转。如果
put
恢复了LR,因此它指向
bl
之后的指令,则会得到一个无限循环。(因此大概
本身与
pop{pr}
一起返回,将堆栈上保存的返回地址直接弹出到程序计数器中,而不是还原调用方的
lr
)。这里的实际问题是在
bl
覆盖它之前无法保存/恢复传入的LR。那么程序将返回哪个命令,因为我认为bx LR就是这样做的。是的,我认识Peter,很抱歉,我刚读到最后一条指令时错过了it@AlvinAlic:查看问题顶部的链接副本<代码>bx lr
直接跳到lr;您需要确保LR在执行时持有正确的返回地址。请看C编译器对调用其他函数的函数所做的操作