《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 解決方案 > 計(jì)算機(jī)系統(tǒng)原理(十四) 數(shù)據(jù)格式,、訪問(wèn)信息及操作數(shù)指示符

計(jì)算機(jī)系統(tǒng)原理(十四) 數(shù)據(jù)格式,、訪問(wèn)信息及操作數(shù)指示符

2017-06-22
關(guān)鍵詞: 匯編語(yǔ)言

引言

本文的內(nèi)容其實(shí)可以成為匯編語(yǔ)言的基礎(chǔ),因?yàn)閰R編語(yǔ)言大部分時(shí)候是在操作一些我們平時(shí)開(kāi)發(fā)看不到的東西,,因此本文的目的就是搞清楚,匯編語(yǔ)言都是在操作些什么東西,?;蛘吒鼫?zhǔn)確的說(shuō),各種匯編指令都是在操作什么樣的對(duì)象,。

匯編層次的對(duì)象

在平時(shí)的開(kāi)發(fā)過(guò)程中,,CPU處理器的狀態(tài)對(duì)開(kāi)發(fā)者是隱藏的,我們看不到CPU當(dāng)中各個(gè)對(duì)象的狀態(tài),。但是在匯編語(yǔ)言中,,我們可以清楚的看到這些對(duì)象的狀態(tài),其中CPU主要包含以下幾個(gè)對(duì)象,。

程序計(jì)數(shù)器(PC):記錄下一條指令的地址,。

整數(shù)寄存器文件:共8個(gè),可以存儲(chǔ)一些地址或者整數(shù)的數(shù)據(jù),。

條件寄存器:保存算數(shù)或邏輯指令的狀態(tài)信息,,可以實(shí)現(xiàn)程序的流程控制。

浮點(diǎn)寄存器:存儲(chǔ)浮點(diǎn)數(shù)。

可以看出,,這些都是CPU處理器當(dāng)中的對(duì)象,,上一章我們寫(xiě)過(guò)一個(gè)簡(jiǎn)單的C程序,相信如果不是看了匯編代碼,,各位也都看不出來(lái)在程序運(yùn)行過(guò)程中,,CPU當(dāng)中這些對(duì)象都在做著一些什么樣的操作,又在存儲(chǔ)著一些什么樣的內(nèi)容,。

數(shù)據(jù)的格式

在上一章當(dāng)中,,幾乎所有的匯編指令后面都有一個(gè)字母l,比如movl,、addl,、subl、pushl等等,,這個(gè)l的后綴其實(shí)就是表示的數(shù)據(jù)格式,,表示我們操作的是32位的數(shù)值。

在計(jì)算機(jī)從16位擴(kuò)展到32位,,以至于當(dāng)前的64位來(lái)講,,數(shù)據(jù)格式就一直在變。但是歷史總會(huì)多少影響著未來(lái)的走向,,因此我們習(xí)慣稱(chēng)16位為“字”,,而32位則為“雙字”,相應(yīng)的,,64位則為“四字”,。

需要一提的就是,long long int在IA32架構(gòu)中是不支持這種數(shù)據(jù)格式的,,因此就沒(méi)有列出它的后綴,。另外,long double是一種擴(kuò)展類(lèi)型,,通常采用12個(gè)字節(jié)來(lái)表示,。


寄存器是CPU當(dāng)中非常重要的對(duì)象,一般情況下,,很多臨時(shí)變量都會(huì)存儲(chǔ)在這里,,就像上一章當(dāng)中的臨時(shí)變量t,在優(yōu)化之后,,t將不再進(jìn)入主存,,而只留在寄存器當(dāng)中。這樣可以提高程序運(yùn)行的速度,,因?yàn)榧拇嫫鞯乃俣纫哂谥鞔?,而且在寄存器與主存之間傳輸數(shù)據(jù),,也是十分耗時(shí)間的一件事。

下面是一張書(shū)中的寄存器圖示,,它基于IA32架構(gòu)給出,。

可以看到,對(duì)于%esp和%ebp寄存器來(lái)講,,圖中標(biāo)注了它們分別是棧指針以及幀指針,。而對(duì)于另外六個(gè)寄存器來(lái)講,它們大部分時(shí)候是一樣的,,但是還是有些許的不同,。

比如%eax寄存器,它很多時(shí)候用來(lái)存儲(chǔ)函數(shù)的返回值,。而對(duì)于%eax,、%ecx、%edx,、%ebx來(lái)講,,它們都可以被訪問(wèn)單獨(dú)的字節(jié)。另外需要一提的是,,這八個(gè)寄存器都可以被訪問(wèn)雙字節(jié),。

除了以上的區(qū)別之外,,對(duì)于%eax,、%ecx、%edx和%ebx,、%esi,、%edi來(lái)講,它們的使用慣例也有些許不同,,這個(gè)在后面我們將深入討論,。這里各位只要大概認(rèn)識(shí)一下這八位神仙就行了。

操作數(shù)指示符

操作數(shù)指示符這個(gè)稱(chēng)謂是書(shū)上給的,,但LZ覺(jué)得這個(gè)概念不太容易理解,,操作數(shù)指示符其實(shí)指的就是一種取值的標(biāo)識(shí)方式,用來(lái)獲取參與各種操作的操作數(shù),。

這些標(biāo)識(shí)方式一共有三種,,一種是$符號(hào)后跟一個(gè)標(biāo)準(zhǔn)C表示的整數(shù),比如$100,,$0x11等等,。第二種則是寄存器,當(dāng)它作為一個(gè)操作數(shù)的時(shí)候,,則是取的寄存器當(dāng)中的數(shù)值,。另外,對(duì)于寄存器來(lái)說(shuō),也可以選擇性的操作4個(gè),、2個(gè),、1個(gè)字節(jié),而并不一定非要操作4個(gè)字節(jié),。最后一種,,則是我們相對(duì)來(lái)說(shuō)最熟悉的,就是存儲(chǔ)器或者說(shuō)內(nèi)存,。當(dāng)它作為一個(gè)操作數(shù)的時(shí)候,,會(huì)去計(jì)算存儲(chǔ)器地址的數(shù)值,然后去這個(gè)地址取相應(yīng)的數(shù)值,。


由于存儲(chǔ)器相對(duì)來(lái)說(shuō),,理解起來(lái)比較困難一點(diǎn)。因此這里L(fēng)Z舉個(gè)簡(jiǎn)單的例子,,比如對(duì)于4(%esp,%eax,4)這個(gè)操作數(shù)來(lái)講,,它代表的是內(nèi)存地址為4+%esp+4*%eax的存儲(chǔ)器區(qū)域的值。

操作數(shù)是大部分指令都有的,,因此上面的這些標(biāo)識(shí)方式,,在之后的文章中我們會(huì)經(jīng)常看到,,它們將會(huì)成為各位猿友很好的朋友,。

文章小結(jié)

本章只介紹了一些匯編當(dāng)中基礎(chǔ)的知識(shí),這些內(nèi)容相對(duì)來(lái)講不是特別困難,,但卻是打開(kāi)后面神秘大門(mén)的鑰匙,。因此倘若有哪位猿友不是太理解本章的內(nèi)容的話,LZ希望各位可以從實(shí)踐入手去理解一下本章的內(nèi)容,。這一點(diǎn)可以結(jié)合上一章來(lái)看,,從上一章給出的匯編代碼中尋找數(shù)據(jù)格式、操作數(shù)以及寄存器的部分,,這應(yīng)該是十分輕松的,,因?yàn)樯弦徽碌膮R編代碼中充斥著這三個(gè)部分的內(nèi)容。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問(wèn)題,,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。