簡體   English   中英

為什么 Printf 僅在我存儲和加載這些寄存器時才起作用? aarch64

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM