我正在嘗試列印陣列中的所有雙字。但是,執行“分段錯誤”時出現錯誤。在嘗試了這么多事情之后,我終于通過存盤和加載暫存器 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
uj5u.com熱心網友回復:
x8、x9 和 x10 都是AARCH64 上的呼叫者保存暫存器,因此如果您關心其中的值,則需要在任何函式呼叫(例如對 printf)周圍保存和恢復它們,因為被呼叫的函式可能會破壞它們.
只有 x19-x29 和 x31 (sp) 是被呼叫者保存的,并且將(必須)被任何函式呼叫保留。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/347744.html
