[英]Why Does Printf Work Only When I Store and Load These Registers? aarch64
我正在嘗試打印數組中的所有雙字。 但是,執行“分段錯誤”時出現錯誤。 在嘗試了這么多事情之后,我終於通過存儲和加載寄存器 x8、x9 和 x10 使其工作(我用許多寄存器進行了測試並不斷消除寄存器,直到程序與這三個一起工作,我不能錯過其中一個) )。
我不知道為什么我什至需要存儲和加載這些寄存器, printf 不應該這樣做嗎? 為什么 printf 甚至會把這些寄存器弄亂? 我很困惑,因為參數和返回寄存器是x0-x7。 如果 printf 使用其他寄存器,它應該存儲和加載。
這是我的代碼。 (這是 armv8 aarch64)
.text
.equ ELEM, 10
.extern printf
.global _start
_start:
.global selec_start
selec_start:
ldr x0, =stack
mov sp, x0
sub sp, sp, #16
ldr x8, =vec // address of vec (first element)
mov x9, #ELEM // index of last element in vec
sub x9, x9, #1
mov x10, #0 // increment i
print:
cmp x10, x9 // compare i with index of last element in vec
bgt end // branch to end if we hit end of loop
lsl x11, x10, #3 // multiply i by 8
add x12, x8, x11 // x12 = address of vec + i*8
// x12 is address of index i in vec
str x8, [sp, #-8]!
str x9, [sp, #-8]!
str x10, [sp, #-8]!
ldr x0, =string
ldr x1, [x12]
bl printf
ldr x10, [sp], #8
ldr x9, [sp], #8
ldr x8, [sp], #8
add x10, x10, #1 // i++
b print
end:
mov w8, #93
svc #0
.data
string:
.ascii "%d\n\0"
vec:
.quad 1,2,3,4,5,6,7,8,9,10
.bss
.align 8
.space 4096
stack:
.space 16
.end
x8、x9 和 x10 都是 AARCH64 上的調用者保存寄存器,因此如果您關心其中的值,則需要在任何函數調用(例如對 printf)周圍保存和恢復它們,因為被調用的函數可能會破壞它們.
只有 x19-x29 和 x31 (sp) 是被調用者保存的,並且將(必須)被任何函數調用保留。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.