x86-64彙編學習小節

這兩天搞了本x86-64彙編的白皮書,還沒看完總結一下。

最主要的區別,除了大家都知道的位數擴展尋址空間增大外,就是通用寄存器從8個增加到16個。

多了r8~r15,不再用字母做名稱,改用數字了。

說真的,能想出ax,bx,cx,dx,而且每個都是有意義的英文字母的首縮寫還真是挺有想象力的。

x64雖然性能提升了,但是缺少了原來的浪漫氣質。

寄存器的數量增加導致了很多編程方法的變化。

一個是統一了調用方式,統一使用fastcall調用。拿出6個寄存器來做參數傳遞。多餘的再用stack。寄存器的選擇看起來是編譯器相關的。gcc的首參數是edi,而網上查vc的首參數是ecx,沒驗證,不知真假。

另外,對於相當一部分不需要太多局部空間的過程調用,完全可以省略建棧的步驟。只用寄存器提供空間即可。也就是說不再有

pushq %rbp

movl    %rsp %rbp

這兩個標誌性的函數入口代碼。當函數參數超過6的時候,通過8(%rsp)來引用第一個參數。因爲這時候

%rsp裏面的放的是函數返回地址所在棧地址。


另外,x64可以直接對pc寄存器進行引用,這真是一個巨大的改變。目前還沒看到這有多大用處。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章