我覺得這是一個簡單的問題,但到目前為止,我無法在互聯網上的任何地方或我的任何教科書或課堂上的幻燈片中找到它。我有一個專案,如果不先創建一個陣列就無法開始,所以我只是問如何翻譯
詮釋 A[10];
(A[10] 當然是一個大小為 10 的陣列)
進入 Armv8 匯編代碼
編輯:老實說,我不明白回答我的問題的問題,如果有幫助,它正在 DS-5 中編譯
uj5u.com熱心網友回復:
對于堆疊上的本地陣列,它與其他架構幾乎相同。只需減去堆疊指標并將您的值存盤在那里。
For int a[10],sub sp, sp, #48將在堆疊上分配您的陣列。正如 Nate Eldredge 在評論中提到的那樣,ARMv8 需要硬體的 16 位元組堆疊對齊,因此您不能撰寫sub sp, sp, #40. 您可以存盤一些值,例如str r, [sp]for*a = r和str r, [sp, #4]fora[1] = r等。
對于全域陣列,只需在其中定義一個符號.bss并為其分配足夠的空間。
.bss
a:
.zero 40
這將分配一個具有 10 個 32 位int的全域陣列。
這樣的全域陣列屬于可執行檔案中的某個部分。您可以使用自定義讀寫可執行質量制作您喜歡的任何部分,但通常,非零初始化的可修改資料位于該.data部分中,而可修改的全零資料位于該.bss部分中。有關基本詳細資訊,請參見此處。
您可以隨時查看Godbolt以了解 C 中的每個陳述句是如何轉換為匯編的。檢查有無優化,兩者都會給你不同的有趣資訊。
例如,下面是 Clang with 如何用-O3C 翻譯這個簡單的代碼。
int a[10];
void f() {
a[1] = 2;
}
void g() {
volatile int b[10];
b[3] = 4;
}
/*
.text
f:
adrp x8, a 4
mov w9, #2
str w9, [x8, :lo12:a 4]
ret
g:
sub sp, sp, #16
mov w8, #4
str w8, [sp, #12]
add sp, sp, #16
ret
.bss
a:
.zero 40
*/
Godbolt with directives not filtered so the section switching is visible. (The block above has directives filtered out, except for .section directives.)
See how a local array and a global array are allocated and accessed differently. I believe now you have more specific questions in case you still have a problem.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/437327.html
上一篇:使用makefile構建.S檔案與.s檔案的方式有什么不同嗎?
下一篇:如何通過BIOS中斷獲取特殊密鑰
