i386平臺和x86_64平臺機器代碼的區(qū)別
By Qianghaohao
說明:
在此i386(IA32)指的是Intel32位處理器上硬件和GCC代碼的組合.
x86_64指代在AMD和Intel的較新的64位處理器上運行的硬件和GCC代碼的組合.
x86-64代碼與i386機器生成的代碼有極大的不同.主要內(nèi)容如下:
1.指針和長整型數(shù)是64位長.整數(shù)算術(shù)運算支持8,16,32,和64位數(shù)據(jù)類型.
2.通用寄存器組從8個擴展到16個.
3.許多程序狀態(tài)都保存在寄存器中,而不是在棧上.整型和指針類型的過程參數(shù)(最多6個)通過
寄存器傳遞.有些過程根本不需要訪問棧.
4.如果可能,條件操作用條件傳送指令實現(xiàn),會得到比傳統(tǒng)分支代碼更好的性能.
5.浮點數(shù)作用面向寄存器的指令集來實現(xiàn),而不用IA32支持的基于棧的方法來實現(xiàn)
為了驗證以上區(qū)別,在x86-64 Linux平臺用不同的GCC編譯選項來生成不同平臺的C代碼對應(yīng)的匯編代碼:
測試如下代碼:
- //文件名:x86-64-IA32.c
- #include<stdio.h>
- int main()
- {
- int *p; //int型指針變量
- long n; //定義長整型變量
- printf("size of p = %d\nsize of n = %d\n", sizeof(p), sizeof(n));
- return 0;
- }
一.先在i386 Linux上運行命令:gcc -S -m32 x86-64-IA32.c 產(chǎn)生IA32機器兼容的匯編代碼:
當(dāng)把以上代碼編譯成可執(zhí)行代碼是輸出結(jié)果為:
size of p = 4
size of n = 4
二. 在x86-64 Linux上運行命令:gcc -S -m64 x86-64-IA32.c 產(chǎn)生x86-64平臺的匯編代碼:
當(dāng)把以上代碼編譯成可執(zhí)行代碼是輸出結(jié)果為:
size of p = 8
size of n = 8
總結(jié):從以上結(jié)果對比可以看出i386平臺和x86-64平臺的代碼有很大的區(qū)別,在i386平臺指針類型
和long類型大小都為4,在x64平臺指針類型和long類型大小都為8.另外兩者產(chǎn)生的匯編代碼也不同
在x64平臺指令后綴為q,如pushq ,popq等,而在i386位movl,pushl等.至于其他更多的區(qū)別可以
寫其他測試代碼來檢驗,在此不做過多的介紹.
|