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。
问题是你没有保存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 来进行字节存储。