ARM 汇编函数有问题吗?

Kri*_*oks 1 linux assembly arm

我有一个用 ARM 汇编器编写的简单函数。第一次运行时,一切都按预期工作(打印BOOT\n)。然而,第二次执行该函数时,没有打印任何内容。

.globl __printTest
.text
.align 2

__printTest:
 sub sp, #64 /* yes, I know this is too much */

 mov r0, #66
 str r0, [sp]
 mov r0, #79
 str r0, [sp, #1]
 mov r0, #79
 str r0, [sp, #2]
 mov r0, #84
 str r0, [sp, #3]
 mov r0, #10
 str r0, [sp, #4]

 mov r0, #0
 mov r1, sp
 mov r2, #5

 bl _write
 add sp, #64

 bx lr
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?我怀疑这不知何故搞砸了缓冲区,使它不再起作用。Write是一个write使用指令调用Linux上系统调用的函数svc

Nic*_*rth 5

问题是你没有保存lr

     bl _write
     add sp, #64
     bx lr
Run Code Online (Sandbox Code Playgroud)

bl _write将覆盖lrthen 指向的内容add sp, #64,因此您bx lr将导致最后两条指令陷入无限循环。

如果您像这样修改代码,它应该可以工作:

__printTest:
 push {lr}
 sub sp, #64 /* yes, I know this is too much */
 ....
 bl _write
 add sp, #64
 pop {pc}
Run Code Online (Sandbox Code Playgroud)

正如另一个答案中已经指出的,您还应该使用 strb 而不是 str 来进行字节存储。