linux中x64和x86的區(qū)別其實有很多,比如在寄存器和匯編指令等,接下來,我們來重點講解一下linux中x64和x86的區(qū)別有哪些?
1:寄存器分配的不同
(1)64位有16個寄存器,32位只有8個。但是32位前8個都有不同的命名,分別是e _ ,而64位前8個使用了r代替e,也就是r _。e開頭的寄存器命名依然可以直接運用于相應寄存器的低32位,而剩下的寄存器名則是從r8 - r15,其低位分別用d、w、b指定長度;
(2)32位使用棧幀來作為傳遞的參數(shù)的保存位置,而64位使用寄存器,分別用rdi,rsi,rdx,rcx,r8,r9作為第1-6個參數(shù),rax作為返回值;
(3)64位沒有棧幀的指針,32位用ebp作為棧幀指針,64位取消了這個設定,rbp作為通用寄存器使用;
(4)64位支持一些形式的以PC相關的尋址,而32位只有在jmp的時候才會用到這種尋址方式;
2:(新增)匯編指令的不同
mov、push、pop擴展了movq系列的mov和pushq以及popq用來操作quad word。
3:函數(shù)調用的不同
(1)x_64的參數(shù)通過寄存器傳遞(見前文);
callq 在棧里存放一個8位的返回地址;
(2)許多函數(shù)不再有棧幀,只有無法將所有本地變量放在寄存器里的才會在棧上分配空間;
(3)函數(shù)可以獲取到棧至多128字節(jié)的空間。這樣函數(shù)就可以在不更改棧指針的情況下在棧上存儲信息(也就是說,可以提前用rsp以下的128字節(jié)空間,這段空間被稱為red zone,在x86-64里,時刻可用);
(4)不再有棧幀指針,現(xiàn)在棧的位置和棧指針相關。大多數(shù)函數(shù)在調用的一開始就分配全部所需??臻g,之后保持棧指針不改變;
(5)一些寄存器被設計成為被調用者-存儲的寄存器,這些必須在需要改變他們值的時候存儲他們并且之后恢復他們。
4:參數(shù)傳遞的不同
(1)6個寄存器用來傳遞參數(shù)(見前文);
(2)剩下的寄存器按照之前的方式傳遞(不過是與rsp相關了,ebp不再作為棧幀指針,并且從rsp開始第7個參數(shù),rsp+8開始第8個,以此類推);
(3)調用時,rsp向下移動8位(存入返回地址),寄存器參數(shù)無影響,第7個及之后的參數(shù)現(xiàn)在則是從rsp+8開始第7個,rsp+16開始第8個,以此類推;
5:棧幀的不同
很多情況下不再需要棧幀,比如在沒有調用別的函數(shù),且寄存器足以存儲參數(shù),那么就只需要存儲返回地址即可。
需要棧幀的情況:
(1)本地變量太多,寄存器不夠;
(2)一些本地變量是數(shù)組或結構體;
(3)函數(shù)使用了取地址操作符來計算一個本地變量的地址;
(4)函數(shù)必須用棧傳送一些參數(shù)給另外一個函數(shù);
(5)函數(shù)需要保存一些由被調用者存儲的寄存器的狀態(tài)(以便于恢復);
但是現(xiàn)在的棧幀經(jīng)常是固定大小的,在函數(shù)調用的最開始就被設定,在整個調用期間,棧頂指針保持不變,這樣就可以通過對其再加上偏移量來對相應的值進行操作,于是EBP就不再需要作為棧幀指針了。雖然很多時候我們認為沒有“棧幀”,但是每次函數(shù)調用都一定有一個返回地址被壓棧,我們可以也認為這一個地址就是一個“棧幀”,因為它也保存了調用者的狀態(tài)。
6:運算速度不同
64位cpu的數(shù)據(jù)寬度為64位,64位指令集可以運行64位數(shù)據(jù)指令,也就是說處理器一次可提取64位數(shù)據(jù),比32位提高了一倍,理論上性能會相應提升1倍。
以上就是對linux中x64和x86的區(qū)別有哪些?區(qū)別對比的全部介紹,如果您想了解更多有關其他常見問題,請及時關注我們。