展示網(wǎng)站報價搜索引擎環(huán)境優(yōu)化
本文來自《程序員的自我修養(yǎng)》
編譯過程是把預(yù)處理完的文件進(jìn)行一系列詞法分析,語法分析,語義分析以及優(yōu)化后生成相應(yīng)的匯編文件代碼。
現(xiàn)在版本的GCC把預(yù)編譯和編譯兩個步驟合并為一個步驟。
gcc -S HelloWorld.c HelloWorld.s
int main()
{//test/* test */return 0;
}
.file "HelloWorld.c".text.globl main.type main, @function
main:
.LFB0:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl $0, %eaxpopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size main, .-main.ident "GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0".section .note.GNU-stack,"",@progbits.section .note.gnu.property,"a".align 8.long 1f - 0f.long 4f - 1f.long 5
0:.string "GNU"
1:.align 8.long 0xc0000002.long 3f - 2f
2:.long 0x3
3:.align 8
4:
------------
對于C語言的代碼來說,這個預(yù)編譯和編譯的程序是cc1,
對于C++來說,對應(yīng)的程序是cc1plus;
實際上gcc這個命令只是這些后臺程序的封裝,它會根據(jù)不同的參數(shù)要求去調(diào)用預(yù)編譯編譯程序cc1,匯編器as,鏈接器ld.
--------------
匯編器將匯編代碼轉(zhuǎn)變?yōu)闄C(jī)器可以執(zhí)行的指令,每一個匯編代碼幾乎都對應(yīng)一條機(jī)器指令,所以匯編器的匯編過程相對于編譯器來說比較簡單,沒有復(fù)雜的語法,沒有語義,不需要做指令優(yōu)化;
只是根據(jù)匯編指令和機(jī)器指令的對照表一一翻譯即可。
gcc -c HelloWorld.s -o HelloWorld.o
把匯編代碼轉(zhuǎn)為機(jī)器指令。
----------
機(jī)器指令是計算機(jī)能夠直接理解和執(zhí)行的最基本的命令。它們通常以二進(jìn)制形式存在,是硬件與軟件交互的橋梁。每一條機(jī)器指令都對應(yīng)著處理器上的一個特定的操作,比如數(shù)據(jù)傳輸、算術(shù)計算、控制操作等。
以下是機(jī)器指令的一些基本特點:
-
二進(jìn)制格式:機(jī)器指令通常由一系列的二進(jìn)制數(shù)表示,這些二進(jìn)制數(shù)可以被計算機(jī)的CPU直接解讀。
-
操作碼:每條機(jī)器指令都包含一個操作碼(Opcode),它指定了CPU要執(zhí)行的操作類型,如加法、減法、移動數(shù)據(jù)等。
-
操作數(shù):大多數(shù)指令還包括一個或多個操作數(shù),這些操作數(shù)指定了數(shù)據(jù)的位置,例如寄存器、內(nèi)存地址或者指令中直接包含的常數(shù)。
-
指令長度:不同架構(gòu)的CPU,其機(jī)器指令的長度可能不同。有的指令可能是固定長度的,而有的可能是變長的。
-
執(zhí)行順序:機(jī)器指令通常按照它們在存儲器中的順序執(zhí)行,除非遇到跳轉(zhuǎn)指令或者其他改變執(zhí)行流程的指令。
以下是一些常見的機(jī)器指令類型:
- 數(shù)據(jù)傳輸指令:如MOV(移動數(shù)據(jù)),用來在寄存器與內(nèi)存之間或者寄存器之間傳輸數(shù)據(jù)。
- 算術(shù)指令:如ADD(加法)、SUB(減法)、MUL(乘法)、DIV(除法)等,用于執(zhí)行數(shù)學(xué)運算。
- 邏輯指令:如AND、OR、NOT、XOR等,用于執(zhí)行邏輯運算。
- 控制流指令:如JMP(跳轉(zhuǎn))、JE(等于時跳轉(zhuǎn))、JNE(不等于時跳轉(zhuǎn))等,用于改變程序的執(zhí)行順序。
程序員通常使用高級編程語言來編寫程序,然后通過編譯器或解釋器轉(zhuǎn)換成機(jī)器指令,計算機(jī)才能執(zhí)行這些程序。機(jī)器指令直接與硬件相關(guān),因此它們在不同的計算機(jī)架構(gòu)之間通常是不同的。
-------------
MOV
?既可以作為機(jī)器指令,也可以作為匯編指令。
在匯編語言中,MOV
?是一個匯編指令,它用于指示處理器將數(shù)據(jù)從一個位置移動到另一個位置。當(dāng)程序員編寫匯編語言程序時,他們使用?MOV
?這樣的助記符來表示他們想要執(zhí)行的數(shù)據(jù)移動操作。
當(dāng)匯編語言程序被匯編器(assembler)轉(zhuǎn)換成機(jī)器代碼時,MOV
?匯編指令會被翻譯成對應(yīng)的機(jī)器指令。這個機(jī)器指令是處理器可以直接執(zhí)行的二進(jìn)制編碼,它具體表示了移動數(shù)據(jù)的操作。
所以,MOV
?在匯編語言層面是一個匯編指令,而在機(jī)器代碼層面則對應(yīng)一個或多個具體的機(jī)器指令。不同的處理器架構(gòu)可能會有不同的機(jī)器指令來執(zhí)行?MOV
?操作。例如,在 x86 架構(gòu)中,MOV
?匯編指令會對應(yīng)于一個特定的機(jī)器指令操作碼,而在 ARM 架構(gòu)中,它可能對應(yīng)于不同的機(jī)器指令操作碼。