站長資訊網
        最全最豐富的資訊網站

        linux中x64和x86的區別是什么

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

        linux中x64和x86的區別是什么

        本教程操作環境:linux5.9.8系統、Dell G3電腦。

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

        0x01:寄存器分配的不同

        linux中x64和x86的區別是什么

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

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

        linux中x64和x86的區別是什么

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

        補充:

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

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

        0x03:函數調用的不同

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

        0x04:參數傳遞的不同

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

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

        (3)調用時,rsp向下移動8位(存入返回地址),寄存器參數無影響,第7個及之后的參數現在則是從rsp+8開始第7個,rsp+16開始第8個,以此類推;

        0x05:棧幀的不同

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

        (1)本地變量太多,寄存器不夠;
        (2)一些本地變量是數組或結構體;
        (3)函數使用了取地址操作符來計算一個本地變量的地址;
        (4)函數必須用棧傳送一些參數給另外一個函數;
        (5)函數需要保存一些由被調用者存儲的寄存器的狀態(以便于恢復);

        但是現在的棧幀經常是固定大小的,在函數調用的最開始就被設定,在整個調用期間,棧頂指針保持不變,這樣就可以通過對其再加上偏移量來對相應的值進行操作,于是EBP就不再需要作為棧幀指針了。雖然很多時候我們認為沒有“棧幀”,但是每次函數調用都一定有一個返回地址被壓棧,我們可以也認為這一個地址就是一個“棧幀”,因為它也保存了調用者的狀態。

        0x06:運算速度不同

        64位cpu的數據寬度為64位,64位指令集可以運行64位數據指令,也就是說處理器一次可提取64位數據,比32位提高了一倍,理論上性能會相應提升1倍。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 日韩欧美一区二区三区中文精品| 亚洲AV永久无码精品| 亚洲精品成人片在线观看| jizzjizz国产精品久久| 最新国产成人精品2024| 国自产精品手机在线观看视| 91视频精品全国免费观看| 亚洲精品美女久久777777| 久久久这里有精品中文字幕| 国产vA免费精品高清在线观看| 国产精品视频一区二区三区经 | 国产精品一级片| 青草国产精品久久久久久| 亚洲精品网站在线观看不卡无广告 | 99国产精品一区二区| 久久久久人妻精品一区二区三区| 四虎国产精品成人| 精品欧美小视频在线观看| 国产乱码精品一区二区三| 日韩精品在线视频| 精品免费视在线观看| 国产福利在线观看精品| 99爱在线精品免费观看| 99精品无人区乱码在线观看| 国产剧情国产精品一区| 国产精品99精品无码视亚| 国产精品免费无遮挡无码永久视频| 无码人妻精品中文字幕免费| 最新精品露脸国产在线| 欧美国产成人精品一区二区三区 | 2021国产精品成人免费视频| 久久久久无码精品国产| 精品亚洲A∨无码一区二区三区| 伊人久久精品无码二区麻豆| 在线观看91精品国产网站| 在线亚洲精品福利网址导航| 亚洲国产精品综合久久网络| 亚洲情侣偷拍精品| 伊人精品视频在线| 少妇伦子伦精品无码STYLES | 日韩精品无码AV成人观看|