久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

linux中x64和x86有哪些區(qū)別

共計(jì) 1845 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。

這篇文章主要為大家展示了“l(fā)inux 中 x64 和 x86 有哪些區(qū)別”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“l(fā)inux 中 x64 和 x86 有哪些區(qū)別”這篇文章吧。

區(qū)別:1、寄存器分配不同,x64 有 16 個(gè)寄存器,x86 只有 8 個(gè)寄存器;2、匯編指令不同;3、函數(shù)調(diào)用不同;4、參數(shù)傳遞不同;5、棧幀不同,x64 沒有棧幀的指針,而 x86 用 ebp 作為棧幀指針;6、x64 的運(yùn)算速度比 x86 高。

本教程操作環(huán)境:linux5.9.8 系統(tǒng)、Dell G3 電腦。

Linux x86(32 位)和 x64(64 位)的區(qū)別

0x01:寄存器分配的不同

(1)64 位有 16 個(gè)寄存器,32 位只有 8 個(gè)。但是 32 位前 8 個(gè)都有不同的命名,分別是 e _,而 64 位前 8 個(gè)使用了 r 代替 e,也就是 r _。e 開頭的寄存器命名依然可以直接運(yùn)用于相應(yīng)寄存器的低 32 位,而剩下的寄存器名則是從 r8 – r15,其低位分別用 d、w、b 指定長度;
(2)32 位使用棧幀來作為傳遞的參數(shù)的保存位置,而 64 位使用寄存器,分別用 rdi,rsi,rdx,rcx,r8,r9 作為第 1 - 6 個(gè)參數(shù),rax 作為返回值;
(3)64 位沒有棧幀的指針,32 位用 ebp 作為棧幀指針,64 位取消了這個(gè)設(shè)定,rbp 作為通用寄存器使用;
(4)64 位支持一些形式的以 PC 相關(guān)的尋址,而 32 位只有在 jmp 的時(shí)候才會(huì)用到這種尋址方式;

0x02:(新增)匯編指令的不同

mov、push、pop 擴(kuò)展了 movq 系列的 mov 和 pushq 以及 popq 用來操作 quad word。

補(bǔ)充:

(1)movabsq 不是 32 位的擴(kuò)展,是純新增的指令。用來將一個(gè) 64 位的字面值直接存到一個(gè) 64 位寄存器中。因?yàn)?movq 只能將 32 位的值存入,所以新增了這樣一條指令

(2)64 位的匯編代碼在 ret 之前可能會(huì)加一句 rep,這里的 rep 沒有實(shí)際意義,只是出于 AMD 處理器的原因,避免 jmp 所到達(dá)的地方直接就是 ret,這樣會(huì)使得處理器運(yùn)行更快一些

0x03:函數(shù)調(diào)用的不同

(1)x_64 的參數(shù)通過寄存器傳遞(見前文);
callq 在棧里存放一個(gè) 8 位的返回地址;
(2)許多函數(shù)不再有棧幀,只有無法將所有本地變量放在寄存器里的才會(huì)在棧上分配空間;
(3)函數(shù)可以獲取到棧至多 128 字節(jié)的空間。這樣函數(shù)就可以在不更改棧指針的情況下在棧上存儲(chǔ)信息(也就是說,可以提前用 rsp 以下的 128 字節(jié)空間,這段空間被稱為 red zone,在 x86-64 里,時(shí)刻可用);
(4)不再有棧幀指針,現(xiàn)在棧的位置和棧指針相關(guān)。大多數(shù)函數(shù)在調(diào)用的一開始就分配全部所需棧空間,之后保持棧指針不改變;
(5)一些寄存器被設(shè)計(jì)成為被調(diào)用者 - 存儲(chǔ)的寄存器,這些必須在需要改變他們值的時(shí)候存儲(chǔ)他們并且之后恢復(fù)他們。

0x04:參數(shù)傳遞的不同

(1)6 個(gè)寄存器用來傳遞參數(shù)(見前文);

(2)剩下的寄存器按照之前的方式傳遞(不過是與 rsp 相關(guān)了,ebp 不再作為棧幀指針,并且從 rsp 開始第 7 個(gè)參數(shù),rsp+ 8 開始第 8 個(gè),以此類推);

(3)調(diào)用時(shí),rsp 向下移動(dòng) 8 位(存入返回地址),寄存器參數(shù)無影響,第 7 個(gè)及之后的參數(shù)現(xiàn)在則是從 rsp+ 8 開始第 7 個(gè),rsp+16 開始第 8 個(gè),以此類推;

0x05:棧幀的不同

很多情況下不再需要棧幀,比如在沒有調(diào)用別的函數(shù),且寄存器足以存儲(chǔ)參數(shù),那么就只需要存儲(chǔ)返回地址即可。
需要棧幀的情況:

(1)本地變量太多,寄存器不夠;
(2)一些本地變量是數(shù)組或結(jié)構(gòu)體;
(3)函數(shù)使用了取地址操作符來計(jì)算一個(gè)本地變量的地址;
(4)函數(shù)必須用棧傳送一些參數(shù)給另外一個(gè)函數(shù);
(5)函數(shù)需要保存一些由被調(diào)用者存儲(chǔ)的寄存器的狀態(tài)(以便于恢復(fù));

但是現(xiàn)在的棧幀經(jīng)常是固定大小的,在函數(shù)調(diào)用的最開始就被設(shè)定,在整個(gè)調(diào)用期間,棧頂指針保持不變,這樣就可以通過對(duì)其再加上偏移量來對(duì)相應(yīng)的值進(jìn)行操作,于是 EBP 就不再需要作為棧幀指針了。雖然很多時(shí)候我們認(rèn)為沒有“棧幀”,但是每次函數(shù)調(diào)用都一定有一個(gè)返回地址被壓棧,我們可以也認(rèn)為這一個(gè)地址就是一個(gè)“棧幀”,因?yàn)樗脖4媪苏{(diào)用者的狀態(tài)。

0x06:運(yùn)算速度不同

64 位 cpu 的數(shù)據(jù)寬度為 64 位,64 位指令集可以運(yùn)行 64 位數(shù)據(jù)指令,也就是說處理器一次可提取 64 位數(shù)據(jù),比 32 位提高了一倍,理論上性能會(huì)相應(yīng)提升 1 倍。

以上是“l(fā)inux 中 x64 和 x86 有哪些區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-04發(fā)表,共計(jì)1845字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 郯城县| 丰城市| 尉氏县| 济源市| 宁强县| 宣威市| 盱眙县| 澄城县| 买车| 全南县| 印江| 鹿邑县| 镇平县| 六盘水市| 湄潭县| 隆尧县| 福贡县| 汕尾市| 顺昌县| 湟中县| 怀远县| 巴东县| 连平县| 即墨市| 辰溪县| 盱眙县| 冕宁县| 华阴市| 澄江县| 海阳市| 湖南省| 徐州市| 靖西县| 开化县| 贞丰县| 资兴市| 新巴尔虎右旗| 武冈市| 静宁县| 监利县| 甘孜|