(十)程序的實(shí)際構(gòu)成(難點(diǎn)章節(jié))

還是那句話,CPU能運(yùn)行的只有本地代碼(機(jī)器語言)程序,其內(nèi)容是數(shù)值的羅列。

匯編語言

在本地代碼程序中,內(nèi)容只是數(shù)值的羅列,人類無法識(shí)別。
想法:在各本地代碼中,附上表示其功能的英文縮寫。
比如:執(zhí)行加法運(yùn)算的本地代碼中,加上add(addition的縮寫);比較運(yùn)算的本地代碼中,加上cmp(compare的縮寫)??梢杂兄诶斫?。
這些縮寫稱為助記符,使用這些助記符的編程語言就是匯編語言。匯編文件后綴.asm.

匯編語言和機(jī)器語言是一一對(duì)應(yīng)的。
匯編語言-->機(jī)器語言:匯編。由匯編器完成。
機(jī)器語言-->匯編語言:反匯編。由反匯編程序完成。


C語言等高級(jí)編程語言和機(jī)器語言不是一一對(duì)應(yīng)的,因而反編譯比反匯編困難。

通過編譯器,將其他編程語言代碼轉(zhuǎn)變?yōu)閰R編代碼

除了將本地代碼通過反匯編轉(zhuǎn)換得到匯編語言代碼,大部分的C語言編譯器,都可以將C語言代碼轉(zhuǎn)換為匯編代碼。
程序栗子:
#include <stdio.h>
void main(){
//求和
int addNum(int a, int b){
return a+b;
}
//調(diào)用
void myFunc(){
int c;
c = addNum(123,456);
}
}
僅編譯而不鏈接,生成.asm匯編文件。



匯編語言的源代碼里有什么?

匯編語言的源代碼=轉(zhuǎn)換成機(jī)器語言的指令(操作碼)+針對(duì)匯編器的偽指令

偽指令:將程序構(gòu)造和匯編方法指示給匯編器,本身不會(huì)轉(zhuǎn)換為本地代碼。




匯編語言的真正語法:操作碼+操作數(shù)

操作碼:指令動(dòng)作。操作數(shù):指令對(duì)象。


CPU中的寄存器的名稱會(huì)通過匯編語言的源代碼指定給操作數(shù)。

匯編語言的幾個(gè)主要操作碼

mov指令

棧操作:push() 和 pop()

push指令和pop指令都只有一個(gè)操作數(shù),表示push或pop的是什么。


匯編語言函數(shù)調(diào)用





函數(shù)內(nèi)部處理




匯編語言中的全局變量和局部變量

全局變量使用的內(nèi)存空間被始終確保

_DATA 段定義中包含了沒有初始化定義的全局變量。
_BSS 段定義中包含了已經(jīng)初始化定義的全局變量







局部變量使用的內(nèi)存空間在寄存器中或者在棧中




匯編語言中的循環(huán)語句


C語言:for語句,循環(huán)計(jì)數(shù)器初始值i=0 + 循環(huán)繼續(xù)條件(i<n)+ 循環(huán)計(jì)數(shù)器更新(i++)來完成一個(gè)循環(huán)語句。
匯編語言:通過比較指令cmp跳轉(zhuǎn)指令jl 來完成一個(gè)循環(huán)語句。


匯編語言中的條件分支語句

匯編語言中,同樣適用cmp比較指令jl等跳轉(zhuǎn)指令來完成一個(gè)條件分支語句。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容