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

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

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

引言

本文的內(nèi)容其實可以成為匯編語言的基礎,因為匯編語言大部分時候是在操作一些我們平時開發(fā)看不到的東西,因此本文的目的就是搞清楚,匯編語言都是在操作些什么東西。或者更準確的說,各種匯編指令都是在操作什么樣的對象。

匯編層次的對象

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

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

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

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

浮點寄存器:存儲浮點數(shù)。

可以看出,這些都是CPU處理器當中的對象,上一章我們寫過一個簡單的C程序,相信如果不是看了匯編代碼,各位也都看不出來在程序運行過程中,CPU當中這些對象都在做著一些什么樣的操作,又在存儲著一些什么樣的內(nèi)容。

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

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

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

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


寄存器是CPU當中非常重要的對象,一般情況下,很多臨時變量都會存儲在這里,就像上一章當中的臨時變量t,在優(yōu)化之后,t將不再進入主存,而只留在寄存器當中。這樣可以提高程序運行的速度,因為寄存器的速度要高于主存,而且在寄存器與主存之間傳輸數(shù)據(jù),也是十分耗時間的一件事。

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

可以看到,對于%esp和%ebp寄存器來講,圖中標注了它們分別是棧指針以及幀指針。而對于另外六個寄存器來講,它們大部分時候是一樣的,但是還是有些許的不同。

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

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

操作數(shù)指示符

操作數(shù)指示符這個稱謂是書上給的,但LZ覺得這個概念不太容易理解,操作數(shù)指示符其實指的就是一種取值的標識方式,用來獲取參與各種操作的操作數(shù)。

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


由于存儲器相對來說,理解起來比較困難一點。因此這里LZ舉個簡單的例子,比如對于4(%esp,%eax,4)這個操作數(shù)來講,它代表的是內(nèi)存地址為4+%esp+4*%eax的存儲器區(qū)域的值。

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

文章小結(jié)

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


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