當程序在程序開始時輸入_start
例程時,堆棧指針是否在16字節邊界對齊,或者應該手動對齊到該邊界?我的意思是它在_start之前的序幕(push rbp; mov rbp, rsp
)之前對齊? 我知道,在程序開始處的x64處,RSP
被對齊到8個字節,但現在知道它是否在16字節邊界上對齊。對於某些任務,我可能需要這種對齊方式才能正確執行需要在16字節邊界上對齊的SSE
指令。是在進入_start後rsp是否對齊
回答
的x86-64 ABI明確地說,(3.4.1初始堆棧和寄存器狀態):
%rsp
堆棧指針持有字節與最低 地址的地址是堆棧的一部分。它保證在進程入口處對齊16字節的 。
由於_start
是進入一個進程時被稱爲第一個符號,你可以完全肯定,這是當操作系統在你的可執行文件調用_start
排列的16個字節。
在動態鏈接的二進制文件中,'ld.so'代碼實際上是在您的進程中運行的第一件事,但您可以依靠它保持堆棧16B對齊。它會在ABI指定的狀態下跳轉到您的進程的入口點。 (請注意,大多數寄存器實際上在這一點上確實存在垃圾,而不是像Linux一樣將它們置零以防止信息泄漏)。看到[這個答案](http://stackoverflow.com/questions/36861903/assembling-32-bit-binaries-on-a-64-bit-system-gnu-toolchain/36901649#36901649)更多關於建設靜態或沒有CRT啓動文件的動態二進制文件。 –
@Daniel,主要功能呢?如果它是16字節對齊,我應該使用prologue(_push rbp; mov rbp,rsp_)嗎?(這將使16字節對齊降級到8字節對齊) –
@BulatM。 :你根本不需要使用這個序言。你可以完全忽略它,或者只是'sub rsp,16; mov [rsp],rbp; mov rbp,rsp',如果你真的認爲你需要一個「基址指針」。 –
- 1. nasm:是否允許使用「global _start:」?
- 2. 如何對齊兩個JButtons是否對齊?
- 3. 是否可以對齊ListView的BackgroundImage?
- 4. ClojureBox是否支持自動對齊框?
- 5. 垂直對齊是否有「clearfix」?
- 6. 字對齊關鍵是否重要?
- 7. 對齊後對齊
- 8. 是否寫入受ssd 4k對齊影響的大塊?
- 9. 是否可以導入與像素對齊的Collada模型?
- 10. UIScrollView總是對齊
- 11. 爲什麼在_start之前調用glibc的csu/init-first.c中的_init,即使_start是ELF入口點?
- 12. movl $ _start,%eax是什麼意思?
- 13. 在bootstrap .pull-right右對齊.pull-left左對齊然後中心是什麼?
- 14. 它是左對齊還是右對齊數據?
- 15. 如何確定地址是否是字對齊的
- 16. 緊跟在另一個之後的對齊指令是否有任何影響?
- 17. 是否可以在WinForms消息框中左對齊(而不是中心對齊)連續行?
- 18. Android檢測應用程序是否進入後臺
- 19. 當應用程序進入後臺時,startAdvertisingPeer是否工作?
- 20. 是否可以對Android視頻輸出進行後期處理?
- 21. 在堆上分配的內存塊是否保證了對齊?
- 22. 是否可以在MySQL編輯器中保持對齊/列表?
- 23. 是否可以在SWT頂部對齊複選框
- 24. 是否有可能「居中」對齊數據字段在docusign
- 25. 如何檢查正在運行的進程是否是後臺進程?
- 26. 對齊標頭標記是
- 27. 爲什麼malloc覆蓋RSP和RSP + 8?
- 28. 檢測元素是否進入溢出
- 29. IE是否進入睡眠模式?
- 30. 在C++中進行對齊
您的'_start'不應該使用該序言,因爲它不是一個函數。這是你的入口點,'rbp'沒有一個有意義的值,'[rsp]'的值不是一個返回地址(它是argc)。如果你願意,你可以運行'mov rbp,rsp'來引用argc,argv和環境變量。 –