在解释我的问题之前,这是我的代码:
顺便说一下,我是ARM的新手,所以我是一个超级新手。现在,我只是删除了代码中不必要的部分。 x0 - x7是“参数”寄存器,x29是帧指针,x30是链接寄存器。 x19和x20只是被调用者保存的寄存器。
string1: .string "constant = %d low value = %d \n\n"
string2: .string "constant = %d \n"
.balign 4
.global main
main: stp x29, x30, [sp, -16]!
mov x29, sp
mov x20, -1000 // Setting values
mov x19, 5
print: adrp x0, string1
add x0, x0, :lo12:string1
mov x1, x19
mov x2, x20
bl printf
print2: adrp x0, string2
add x0, x0, :lo12:string2
mov x3, x19
bl printf
done: mov x0, 0
end: ldp x29, x30, [sp], 16
ret
现在由于某种原因,在“打印”期间,它打印出“常量= 5”就好了。然而,当它进入“print2”时,它打印出“constant = 0”。发生了什么,为什么它不打印到5,即使我没有操纵寄存器x19呢?我不完全掌握这些是如何工作的。
结果:
constant = 5 low value = -1000
constant = 0
感谢
答案 0 :(得分:1)
如果要创建常规函数,与在主代码部分的主体中插入此类函数相比,这里有一些代码来填充ARMv8泵。我的.include只适用于我的宏(即push2& pop2等);这与您使用的代码相同。
.data
string1: .string "constant = %d low value = %d\n\n"
string2: .string "constant = %d \n"
.text
.global main
.include "mymac_armv8.s" // for push2, pop2, and _exit macros
main:
movn x20, 1000
mov x19, 5
bl write1
bl write2
_exit
write1:
push2 x29, x30
push2 x1, x2
ldr x0,=string1
mov x1, x19
mov x2, x20
bl printf
pop2 x1, x2
pop2 x29, x30
ret
write2:
push2 x29, x30
push2 x1, x2
ldr x0,=string2
mov x1, x19
mov x2, x20
bl printf
pop2 x1, x2
pop2 x29, x30
ret