最近在寫一些字符串函數的優化,用到x64匯編,我也是第一次接觸,故跟大家分享一下。
x86:又名 x32 ,表示 Intel x86 架構,即 Intel 的32位 80386 匯編指令集。
x64:表示 AMD64 和 Intel 的 EM64T ,而不包括 IA64 。至於三者間的區別,可自行搜索。
x64 跟 x86 相比寄存器的變化,如圖:
從圖上可以看到,X64架構相對於X86架構的主要變化,是將原來所有的寄存器都擴大了一倍,例如EAX現在擴充成RAX,同時,又新增加了從R8~R15這8個64位的寄位器,有點RISC的味道(RISC特點就是寄存器多)。
然後還有下面的一些改變:
一些其他要注意的小問題:
遺留問題
以上都是關於 Windows 上的調用約定,即 Visual Studio 上使用的調用約定,至於 GCC 的函數調用約定是否一致,還不清楚,有知道的請指點一下,我從 asmlib 的64位匯編看,GCC 好像第一個參數用的是 rdi ,而不是 rcx 。
示例:
; 示例代碼 1.asm ; 語法:GoASM DATA SECTION text db 'Hello x64!', 0 caption db 'My First x64 Application', 0 CODE SECTION START: sub rsp, 28h ; 堆棧預留 shadow space (40 + 8)字節 xor r9d, r9d ; r9 lea r8, caption ; r8 lea rdx, text ; rdx xor rcx, rcx ; rcx call MessageBoxA add rsp, 28h ; 調用者自己恢復堆棧 ret
參考文章
Windows平台X64函數調用約定與匯編代碼分析 | http://kelvinh.github.io/blog/2013/08/05/windows-x64-calling-conventions/
x64 參數傳遞 | http://hyperiris.blog.163.com/blog/static/1808400592011715111957863/
Windows X64匯編入門(1) | http://wenku.baidu.com/view/3093d52d453610661ed9f4b0.html