匯編語言之程序的基本結(jié)構(gòu)_第1頁
匯編語言之程序的基本結(jié)構(gòu)_第2頁
匯編語言之程序的基本結(jié)構(gòu)_第3頁
匯編語言之程序的基本結(jié)構(gòu)_第4頁
匯編語言之程序的基本結(jié)構(gòu)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

千里之行,始于足下。第2頁/共2頁精品文檔推薦匯編語言之程序的基本結(jié)構(gòu)第6章程序的基本結(jié)構(gòu)在前面幾章,我們分不介紹了用匯編語言舉行程序設計所需要的幾個最基本的知識:內(nèi)存單元的尋址方式,變量定義和各種匯編指令格式。在掌握了這些基本內(nèi)容之后,就需要學習怎么把它們組成一具完整的匯編語言程序。

6.1源程序的基本組成

匯編語言源程序的組成部分有:模塊、段、子程序和宏等。一具模塊對應一具目標文件,當開辟較大型的應用程序時,該程序也許由若干個目標文件或庫結(jié)合而成的。有關(guān)模塊和子程序的知識和宏在第7章介紹,有關(guān)宏的知識將在第9章中敘述。

6.1.1段的定義

微機系統(tǒng)的內(nèi)存是分段治理的,為了與之相對應,匯編語言源程序也分若干個段來構(gòu)成。8086CPU有四個段寄存器,在該系統(tǒng)環(huán)境下運行的程序在某個時間最多可拜訪四個段,而80XXX及其往后的CPU都含有六個段寄存器,于是,在這些系統(tǒng)環(huán)境下開辟的運行程序在某個時間最多可拜訪六個段。

別論程序在某個時間最多能拜訪多少個段,在編程序時,程序員都能夠定義比該段數(shù)更多的段。在通常事情下,一具段的長度別能超過64K,在80XXX及其往后系統(tǒng)的愛護方式下,段基地址是32位,段的最大長度可達4G。

段的長度是指該段所占的字節(jié)數(shù):

、假如段是數(shù)據(jù)段,則其長度是其所有變量所占字節(jié)數(shù)的總和;

、假如段是代碼段,則其長度是其所有指令所占字節(jié)數(shù)的總和。

在定義段時,每個段都有一具段名。在取段名時,要取一具具有一定含義的段名。

段定義的普通格式如下:

段名SEGMENT[對齊類型][組合類型][類不]

…;段內(nèi)的具體內(nèi)容

段名ENDS

其中:“段名”必須是一具合法的標識符,前后二個段名要相同??蛇x項“對齊類型”、“組合類型”和“類不”的講明作用請見6.3節(jié)中的敘述。

一具數(shù)據(jù)段的定義例子:

DATA1SEGMENT

word1DW1,9078H,?

byte1DB21,'World'

DD12345678H

DATA1ENDS

一具代碼段的例子:

CODE1SEGMENT

MOVAX,DATA1;把數(shù)據(jù)段DATA1的段值送AX

MOVDS,AX;把AX的值送給DS,即:DS存儲數(shù)據(jù)段的段值

MOVAX,4C00H

INT21H;調(diào)用DOS功能,結(jié)束程序的運行

CODE1ENDS

6.1.2段寄存器的講明語句

在匯編語言源程序中能夠定義多個段,每個段都要與一具段寄存器建立一種對應關(guān)系。建立這種對應關(guān)系的講明語句格式如下:

ASSUME段寄存器名:段名[,段寄存器名:段名,……]

其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定義語句講明時的段名。

在一條ASSUME語句中可建立多組段寄存器與段之間的關(guān)系,每種對應關(guān)系要用逗號分隔。例如,

ASSUMECS:CODE1,DS:DATA1

上面的語句講明了:CS對應于代碼段CODE1,DS對應于數(shù)據(jù)段DATA1。

在ASSUME語句中,還能夠用關(guān)鍵字NOTHING來講明某個段寄存器別與任何段相對應。下面語句講明了段寄存器ES別與某段相對應。

ASSUMEES:NOTHING

在通常事情下,代碼段的第一條語句算是用ASSUME語句來講明段寄存器與段之間的對應關(guān)系。在代碼段的其它位置,還能夠用另一具ASSUME語句來改變前面ASSUME語句所講明的對應關(guān)系,如此,代碼段中的指令就用最近的ASSUME語句所建立的對應關(guān)系來確定指令中的有關(guān)信息。

例6.1匯編語言段及其段講明語句的作用。

DATA1SEGMENT;定義數(shù)據(jù)段DATA1

word1DW5678h

byte1DB"ABCDEFG"

DATA1ENDS

DATA2SEGMENT;定義數(shù)據(jù)段DATA2

word2DW1234h

word3DW9876h

DATA2ENDS

DATA3SEGMENT;定義數(shù)據(jù)段DATA3

byte2DB?

DATA3ENDS

CODE1SEGMENT;編寫代碼段CODE1

CS:CODE1,DS:DATA1,

ASSUME

;(1)

ES:DATA2

MOVAX,DATA1;(2)

MOVDS,AX;(3)

MOVAX,DATA2;(4)

MOVES,AX;(5)

MOVAX,word1;拜訪段DATA1中的字變量word1

MOVword2,AX;拜訪段DATA2中的字變量word2

ASSUMEDS:DATA3,ES:NOTHING;(6)

MOVAX,DATA3

MOVDS,AX

;拜訪段DATA3中的字節(jié)變量MOVBL,byte2

byte2

MOVAX,4C00H;(7)

INT21H;(8)

CODE1ENDS

語句(1)和(6)分不講明了段和段寄存器之間的對應關(guān)系,其中語句(6)重新講明語句(1)所指定的對應關(guān)系。

二組語句(2)和(3)、(4)和(5)實現(xiàn)對段寄存器DS和ES賦初值。ASSUME講明語句只起講明作用,它不可能對段寄存器賦值,因此,必須對有關(guān)段寄存器賦值。在往后的其它源程序中也基本上用此辦法來實現(xiàn)對數(shù)據(jù)段寄存器賦值的。

語句(7)和(8)是調(diào)用中斷21H的4CH號功能來結(jié)束本程序的執(zhí)行,程序的返回代碼由寄存器AL來確定。結(jié)束本程序執(zhí)行的指令是所有主模塊必須書寫的語句。

注意:代碼段寄存器別能由程序員在源程序中對其賦值,其值是由操作系統(tǒng)在裝入它進入系統(tǒng)運行時自動賦值的。

6.1.3堆棧段的講明

堆棧段是一具特別的段,在程序中能夠定義它,也能夠別定義。除了要生成COM型執(zhí)行文件的源程序外,一具完整的源程序普通最好定義堆棧段。假如在程序中別定義堆棧段,這么,操作系統(tǒng)在裝入該執(zhí)行程序時將自動為其指定一具64K字節(jié)的堆棧段。

在程序沒有定義堆棧段的事情下,在由連接程序生成執(zhí)行文件時,將會產(chǎn)生一條如下的警告信息,但程序員能夠別理會它,所生成的執(zhí)行文件是能夠正常運行的。

warningxxxx:nostacksegment(其中:xxxx是錯誤號)在源程序中,可用以下辦法來定義堆棧段。

辦法1:

STACK1SEGMENT

;256是堆棧的長度,可依照需要舉行改

DB256DUP(?)

TOPLABELWORD

STACK1ENDS

以上堆棧段的定義如圖6.1所示。由于堆棧是

按地址從大到小的存儲單元順序來存放內(nèi)容的,所

以,在堆棧存儲單元講明語句之后,再講明一具棧

頂不名,如此,對棧頂寄存器SP的賦值就非常方便。

在源程序的代碼段中,還要添加如下程序段,

圖6.1堆棧段定義示意圖才干把段STACK1當作堆棧段來使用。

ASSUMESS:STACK1;可在代碼段的段指定語句中一起講明

CLI;禁止響應可屏蔽中斷

MOVAX,STACK1

MOVSS,AX

MOVSP,offsetTOP;給堆棧段的棧頂寄存器SP賦初值

STI;恢復響應可屏蔽中斷

辦法2:

STACK1SEGMENTSTACK;定義一具堆棧段,其段名為STACK1

DB256DUP(?)

STACK1ENDS

上述段定義講明了該段是堆棧段,系統(tǒng)會自動把段寄存器SS和棧頂寄存器SP與該堆棧段之間建立相應的關(guān)系,并設置其初值,而別用在代碼段對它們舉行賦值。

除了以上二種辦法外,還有一種更簡潔的辦法來定義堆棧段,有關(guān)內(nèi)容請見第6.4.2節(jié)中的敘述。

6.1.4源程序的結(jié)構(gòu)

下面的程序是一具完整的源程序,其功能是在屏幕上顯示字符串“Hello,World.”。讀者可參考此結(jié)構(gòu)編寫自個兒的簡單程序。

例6.2在屏幕上顯示字符串“HELLO,WORLD.”

解:可運行下面的控件,用鼠標左鍵單擊程序中的某一行,可閱讀其含義;單擊“內(nèi)存”可切換內(nèi)存內(nèi)容的顯示方式。

偽指令END表示源程序到此為止,匯編程序?qū)υ撜Z句之后的任何內(nèi)容都別作處理,因此,通常事情下,偽指令END是源程序的最終一條語句。

偽指令END后面可附帶一具在程序中已定義的標號,由該標號指明程序的啟動位置。

假如源程序是一具獨立的程序或主模塊,這么,偽指令END后面一定要附帶一具標號;假如源程序僅是一具一般模塊,這么,其END后面就一定別能附帶標號。

6.2程序的基本結(jié)構(gòu)

在學習高級語言程序設計時,我們懂了程序的三大要緊結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。在匯編語言的源程序也同樣有此三大結(jié)構(gòu),所別同的是它們的表現(xiàn)形式別同。用高級語言編寫程序時,由于別使用“轉(zhuǎn)移語句”而使這三種結(jié)構(gòu)清楚明了。

但在匯編語言的源程序中,非常難別使用“轉(zhuǎn)移語句”(除非是一些惟獨簡單功能的程序),有時甚至會有各種各樣的“轉(zhuǎn)移語句”。由于存在這些轉(zhuǎn)移語句,就使得:匯編語言源程序的基本結(jié)構(gòu)顯得別太明確。假如源程序的編寫者思維混亂,編寫出來的源程序在結(jié)構(gòu)上就會顯得雜亂無章,反之,假如編寫者條理清楚,安排的操作井然有序,這么,編寫出來的程序在結(jié)構(gòu)上就會一目了然。

總之,別論是高級語言的源程序,依然匯編語言的源程序,其程序的三大基本結(jié)構(gòu)也依然萬變別離其宗的。

6.2.1順序結(jié)構(gòu)

順序結(jié)構(gòu)是最簡單的程序結(jié)構(gòu),程序的執(zhí)行順序算是指令的編寫順序,因此,安排指令的先后次序就顯得至關(guān)重要。另外,在編程序時,還要妥善保存已得到的處理結(jié)果,為后面的進一步處理直截了當提供前面的處理結(jié)果,從而幸免別必要的重復操作。

例6.3編寫程序段,完成下面公式的計算(其中:變量X和Y是32位有符號數(shù),變量A,B和Z是16位有符號數(shù))。

A←(X-Y+24)/Z的商,B←(X-Y+24)/Z的余數(shù)

解:

DATA1SEGMENT

XDD?

YDD?

ZDW?

ADW?

BDW?

DATA1ENDS

CODE1SEGMENT

MOVAX,X

MOVDX,X+2;用(DX:AX)來保存32位變量X的數(shù)值

SUBAX,Y

SBBDX,Y+2;(DX:AX)-(Y+2:Y)

ADDAX,24D

ADCDX,0;(DX:AX)+24

IDIVZ

MOVA,AX

MOVB,DX

CODE1ENDS

在編程序時,常常需要交換二變量之值。假設需要交換值的變量名為:var1和var2,暫時增加的變量名為temp。常用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論