據我了解,“資料”部分中的某些物件有時需要在 x86 程式集中對齊。
我遇到的一個例子是movaps在 x86 SSE 中使用時:我需要將一個特殊的常量加載xor到XMM暫存器中。
該XMM暫存器為 128 位寬,我需要將一個 128 位長的記憶體位置加載到其中,該位置也將按 128 位對齊。
通過反復試驗,我推斷出我正在尋找的代碼是:
section .text
_foo:
movaps xmm0, [xor_const] ; this is the loading part
xor eax, eax
ret
section .data
align 16 ; align to 16 bytes = 128 bits
xor_const: dd 80000000h, 80000000h, 80000000h, 80000000h ; the 128-bit constant
我的問題是:
- 我在哪些程式集風格中使用
.align而不是align? - 我需要在每個資料物件之前寫這個關鍵字/指令還是有辦法只寫一次?
- 我可以閱讀的相關檔案是什么?
- “對齊”是關鍵字還是指令(或者其他東西)?
uj5u.com熱心網友回復:
我在哪些程式集風格中使用 .align 而不是 align?
最值得注意的是 GNU 匯編器 (GAS) 使用.align,但每個匯編器都可以有自己的語法。您應該檢查您實際使用的任何匯編程式的手冊。
我需要在每個資料物件之前寫這個關鍵字/指令還是有辦法只寫一次?
如果您可以隨時跟蹤對齊情況,則無需在每個物件之前撰寫它。例如,在您的示例中,您撰寫align 16并組裝了 4 個雙字資料,即 16 個位元組。因此,在該資料之后,當前地址再次與 16 對齊,另一個align 16將是不必要的(盡管當然是無害的)。你可以寫類似的東西
align 16 ; align to 16 bytes = 128 bits
xor_const: dd 80000000h, 80000000h, 80000000h, 80000000h ; the 128-bit constant
another_const: dd 0deadbeef, 0deadbeefh, 0deadbeefh, 0deadbeefh
并確保它another_const也是 16 位元組對齊的。當然,如果您打錯了字,并且其中一個常量的位元組數比您的意思多或少,那么其他一切都會出錯,您的程式可能會嚴重崩潰 - 但也許這很好,因為您會更快地找到錯誤。
我可以閱讀的相關檔案是什么?
您正在使用的匯編程式的手冊。例如GAS 手冊、NASM 手冊等。
“對齊”是關鍵字還是指令(或者其他東西)?
它通常被稱為指令——影響匯編器行為的命令,但它本身不是機器指令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/365371.html
