
文章插圖
程序語言(C,Java等)是人類能夠理解的語言,因此我們可以用程序語言編寫軟件,交給CPU去執(zhí)行,如果你直接將程序語言交給CPU去執(zhí)行,CPU壓根就不能理解這種語言,CPU只認(rèn)識(shí)它自己的語言-機(jī)器語言即機(jī)器碼,因此我們需要將程序語言翻譯成機(jī)器碼,翻譯的方式有兩種,一種是編譯,另外一種是解釋,編譯的意思是把整個(gè)程序一次性翻譯成機(jī)器碼,解釋的意思說,一句一句地翻譯,不管怎么樣,我們最終交給CPU的是機(jī)器碼,讓CPU去根據(jù)機(jī)器碼去做它該做的事情 。
C翻譯成機(jī)器碼
可以把計(jì)算機(jī)當(dāng)做一個(gè)黑盒子,輸入機(jī)器碼和數(shù)據(jù),CPU執(zhí)行后輸出內(nèi)容到內(nèi)存,如下圖所示
機(jī)器碼執(zhí)行圖
匯編語言是人類能夠理解的機(jī)器指令,后續(xù)我們舉例子時(shí),直接用匯編語言表示機(jī)器指令,它們是等價(jià)的 。
一.什么是機(jī)器碼?機(jī)器碼也叫機(jī)器指令,就像我們?nèi)祟惏l(fā)出的指令一樣,比如:“小明,去衛(wèi)生間里拿一把掃帚去打掃房間,機(jī)器碼就是這條指令,這條指令里就包含了干什么事情,去哪里干 。
1.1 機(jī)器碼都有些什么內(nèi)容機(jī)器碼是與計(jì)算機(jī)硬件緊密關(guān)聯(lián)的,不同的CPU,機(jī)器碼不一樣,就好比不同的國(guó)家,語言不一樣類似,比如我們常用的CPU如Inter Pentium系列,酷睿系列,AMD 銳龍,ARM,MIPS,IBM PowerPC等,他們的機(jī)器碼就各不相同,但都有一個(gè)共同的規(guī)范就如下圖所示 。
機(jī)器碼包含的內(nèi)容
如上圖所示機(jī)器碼共同的規(guī)范就是他們都包括操作碼,控制位(可選),操作數(shù)(可選),操作數(shù)可以有多個(gè)(一般1-3個(gè))甚至沒有 。
操作碼:表示指令類型,比如ADD表示加法指令,SUB表示減法指令 。一個(gè)處理器可以包含非常復(fù)雜,面面俱到的指令,也可以包含十分精簡(jiǎn),短小精干的指令,正因如此,在CPU界分成了兩大門派CISC(復(fù)雜指令集)和RISC(精簡(jiǎn)指令集),CISC屬于大包大攬,啥都想干,RISC是我只敢我能做的事情,其他的事情交給編譯器,下面的表格為這兩個(gè)門派的成員
CISCRISCInter,AMDARM,MIPS,IBM PowerPC控制位:幾乎用不到,不做詳解
操作數(shù):表示指令需要操作的數(shù)據(jù),在機(jī)器碼中,操作數(shù)可不一定是放在那里,等著你直接去拿的,有以下幾種獲取的方式
立即數(shù)尋址:立即數(shù)是一個(gè)整數(shù),例如5,不需要從寄存器或者內(nèi)存中獲取,它本身就是操作數(shù),例如ARM CPU下的指令
ADDr1,r2,#5上面代碼中5就是立即數(shù),是常量,直接將R2寄存器中的內(nèi)容與5相加,存儲(chǔ)到r1寄存器中 。直接尋址:從內(nèi)存中直接獲取操作數(shù),例如Inter Pentium CPU下的指令
MOV AX,[2468]上面代碼將內(nèi)存地址2468上指向的內(nèi)容寫入到ax寄存器間接尋址:不直接從內(nèi)存地址獲取操作數(shù),而是將內(nèi)存地址存儲(chǔ)在寄存器中,通過寄存器間接獲取操作數(shù),例如ARM下的指令
LDRr1, [r2]上面代碼,r2寄存器中存儲(chǔ)的是內(nèi)存地址,上面指令表達(dá)的意思是,將r2寄存器中存儲(chǔ)的內(nèi)存地址指向的內(nèi)容寫入到r1寄存器 。偏移量間接尋址:它是間接尋址變種的一種,例如ARM下的指令
LDR r2,[r3,#8]上面代碼,r3寄存器中存儲(chǔ)的是內(nèi)存地址,上面指令表達(dá)的意思是,將r3寄存器中存儲(chǔ)的內(nèi)存地址加上偏移8后算出的內(nèi)存地址指向的內(nèi)容寫入到r2寄存器 。1.2 機(jī)器碼的格式正如上文提到不同的CPU類型機(jī)器碼不同,有的CPU機(jī)器碼支持動(dòng)態(tài)長(zhǎng)度,動(dòng)態(tài)擴(kuò)展,如Inter系列,它有時(shí)候可以一條指令中有多個(gè)操作碼,有的CPU的機(jī)器碼長(zhǎng)度是固定的,如ARM,我們可以分析大多數(shù)的機(jī)器碼,大多數(shù)的機(jī)器碼占一個(gè)字(32位或64位),一般超過一個(gè)字的機(jī)器碼不多,可能只有Inter系列會(huì)有,一般用不到,這里不做闡述 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 中國(guó)移動(dòng)服務(wù)密碼查詢 中國(guó)移動(dòng)服務(wù)密碼忘記了怎么辦
- 使用Skype的步驟 電腦skype怎么用
- 微信分付哪里地方可以用?掃碼消費(fèi)的渠道分享!
- win7忘記密碼強(qiáng)制重置 windows7密碼忘了怎么辦
- 附講解和思維導(dǎo)圖 java代碼大全及詳解
- 小米藍(lán)牙連接pin密碼不對(duì) pin碼或配對(duì)密鑰不正確怎么解決
- sim卡pin碼解鎖方法 sim卡網(wǎng)絡(luò)解鎖pin碼是怎么解
- 自動(dòng)連接陌生帶密碼的熱點(diǎn) 加密通信是什么意思
- python代碼運(yùn)行方式 python代碼怎么運(yùn)行
- 電腦截屏操作快捷鍵 電腦部分截圖快捷鍵怎么操作
