關於彙編偽指令EVEN操作機理的問題分析論文

才智咖 人氣:2.25W

組合語言屬於低階語言範疇,是一種面向機器的、功能很強的程式設計語言。它具有目的碼簡短,佔用記憶體少,執行速度快等優點。

關於彙編偽指令EVEN操作機理的問題分析論文

組合語言指令是機器指令的一種符號表示,不同型別的CPU就有不同的機器指令系統,也就有不同的組合語言。除了同系列、不同型號CPU之間的組合語言程式有一定程度的可移植性之外,其他不同型別CPU之間的組合語言程式是無法移植的。

正因為組合語言具有“與機器相關性”的特性,程式設計師使用匯編語言編寫程式時,可以對機器內部的各種資源進行合理的安排,編寫出高效且需要對機器硬體精確控制的程式。所以掌握計算機系統的硬體結構對學習組合語言具有很大幫助。

在學習《組合語言程式設計》課程時,有一條對準偽指令EVEN,其作用就是將下一個位元組的地址設定為偶數,並且指出一個字的地址最好從偶地址開始。但其原因卻並沒有過多給以說明。因此,學生對它的功能比較茫然,為了充分說明該偽指令的功能,該文從8086微機系統的儲存器組織結構著手,詳細闡述這個問題。

1 儲存器中的資料組織

在計算機系統中,作為一個整體存入或取出記憶體儲器的資料稱為“儲存字”。例如:8位計算機的儲存字是8位字長(1個位元組);16位計算機的儲存字是16位字長(2個位元組)……

對於記憶體儲器的字長(一個儲存單元所包含二進位制程式碼的個數),如果和主機的字長相同,則一個儲存單元存放一個儲存字,儲存字的地址就是儲存單元的地址,這種儲存器稱為“字編址結構”。但在微機系統中,記憶體儲器一般都是以位元組作為基本儲存單元。這樣,對16位字長以及16位以上字長的計算機,一個儲存字將被存放在幾個連續的儲存單元中,這種儲存器稱為“位元組編址結構”。

2 8086微機系統的儲存器組織結構

8086 CPU有16條資料線,20條地址線,可直接定址1M位元組的記憶體儲器地址空間,而這1M位元組的儲存器地址空間是按位元組順序排列的。由於8086是16位的微型計算機,而在16微機系統中,CPU除了可以對一個位元組(8位)操作外,還可以進行一個字(16位)的操作。為了能滿足一次訪問一個整字又能訪問一個位元組的要求,在8086微機系統中,1M位元組的儲存器地址空間實際分成兩個512K位元組的儲存體——“偶儲存體”和“奇儲存體”。兩個儲存體之間採用位元組交叉編址方式。

對於任何一個儲存體,只需要19條地址線(A19—A1)就可以直接定址,剩下1條地址線(A0)用來區分當前訪問的是哪一個儲存體,A0=0時,表示訪問的是偶儲存體;A0=1時,表示訪問的是奇儲存體。

在8086微機系統中,讀寫一個位元組的資訊時,可以直接採用上述方法進行操作,但讀寫一個整字的資訊時,則需要同時訪問兩個儲存體,在這種情況下,若只用A0的取值來控制讀寫操作顯然就不行了。為此,在8086微機系統中,又增加一個匯流排高位有效控制訊號。當有效時(低電平有效),選定奇儲存體,體內地址由A19—A1確定;當A0=0時,選定偶儲存體,體內地址同樣由A19—A1確定。奇儲存體和資料匯流排高8位(D15—D8)連線,偶儲存體和資料匯流排低8位(D7—D0)連線。有時候,奇儲存體稱為高位元組儲存體,偶儲存體稱為低位元組儲存體。因此,在8086微機系統中,允許CPU訪問任何一個儲存體,讀寫一個位元組的資訊或同時訪問兩個儲存體讀寫一個整字的資訊。

3 8086微機系統的儲存器讀/寫操作

8086CPU訪問儲存器時,在一個匯流排周期內,既可以訪問一個位元組,也可以訪問一個整字。

(1)位元組訪問。

當8086CPU訪問一個位元組資訊時,可以分為兩種情況:

①如果訪問的位元組是偶地址,則資料匯流排低8位(D7—D0)和偶儲存體之間直接進行資料傳送。

②如果訪問的位元組是奇地址,則資料匯流排高8位(D15—D8)和奇儲存體之間直接進行資料傳送。

由上可以看出,無論哪種情況,在一個匯流排週期內,都可以完成訪問一個位元組的操作。

(2)整字訪問。

從上表可見,8086CPU能同時訪問奇儲存體和偶儲存體中的一個位元組,以組成一個16位儲存字。此時,也有兩種情況:

①如果要訪問的一個字的低8位位元組存放在偶儲存體中,高8位位元組存放在奇儲存體中,以這種方式存放的一個字稱為規則字。從上面分析可知,這時不需要位元組交換地址交叉,直接就可以進行資料傳送。因而,只需經過一個匯流排週期就可完成對一個規則字的訪問。

②如果要訪問的一個字的高8位位元組存放在偶儲存體中,低8位位元組存放在奇儲存體中,以這種方式存放的'一個字稱為非規則字。從上面分析可知,這時需要位元組交換,才可以進行資料傳送。因而,需要經過兩個匯流排週期才可完成對一個非規則字的訪問。

對於以非規則字方式存放的一個字的操作過程是這樣的(以寫操作為例):在第一個匯流排週期內,送出奇地址(A0=1),同時發出=0訊號,然後由8086 CPU把該字的低8位傳送到資料匯流排的高8位(注意:此時發生了位元組交換),寫入儲存器的奇儲存體;然後,在第二個匯流排週期內,8086 CPU又發出一個由該奇地址加1的偶地址,此時A0=0,=1,8086 CPU把該字的高8位傳送到資料匯流排的低8位(注意:此時又發生了位元組交換),寫入儲存器的偶儲存體。這樣,經過二次儲存器訪問,才能把一個非規則字寫入儲存器的奇地址字單元。

4 結語

通過上面的分析,我們說可以得到如下的結論,在8086微機系統中,對於按字的讀寫操作(比如字陣列),應儘可能地使要操作的資料,以規則字的方式存放在儲存器中,這樣,可以在一個匯流排週期內,完成一個字的讀寫操作,否則的話就需要用二個匯流排週期,從而使指令的執行時間延長。因此,在編寫組合語言源程式時,涉及到操作多字的時候,往往在存放多字的前面,插入一條偽指令EVEN,目的就是使字的地址從偶地址開始,既使該字成為規則字。

對於16位微機系統中,一個字存入儲存器要佔有相繼的兩個位元組,存放時,低位位元組存入低地址,高位位元組存入高地址,這樣兩個位元組單元就構成了一個字單元,字單元的地址採用它的低地址來表示。

例如:1:MOV AX,

2;MOV AX,

從上面的分析可知,第一條指令中的運算元是以規則字的                形式存放的,用一個匯流排週期的時間,就可以把運算元從儲存器中取出。第二條指令中的運算元是以非規則字的形式存放的,要用二個匯流排週期的時間,才可以把運算元從儲存器中取出。因此,執行第一條指令所需的時間要比執行第二條指令所需的時間少。

32位微機系統中儲存器介面是16位的擴充套件,資料匯流排有32位,故有4個儲存體,每個儲存體佔1GB儲存空間,儲存體選擇線通過位元組允許線BE#0—BE#3實現,每個儲存體要有獨立的寫通訊號。操作機理與8086微機系統基本一致。

參考文獻

沈美明.80X86組合語言程式設計. 北京:清華大學出版社,2000.

周明德.微型計算機系統原理及應用.北京:清華大學出版社,2005.