展示網(wǎng)站報(bào)價(jià)搜索引擎環(huán)境優(yōu)化
本文來(lái)自《程序員的自我修養(yǎng)》
編譯過(guò)程是把預(yù)處理完的文件進(jìn)行一系列詞法分析,語(yǔ)法分析,語(yǔ)義分析以及優(yōu)化后生成相應(yīng)的匯編文件代碼。
現(xiàn)在版本的GCC把預(yù)編譯和編譯兩個(gè)步驟合并為一個(gè)步驟。
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:
------------
對(duì)于C語(yǔ)言的代碼來(lái)說(shuō),這個(gè)預(yù)編譯和編譯的程序是cc1,
對(duì)于C++來(lái)說(shuō),對(duì)應(yīng)的程序是cc1plus;
實(shí)際上gcc這個(gè)命令只是這些后臺(tái)程序的封裝,它會(huì)根據(jù)不同的參數(shù)要求去調(diào)用預(yù)編譯編譯程序cc1,匯編器as,鏈接器ld.
--------------
匯編器將匯編代碼轉(zhuǎn)變?yōu)闄C(jī)器可以執(zhí)行的指令,每一個(gè)匯編代碼幾乎都對(duì)應(yīng)一條機(jī)器指令,所以匯編器的匯編過(guò)程相對(duì)于編譯器來(lái)說(shuō)比較簡(jiǎn)單,沒(méi)有復(fù)雜的語(yǔ)法,沒(méi)有語(yǔ)義,不需要做指令優(yōu)化;
只是根據(jù)匯編指令和機(jī)器指令的對(duì)照表一一翻譯即可。
gcc -c HelloWorld.s -o HelloWorld.o
把匯編代碼轉(zhuǎn)為機(jī)器指令。
----------
機(jī)器指令是計(jì)算機(jī)能夠直接理解和執(zhí)行的最基本的命令。它們通常以二進(jìn)制形式存在,是硬件與軟件交互的橋梁。每一條機(jī)器指令都對(duì)應(yīng)著處理器上的一個(gè)特定的操作,比如數(shù)據(jù)傳輸、算術(shù)計(jì)算、控制操作等。
以下是機(jī)器指令的一些基本特點(diǎn):
-
二進(jìn)制格式:機(jī)器指令通常由一系列的二進(jìn)制數(shù)表示,這些二進(jìn)制數(shù)可以被計(jì)算機(jī)的CPU直接解讀。
-
操作碼:每條機(jī)器指令都包含一個(gè)操作碼(Opcode),它指定了CPU要執(zhí)行的操作類型,如加法、減法、移動(dòng)數(shù)據(jù)等。
-
操作數(shù):大多數(shù)指令還包括一個(gè)或多個(gè)操作數(shù),這些操作數(shù)指定了數(shù)據(jù)的位置,例如寄存器、內(nèi)存地址或者指令中直接包含的常數(shù)。
-
指令長(zhǎng)度:不同架構(gòu)的CPU,其機(jī)器指令的長(zhǎng)度可能不同。有的指令可能是固定長(zhǎng)度的,而有的可能是變長(zhǎng)的。
-
執(zhí)行順序:機(jī)器指令通常按照它們?cè)诖鎯?chǔ)器中的順序執(zhí)行,除非遇到跳轉(zhuǎn)指令或者其他改變執(zhí)行流程的指令。
以下是一些常見(jiàn)的機(jī)器指令類型:
- 數(shù)據(jù)傳輸指令:如MOV(移動(dòng)數(shù)據(jù)),用來(lái)在寄存器與內(nèi)存之間或者寄存器之間傳輸數(shù)據(jù)。
- 算術(shù)指令:如ADD(加法)、SUB(減法)、MUL(乘法)、DIV(除法)等,用于執(zhí)行數(shù)學(xué)運(yùn)算。
- 邏輯指令:如AND、OR、NOT、XOR等,用于執(zhí)行邏輯運(yùn)算。
- 控制流指令:如JMP(跳轉(zhuǎn))、JE(等于時(shí)跳轉(zhuǎn))、JNE(不等于時(shí)跳轉(zhuǎn))等,用于改變程序的執(zhí)行順序。
程序員通常使用高級(jí)編程語(yǔ)言來(lái)編寫程序,然后通過(guò)編譯器或解釋器轉(zhuǎn)換成機(jī)器指令,計(jì)算機(jī)才能執(zhí)行這些程序。機(jī)器指令直接與硬件相關(guān),因此它們?cè)诓煌挠?jì)算機(jī)架構(gòu)之間通常是不同的。
-------------
MOV
?既可以作為機(jī)器指令,也可以作為匯編指令。
在匯編語(yǔ)言中,MOV
?是一個(gè)匯編指令,它用于指示處理器將數(shù)據(jù)從一個(gè)位置移動(dòng)到另一個(gè)位置。當(dāng)程序員編寫匯編語(yǔ)言程序時(shí),他們使用?MOV
?這樣的助記符來(lái)表示他們想要執(zhí)行的數(shù)據(jù)移動(dòng)操作。
當(dāng)匯編語(yǔ)言程序被匯編器(assembler)轉(zhuǎn)換成機(jī)器代碼時(shí),MOV
?匯編指令會(huì)被翻譯成對(duì)應(yīng)的機(jī)器指令。這個(gè)機(jī)器指令是處理器可以直接執(zhí)行的二進(jìn)制編碼,它具體表示了移動(dòng)數(shù)據(jù)的操作。
所以,MOV
?在匯編語(yǔ)言層面是一個(gè)匯編指令,而在機(jī)器代碼層面則對(duì)應(yīng)一個(gè)或多個(gè)具體的機(jī)器指令。不同的處理器架構(gòu)可能會(huì)有不同的機(jī)器指令來(lái)執(zhí)行?MOV
?操作。例如,在 x86 架構(gòu)中,MOV
?匯編指令會(huì)對(duì)應(yīng)于一個(gè)特定的機(jī)器指令操作碼,而在 ARM 架構(gòu)中,它可能對(duì)應(yīng)于不同的機(jī)器指令操作碼。