2016-08-30 43 views
0

當程序在程序開始時輸入_start例程時,堆棧指針是否在16字節邊界對齊,或者應該手動對齊到該邊界?我的意思是它在_start之前的序幕(push rbp; mov rbp, rsp)之前對齊? 我知道,在程序開始處的x64處,RSP被對齊到8個字節,但現在知道它是否在16字節邊界上對齊。對於某些任務,我可能需要這種對齊方式才能正確執行需要在16字節邊界上對齊的SSE指令。是在進入_start後rsp是否對齊

+2

您的'_start'不應該使用該序言,因爲它不是一個函數。這是你的入口點,'rbp'沒有一個有意義的值,'[rsp]'的值不是一個返回地址(它是argc)。如果你願意,你可以運行'mov rbp,rsp'來引用argc,argv和環境變量。 –

回答

2

x86-64 ABI明確地說,(3.4.1初始堆棧和寄存器狀態):

%rsp堆棧指針持有字節與最低 地址的地址是堆棧的一部分。它保證在進程入口處對齊16字節的 。

由於_start是進入一個進程時被稱爲第一個符號,你可以完全肯定,這是當操作系統在你的可執行文件調用_start排列的16個字節。

+2

在動態鏈接的二進制文件中,'ld.so'代碼實際上是在您的進程中運行的第一件事,但您可以依靠它保持堆棧16B對齊。它會在ABI指定的狀態下跳轉到您的進程的入口點。 (請注意,大多數寄存器實際上在這一點上確實存在垃圾,而不是像Linux一樣將它們置零以防止信息泄漏)。看到[這個答案](http://stackoverflow.com/questions/36861903/assembling-32-bit-binaries-on-a-64-bit-system-gnu-toolchain/36901649#36901649)更多關於建設靜態或沒有CRT啓動文件的動態二進制文件。 –

+0

@Daniel,主要功能呢?如果它是16字節對齊,我應該使用prologue(_push rbp; mov rbp,rsp_)嗎?(這將使16字節對齊降級到8字節對齊) –

+1

@BulatM。 :你根本不需要使用這個序言。你可以完全忽略它,或者只是'sub rsp,16; mov [rsp],rbp; mov rbp,rsp',如果你真的認爲你需要一個「基址指針」。 –

相關問題