




已閱讀5頁,還剩189頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章 8086匯編語言程序設(shè)計,本章主要內(nèi)容,5.1 匯編語言基礎(chǔ)知識,5.1.1概述 5.1.2匯編源程序的結(jié)構(gòu) 5.1.3匯編語言的語句 5.1.4匯編語言的數(shù)據(jù) 5.1.5匯編語言的操作符與表達(dá)式,5.1.1概述,匯編語言(Assembly Language)是介于機(jī)器語言和高級語言之間的計算機(jī)語言,是一種用符號表示的面向機(jī)器的程序設(shè)計語言。 它比機(jī)器語言易于閱讀、編寫和修改,又比高級語言運(yùn)行速度快,能充分利用計算機(jī)的硬件資源,占用內(nèi)存空間少。 匯編語言常用于計算機(jī)控制系統(tǒng)的開發(fā)和高級語言編譯程序的編制等應(yīng)用場合。采用不同CPU的計算機(jī)有不同的匯編語言。,用匯編語言編寫的程序稱為匯編語言程序或源程序(Source Program)。 匯編語言源程序不能直接在計算機(jī)上運(yùn)行,需要將它翻譯成機(jī)器語言程序(也稱目標(biāo)代碼程序,Object Program)。這個翻譯過程為匯編。 完成匯編任務(wù)的程序(軟件)稱為匯編程序。,匯編程序完成以下幾個任務(wù): 將匯編語言源程序翻譯成目標(biāo)代碼程序; 按指令要求自動分配存儲區(qū)(包括程序區(qū)、數(shù)據(jù)區(qū)等); 自動把源程序中以各種進(jìn)制表示的數(shù)據(jù)都轉(zhuǎn)換成二進(jìn)制形式的數(shù)據(jù); 計算表達(dá)式的值; 對匯編語言源程序進(jìn)行語法檢查,并給出語法出錯的提示信息。,5.1.2匯編源程序的結(jié)構(gòu),匯編語言程序由若干個段組成。 按照各段功能的不同,分別有代碼段、數(shù)據(jù)段、堆棧段和附加段。 其中代碼段是必須要定義的。,【例5-1】 編寫匯編程序,計算2010H +2011H,并把和存入RESULT單元。 DATA SEGMENT ;定義數(shù)據(jù)段 X DW 2010H ;定義被加數(shù) Y DW 2011H ;定義加數(shù) RESULT DW ? ;分配和數(shù)存放單元 DATA ENDS ;數(shù)據(jù)段定義結(jié)束,CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX,MOV AX,X ADD AX,Y MOV RESULT,AX RET MAIN ENDP CODE ENDS END START,匯編語言源程序的特點(diǎn),采用段式結(jié)構(gòu) 匯編源程序通常包含若干個段,上例的程序有數(shù)據(jù)段和代碼段這兩個段,DATA、CODE分別為兩個段的名字。每一段有明顯的起始語句SEGMENT與結(jié)束語句ENDS,這些語句稱為“段定義”語句。 每一段由若干匯編語句構(gòu)成 匯編源程序每一段包含若干匯編語句。匯編語句的主體是匯編指令。一條語句寫一行,為了清晰,書寫語句時,注意語句的各部分要盡量對齊。,匯編語言源程序的特點(diǎn)(續(xù)),每個匯編源程序需要一個啟動標(biāo)號 匯編語言源程序需要一個啟動標(biāo)號作為程序開始執(zhí)行時目標(biāo)代碼的入口地址。啟動標(biāo)號可以按照匯編語言的標(biāo)號命名規(guī)則由程序員自己定義。常用的啟動標(biāo)號有START、BEGIN等。 加入適當(dāng)注釋,可以提高程序的可讀性 為了提高程序的可讀性,可以在匯編語句后以分號“;”為起始標(biāo)志,加入注釋。,匯編語言和操作系統(tǒng)(DOS)的接口 計算機(jī)一旦啟動成功,由DOS掌握CPU的控制權(quán)。應(yīng)用程序只是作為DOS的子程序,應(yīng)用程序執(zhí)行完,必須返回DOS。上述程序的第7行、第9行第11行、第17行和第18行就是為了完成此功能而設(shè)計的。,(1)返回DOS的標(biāo)準(zhǔn)方法,例5-1采用了此方法。具體程序設(shè)計方法如下: 將應(yīng)用程序的主程序定義成一個FAR過程(見上述程序的第7行和第18行),該過程的最后一條指令為RET(見上述程序的第17行); 在代碼段的主程序的開始部分用3條指令,把INT 20H指令的段地址(CS=DS=ES)及偏移地址(0)壓入堆棧(見上述程序的第9行第11行)。 這樣,程序執(zhí)行到主程序的最后一條指令RET時,由于過程具有FAR屬性,故堆棧內(nèi)的兩個字分別彈出到IP及CS,便執(zhí)行INT 20H指令,返回到DOS。,(2)用DOS功能調(diào)用4CH返回,在用戶程序中不定義過程段,刪除上述程序的第7行、第9行第11行和第18行指令,把原第17行的RET指令換成下面兩條指令: MOV AH,4CH INT 21H INT 21H指令是DOS向用戶提供服務(wù)程序的窗口。,5.1.3匯編語言的語句,匯編語言的語句可以分為: 指令語句 偽指令語句 宏指令語句,1.指令語句,指令語句是可執(zhí)行語句,匯編后將產(chǎn)生目標(biāo)代碼,CPU根據(jù)這些目標(biāo)代碼執(zhí)行并完成特定操作。 每一條指令語句表達(dá)了計算機(jī)具有的一個基本能力,這種能力在目標(biāo)程序執(zhí)行時反映出來。 指令語句的格式為: 標(biāo)號: 指令助記符 操作數(shù) ;注釋,2.偽指令語句,偽指令語句,也稱指示性語句,是不可執(zhí)行語句,匯編后不產(chǎn)生目標(biāo)代碼,它僅僅在匯編過程中告訴匯編程序如何匯編源程序。 偽指令語句可以告訴匯編程序哪些語句是屬于一個段、是什么類型的段、各段存入內(nèi)存應(yīng)如何組裝、給變量分配多少存儲單元、給數(shù)字或表達(dá)式命名等。 偽指令語句的功能是由匯編程序匯編源程序時完成的,不是由CPU執(zhí)行目標(biāo)代碼時實現(xiàn)的。,偽指令語句的格式為: 符號名 偽指令助記符 操作數(shù) ;注釋,3.宏指令語句,宏是一個以宏名定義的指令序列。一旦把某程序段定義成宏,則可以用宏名代替那段程序。在匯編時,要對宏進(jìn)行宏展開,即把以宏名表示的地方替換為該宏對應(yīng)的指令序列的目標(biāo)代碼。宏指令可以看成指令語句的擴(kuò)展,相當(dāng)于多條指令語句的集合。 宏指令格式為: 宏名 宏指令助記符 操作數(shù) ;注釋,4.匯編語句格式說明,(1)關(guān)于格式的幾個組成部分 匯編語句的格式中帶中括號的部分是可選項。 各部分之間必須用空格(SPACE)或水平制表符(TAB)隔開。 操作數(shù)項由一個或多個表達(dá)式組成,它為執(zhí)行語句所要求的操作提供需要的信息。,4.匯編語句格式說明(續(xù)),注釋項用來說明程序或語句的功能,注釋項在匯編時不會產(chǎn)生目標(biāo)代碼。注釋項可以跟在語句的后面。分號“;”是注釋項的開始。 當(dāng)分號“;”作為一行的第一個字符時,表示注釋占據(jù)一整行,常用來說明下面一段程序的功能。,4.匯編語句格式說明(續(xù)),(2)關(guān)于標(biāo)號與符號名 標(biāo)號與符號名都稱為名字。 標(biāo)號是可選項,一般設(shè)置在程序的入口處或程序跳轉(zhuǎn)點(diǎn)處,表示一條指令的符號地址,在代碼段中定義,后面必須跟上冒號“:”。 符號名也是一個可選項,可以是常量、變量、段名、過程名、宏名,后面不能跟冒號。,4.匯編語句格式說明(續(xù)),(3)名字的命名規(guī)則 合法符號:字母(不分大小寫)、數(shù)字及特殊符號(“?”,“”,“_”,“$”,“ ”)。 名字可以用除數(shù)字外所有的合法符號開頭。但如果是用到符號“ ”,那么這個符號必須是第一個字符。 名字的有效長度不超過31個英文字符。 不能把保留字(如CPU的寄存器名、指令助記符等)用作名字。,4.匯編語句格式說明(續(xù)),(4)注釋項 注釋項用來說明一段程序、一條或幾條指令的功能,此項是可有可無的。但是,對于匯編語言源程序來說,注釋項可以使程序易于被讀懂;而對編寫程序的人來講,注釋項可以是一種“備忘錄”。,注釋編寫舉例,例如,一般在循環(huán)程序的開始都有初始化程序,置有關(guān)工作單元的初值: MOV CX,100 ;將100送入CX MOV SI,0100H ;將0100H送入SI MOV DI,0200H ;將0200H送入DI MOV CX,100 ;循環(huán)計數(shù)器CX置初值 MOV SI,0100H ;源數(shù)據(jù)區(qū)指針SI置初值 MOV DI,0200H ;目標(biāo)數(shù)據(jù)區(qū)指針DI置初值,5.1.4 匯編語言的數(shù)據(jù),數(shù)據(jù)是匯編語言語句的重要組成部分。 匯編語言能識別的數(shù)據(jù)有: 常量 變量 標(biāo)號,1.常量,常量是沒有任何屬性的純數(shù)值數(shù)據(jù),它的值在匯編期間和程序運(yùn)行過程中不能改變。 匯編語言程序中的常量有: 數(shù)值常量 字符常量 符號常量,(1)數(shù)值常量,在匯編程序中,數(shù)值常量可以用不同進(jìn)制形式表示。 二進(jìn)制常量表示為以字母B(或b)結(jié)尾的由數(shù)字0和1組成的序列,例如,01100101B。 八進(jìn)制常量表示為以字母Q(或q)或O(或o)結(jié)尾的由數(shù)字07組成的序列,例如,145Q。,(1)數(shù)值常量(續(xù)),十六進(jìn)制常量表示為以字母H(或h)結(jié)尾的由數(shù)字09、字母AF(或af)組成的序列,例如,653AH。 十進(jìn)制常量表示為以字母D(或d)結(jié)尾的由數(shù)字09組成的序列。匯編語句中的數(shù)據(jù)默認(rèn)采用十進(jìn)制表示形式,所以,采用十進(jìn)制數(shù)時,也可省略結(jié)尾的字母。例如,101D或100。,1.常量(續(xù)),(2)字符常量 字符常量是用單引號括起來的單個字符,如a、1等。字符常量在操作中體現(xiàn)出的值是其ASCII碼值。,1.常量(續(xù)),(3)符號常量 符號常量是用名字來標(biāo)識的常量。以符號常量代替常量,可以增加程序的可讀性及通用性。,2.變量,變量是存儲單元的符號地址,這類存儲單元的內(nèi)容可以在程序運(yùn)行期間被修改。變量以變量名的形式出現(xiàn)在程序中。同一個匯編程序中,變量只能定義一次。變量具有以下3種屬性。 段屬性:變量所在段的段地址。 偏移屬性:變量所在段的段內(nèi)偏移地址。 類型屬性:變量占用存儲單元的字節(jié)數(shù),如表5-1所示。,3.標(biāo)號,標(biāo)號是指令的符號地址,可用作控制轉(zhuǎn)移指令的操作數(shù)。標(biāo)號具有以下3種屬性。 段屬性:標(biāo)號所在段的段地址。 偏移屬性:標(biāo)號所在段的段內(nèi)偏移地址。 類型屬性:也叫距離屬性,表示標(biāo)號可作為段內(nèi)或段間的轉(zhuǎn)移特性,變量的類型值,5.1.5匯編語言的操作符與表達(dá)式,操作項是匯編語句中的一個重要組成部分,它可以由常量(常數(shù))、寄存器、標(biāo)號、變量或表達(dá)式組成。 表達(dá)式是常量、寄存器、標(biāo)號、變量與一些操作符相組合的序列,分為數(shù)值表達(dá)式和地址表達(dá)式兩種。 匯編程序在匯編時按照一定的規(guī)則對表達(dá)式進(jìn)行計算后可以得到一個數(shù)值或地址值。,1.算術(shù)操作符,算術(shù)操作符有:加(+)、減(-)、乘(*)、除(/)和取余(MOD)。 參加運(yùn)算的數(shù)和運(yùn)算的結(jié)果都是整數(shù)。 除法運(yùn)算的結(jié)果是商的整數(shù)部分。 取余操作的結(jié)果是兩個整數(shù)相除后得到的余數(shù)。,算術(shù)操作符可以用于數(shù)值表達(dá)式或地址表達(dá)式。 當(dāng)它用于地址表達(dá)式時,僅當(dāng)其結(jié)果有明確的物理意義時,才是有效的結(jié)果。 例如,將兩個地址相乘或相除都是沒有意義的。加、減操作可以用于地址表達(dá)式,但也要注意其物理意義。 例如,將兩個地址相加或相減也是沒有意義的。有意義的用法是地址值與一個偏移量相加或相減,可以得到一個新的地址值。,例如: MOV AX,2+3*5 ;匯編后,表達(dá)式2+3*5被數(shù)值17代替 MOV BL,NUM+1 ;表達(dá)式NUM+1是匯編時由匯編程序計算的,不是由CPU在執(zhí)行該指令時才計算的。匯編后得到的目標(biāo)程序中,表達(dá)式被它的值代替。,2.邏輯操作符,邏輯操作符有:與(AND)、或(OR)、非(NOT)和異或(XOR)。 邏輯操作按位進(jìn)行,只適用于數(shù)值表達(dá)式。邏輯操作符指定匯編程序?qū)Σ僮鞣昂蟮膬蓚€數(shù)值或數(shù)值表達(dá)式進(jìn)行指定的邏輯操作。要注意區(qū)分邏輯操作符與邏輯指令。 例如: AND DX,PORT AND 0FH,3.移位操作符,移位操作符有兩個:SHL和SHR,按位操作,只適用于數(shù)值表達(dá)式。 移位操作符的用法如下: 數(shù)值表達(dá)式 SHL 移動位數(shù)n 數(shù)值表達(dá)式 SHR 移動位數(shù)n 匯編程序?qū)褦?shù)字表達(dá)式的值左移(SHL)或右移(SHR)n位。當(dāng)n15時,結(jié)果為0。,4.關(guān)系操作符,關(guān)系操作符用于數(shù)的比較,有相等(EQ)、不相等(NE)、小于(LT)、大于(GT)、小于等于(LE)和大于等于(GE)6種。關(guān)系操作符兩邊的操作數(shù)必須是兩個數(shù)值或同一段中兩個存儲單元地址。關(guān)系操作的運(yùn)算結(jié)果是邏輯值,當(dāng)結(jié)果為真時,表示為0FFFFH;當(dāng)結(jié)果為假時,則表示為0。 例如: MOV AX,4 EQ 3 該指令匯編后的結(jié)果為:MOV AX,0,5.數(shù)值回送操作符,數(shù)值回送操作符的運(yùn)算對象必須是存儲器操作數(shù),即變量或標(biāo)號。操作符加在運(yùn)算對象的前面,返回一個數(shù)值。,6.屬性操作符,屬性操作符用來建立或改變已定義變量、內(nèi)存操作數(shù)或標(biāo)號的類型屬性。 屬性操作符有: PTR 段操作符 THIS SHORT HIGH LOW等。,(1)PTR,格式:類型 PTR 變量 / 標(biāo)號 返回值:具有規(guī)定類型屬性的變量或標(biāo)號。 典型應(yīng)用: 重新指定變量類型 例如,有如下數(shù)據(jù)定義: BUFW DW 1234H,5678H 則下列指令合法: MOV AX,BUFW MOV AL,BYTE PTR BUFW ;臨時改變BUFW的字屬性為字節(jié)屬性,PTR典型應(yīng)用(續(xù)), 指定內(nèi)存操作數(shù)的類型 在寄存器間接尋址、寄存器相對尋址、基址變址尋址或相對基址變址尋址等內(nèi)存尋址方式中,往往很難判斷出操作數(shù)的類型屬性,例如:INC BX。此時,匯編將指示出錯,為了避免出錯,應(yīng)對操作數(shù)類型加以說明,如下所示: INC BYTE PTR BX ;字節(jié)屬性 INC WORD PTR BXSI ;字屬性,PTR典型應(yīng)用(續(xù)), 與EQU一起定義一個新的變量 格式:變量或標(biāo)號 EQU 類型 PTR 說明: 新變量或新標(biāo)號的段屬性、偏移屬性與前一個已定義的變量或標(biāo)號段屬性、偏移屬性相同。,例如: BUFW DW 1234H,5678H BUFB EQU BYTE PTR BUFW ;BUFB的類型屬性為字節(jié) ;其他屬性與BUFW一樣 進(jìn)行字存取時,可用變量BUFW, 如:MOV AX,BUFW 進(jìn)行字節(jié)存取時,可用變量BUFB, 如:MOV AL,BUFB,(2)段操作符 用來指定一個標(biāo)號、變量或地址表達(dá)式的段屬性。 例如: MOV AX,ES:BX ;指定數(shù)據(jù)在ES段,(3)THIS 格式:THIS 類型 可以像PTR一樣建立一個指定類型的地址操作數(shù),該操作數(shù)的段地址和偏移地址與下一個存儲單元地址相同。例如: BUFB EQU THIS BYTE BUFW DW 1234H,5678H 此時BUFB的偏移地址和BUFW完全相同,但它是字節(jié)類型的;而BUFW則是字類型的。,(4)SHORT 格式:SHORT 標(biāo)號 返回值:偏移量在-128+127范圍內(nèi)的標(biāo)號。 用于JMP指令。 即:JMP SHORT 標(biāo)號,指明是短轉(zhuǎn)移。,(5)字節(jié)分離操作符HIGH、LOW 格式:HIGH 表達(dá)式 LOW 表達(dá)式 返回值:表達(dá)式值的高字節(jié)或低字節(jié)。 例如: CONST EQU 0ABCDH MOV AH,HIGH CONST ;AH=0ABH MOV CL,LOW CONST ;CL=0CDH,5.2匯編語言的偽指令,偽指令從表示形式及其在語句中所處的位置,與CPU指令相似,但二者有著重要的區(qū)別。 首先,偽指令不像機(jī)器指令那樣是在程序運(yùn)行期間由CPU來執(zhí)行的,它是在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的操作; 其次,匯編以后,每條CPU指令產(chǎn)生一一對應(yīng)的目標(biāo)代碼,而偽指令則不產(chǎn)生與之相應(yīng)的目標(biāo)代碼。,5.2.1變量定義偽指令,變量定義偽指令用來為數(shù)據(jù)分配存儲單元,建立變量與存儲單元之間的聯(lián)系。 語句格式為: 變量名 數(shù)據(jù)定義偽指令 操作數(shù)1,操作數(shù)2 變量定義偽指令有: DB、DW、DD、DQ、DT,分別用來定義類型屬性為字節(jié)(DB)、字(DW)、雙字(DD)、4字(DQ)、5字(DT)的變量。,變量定義偽指令的操作數(shù)可以是: 數(shù)字常量,允許以十進(jìn)制、八進(jìn)制、十六進(jìn)制、二進(jìn)制等形式表示,默認(rèn)形式是十進(jìn)制; 字符常量,用單引號括起來,被存儲的是該字符的ASCII碼; 符號常量,必須是預(yù)先已定義的符號; 符號“?”,表示預(yù)留空間,內(nèi)容不定。,DUP,表示內(nèi)容重復(fù)的數(shù)據(jù)。 DUP用法的具體形式為: 次數(shù) DUP ( 被重復(fù)內(nèi)容) 例如,數(shù)據(jù)定義如下, DATA_B DB 10,A DATA_W DW 1234H DATA_S DB 1234,2 DUP(1,2 DUP(0),數(shù)據(jù)定義存儲區(qū)示意,DB定義的數(shù)據(jù),每個數(shù)據(jù)元素占據(jù)1個存儲單元; DW定義的數(shù)據(jù),每個數(shù)據(jù)元素占據(jù)2個存儲單元; 字?jǐn)?shù)據(jù)存儲時,低字節(jié)存儲在低地址單元中,高字節(jié)存儲在高地址單元中; 字符在內(nèi)存中存放的是它的ASCII碼,“A”的ASCII碼為41H; DUP可以嵌套使用。 符號地址具有以下關(guān)系: DATA_W=DATA_B+2 DATA_S=DATA_W+2=DATA_B+4,5.2.2符號定義偽指令,符號包括匯編語言的變量名、標(biāo)號名、過程名、寄存器名及指令助記符等。 常用符號定義偽指令有: EQU “=” LABEL,1.EQU偽指令,格式:名字 EQU 表達(dá)式 表達(dá)式可以是一個常數(shù)、已定義的符號、數(shù)值表達(dá)式或地址表達(dá)式。 功能:給表達(dá)式賦予一個名字。定義后,可用名字代替表達(dá)式。在同一源程序中,一個名字只能用EQU定義一次。 例如: PIX EQU 64*1024 ;名字PIX代表數(shù)值表達(dá)式的值 A EQU 7 B EQU A-2,2.等號(=)偽指令,格式:名字 = 表達(dá)式 功能:與EQU基本相同,區(qū)別是它可以對同一個名字重新定義。 例如: COUNT = 10 MOV AL,COUNT COUNT = 5 ,3. LABEL偽指令,格式:變量/標(biāo)號 LABEL 類型 變量的類型有:BYTE、WORD、DWORD、DQ、DT 標(biāo)號的類型有:NEAR、FAR。 功能:定義變量或標(biāo)號的類型,而變量或標(biāo)號的段屬性和偏移屬性由該語句所處的位置確定。,LABEL使用舉例,例如,利用LABEL使同一個數(shù)據(jù)區(qū)有一個以上的類型及相關(guān)屬性。 AREAW LABEL WORD ;AREAW與AREAB指向相同的數(shù)據(jù)區(qū), ;AREAW類型為字,AREAB類型為字節(jié) AREAB DB 100 DUP(?) MOV AX,2011H MOV AREAW,AX ;(AREAW)=2011H MOV BL,AREAB ;BL=11H,5.2.3段定義偽指令,匯編源程序由段組成,每段大小不超過64KB,不同的段存放不同類型的數(shù)據(jù)。 段定義偽指令用于匯編源程序中段的定義。 相關(guān)指令有:SEGMENT、ENDS、ASSUME。,1.段定義偽指令SEGMENT、ENDS,格式: 段名 SEGMENT 定位類型 組合類型 類別名 段名 ENDS 功能:定義一個邏輯段。 SEGMENT和ENDS必須成對使用,它們前面的段名必須是相同的。 SEGMENT后面中括號中的內(nèi)容為可選項,告訴匯編程序和連接程序如何確定段的邊界、如何連接幾個程序模塊。,(1)定位類型,定位類型說明段的起始地址應(yīng)有怎樣的邊界值,有以下4種。 BYTE:表示本段可以從任何地址開始,這種類型段間不留空隙,存儲器利用率高。 WORD:表示本段的起始地址必須為偶地址。 PARA:表示本段從節(jié)邊界開始。8086規(guī)定每16字節(jié)為1小節(jié)。所以,定位類型為PARA的段,其起始地址必為16的倍數(shù)。這種類型簡單,但是段間往往有空隙。定位類型的默認(rèn)值為PARA。 PAGE:表示本段從頁邊界開始。8086規(guī)定每256字節(jié)為1頁,所以,定位類型為PAGE的段,其起始地址必為256的倍數(shù)。,(2)組合類型,組合類型說明鏈接不同模塊中的同名段時采用的方式,有以下6種。 PUBLIC:本段與其他模塊中說明為PUBLIC的同名同類別的段鏈接起來,公用一個段地址,形成一個新的邏輯段,所以偏移量調(diào)整為相對于新邏輯段起始地址的值。 STACK:本段與其他模塊中說明為STACK的同名的堆棧段鏈接起來,公用一個段地址,形成一個新的邏輯段。同時,系統(tǒng)自動初始化SS及SP。,(2)組合類型(續(xù)), COMMON:同名段從同一個內(nèi)存地址開始裝入。所以,各個邏輯段將發(fā)生覆蓋。連接以后,該段長度取決于同名段中最長的那個,而內(nèi)容有效的是最后裝入的那個。 MEMORY:與PUBLIC同義,只不過MEMORY定義的段裝在所有同名段的最后。若連接時出現(xiàn)多個MEMORY,則最先遇到的段按組合類型MEMORY處理,其他段組合類型按PUBLIC處理。,(2)組合類型(續(xù)), PRIVATE:不組合,該段與其他段邏輯上不發(fā)生關(guān)系,即使同名,各段擁有各自的段基值。組合類型的默認(rèn)值為PRIVATE。 AT exp:段地址為表達(dá)式exp的值(長度為16位)。此項不能用于代碼段。例如:AT 0530H,表示本段從物理地址0530H開始。,(3)類別名,類別名必須用單引號括起來。 類別的作用是在連接時決定各邏輯段的裝入順序。 當(dāng)幾個程序模塊進(jìn)行連接時,其中具有相同類別名的段,按出現(xiàn)的先后順序被裝入連續(xù)的內(nèi)存區(qū)。 沒有類別名的段,與其他無類別名的段一起連續(xù)裝入內(nèi)存。 典型的類型名有:“STACK”,“CODE”,“DATA”。,2. ASSUME,格式:ASSUME 段寄存器名:段名,段寄存器名:段名 段寄存器可以是:CS、DS、ES、SS。 段名為已定義的段。 凡是程序中使用的段,都應(yīng)說明它與段寄存器之間的對應(yīng)關(guān)系。 功能:用于明確段與段寄存器的關(guān)系。,ASSUME使用說明,ASSUME偽指令只是指示各邏輯段使用段寄存器的情況,并沒有對段寄存器的內(nèi)容進(jìn)行賦值。 DS、ES的值必須在程序段中用指令語句進(jìn)行賦值,而CS、SS由系統(tǒng)負(fù)責(zé)設(shè)置,程序中也可對SS進(jìn)行賦值,但不允許對CS賦值。,5.2.4過程定義偽指令,過程定義偽指令用于定義過程。指令格式如下: 過程名 PROC 類型 RET 過程名 ENDP 過程名按匯編語言命名規(guī)則設(shè)定,匯編及鏈接后,該名稱表示過程程序的入口地址,供調(diào)用使用。,過程定義偽指令使用說明,PROC與ENDP必須成對出現(xiàn),PROC開始一個過程,ENDP結(jié)束一個過程。成對的PROC與ENDP的前面必須有相同的過程名。 類型取值為:NEAR(為默認(rèn)值)或FAR,表示該過程是段內(nèi)調(diào)用或段間調(diào)用。 一個過程中,至少有一條過程返回指令RET,一般放在ENDP之前。,5.2.5模塊定義和結(jié)束偽指令,TITLE 格式:TITLE 標(biāo)題 功能:TITLE偽指令可指定每一頁上打印的標(biāo)題。標(biāo)題最多可用60個字符。,5.2.5模塊定義和結(jié)束偽指令(續(xù)),2.NAME 格式:NAME 模塊名 功能:為源程序的目標(biāo)程序指定一個模塊名。 如果程序中沒有NAME偽指令,則匯編程序?qū)ITLE偽指令定義的標(biāo)題名前6個字符作為模塊名;如果程序中既沒有NAME,又沒有TITLE,則匯編程序?qū)⒃闯绦虻奈募鳛槟繕?biāo)程序的模塊名。,5.2.5模塊定義和結(jié)束偽指令(續(xù)),3.END 格式:END 標(biāo)號 功能:表示源程序的結(jié)束。 標(biāo)號指示程序開始執(zhí)行的起始地址。如果多個程序模塊相連接,則只有主程序要使用標(biāo)號,其他子模塊則只用END而不必指定標(biāo)號。,5.2.6其他偽指令,1.對準(zhǔn)偽指令EVEN 格式:EVEN 功能:使下一個分配地址為偶地址。 在8086中,一個字的地址最好為偶地址。 因為8086 CPU存取一個字,如果地址是偶地址,需要1個讀或?qū)懼芷冢?如果是奇地址,則需要2個讀或?qū)懼芷?。所以,該偽指令常用于字定義語句之前。,EVEN指令使用說明,DSEG SEGMENT EVEN ARR_W DW 100 DUP(?) DSEG ENDS,5.2.6其他偽指令(續(xù)),2.定位偽指令ORG 格式:ORG 表達(dá)式 表達(dá)式取值范圍為:065535內(nèi)的無符號數(shù)。 功能:指定其后的程序段或數(shù)據(jù)塊所存放的起始地址的偏移量。,ORG偽指令使用說明,例如: MY_DATA SEGMENT ORG 100H MYDAT DW 1,2,$+4 MY_DATA ENDS,5.2.6其他偽指令(續(xù)),3.基數(shù)控制偽指令RADIX 格式:RADIX 表達(dá)式 表達(dá)式取值為216內(nèi)的任何整數(shù)。 功能:指定匯編程序使用的默認(rèn)數(shù)制。默認(rèn)時,使用十進(jìn)制。,RADIX使用舉例,MOV BX,0FFH ;十六進(jìn)制數(shù)要加后綴 MOV BX,150 ;十進(jìn)制數(shù)不要加后綴 RADIX 16 ;設(shè)置十六進(jìn)制為默認(rèn)數(shù)制 MOV AX,0FF ;十六進(jìn)制數(shù)不要加后綴 MOV BX,150D ;十進(jìn)制數(shù)要加后綴,5.3DOS功能調(diào)用,MS-DOS叫磁盤操作系統(tǒng)。它不僅提供了許多命令,還給用戶提供了80多個常用子程序。 DOS功能調(diào)用就是對這些子程序的調(diào)用,也叫系統(tǒng)功能調(diào)用。子程序的順序編號稱為功能調(diào)用號。 DOS功能調(diào)用的過程是: 根據(jù)需要的功能調(diào)用設(shè)置入口參數(shù),把功能調(diào)用號送AH寄存器,執(zhí)行軟中斷指令I(lǐng)NT 21H后,可以根據(jù)有關(guān)功能調(diào)用的說明取得出口參數(shù)。,5.3DOS功能調(diào)用(續(xù)),1.單個字符輸入 功能調(diào)用號AH=01H。 功能:接收從鍵盤輸入的一個字符并在屏幕回顯。輸入字符的ASCII碼存入AL寄存器。若按下組合鍵Ctrl+Break或Ctrl+C,則程序返回DOS。 例如: MOV AH,01H INT 21H,5.3DOS功能調(diào)用(續(xù)),2.字符串輸入 功能調(diào)用號AH=0AH。 功能:接收從鍵盤輸入的一個字符串。 入口參數(shù):存放字符串的接收緩沖區(qū)首地址和最大字符個數(shù)。寄存器DS和DX存放接收緩沖區(qū)首地址,分別存放其段地址和偏移地址;緩沖區(qū)第一字節(jié)存放接收字符串的最大字符個數(shù)。 出口參數(shù):輸入的字符串及實際輸入的字符個數(shù)。緩沖區(qū)第二字節(jié)存放實際輸入的字符個數(shù)(不包括回車符);第三字節(jié)開始存放接收的字符串。,5.3DOS功能調(diào)用(續(xù)),2.字符串輸入(續(xù)) 說明: 字符串必須以回車鍵結(jié)束,回車符是接收到的字符串的最后一個字符。 如果輸入的字符數(shù)超過設(shè)定的最大字符個數(shù),則隨后的輸入字符被丟失并響鈴,直到遇到回車鍵為止。 如果在輸入時按組合鍵Ctrl+C或Ctrl+Break,則結(jié)束程序。,5.3DOS功能調(diào)用(續(xù)),2.字符串輸入(續(xù)) DATA SEGMENT BUF DB 100 DB ? DB 100 DUP(?) DATA ENDS CODE SEGMENT MOV DX,OFFSET BUF MOV AH,10 INT 21H CODE ENDS,5.3DOS功能調(diào)用(續(xù)),3.單字符輸出 功能調(diào)用號AH=02H。 功能:在屏幕上顯示一個字符。 入口參數(shù):要顯示的字符的ASCII碼保存于寄存器DL。 例如: MOV DL,2 MOV AH,2 INT 21H,5.3DOS功能調(diào)用(續(xù)),4.字符串輸出 功能調(diào)用號AH=9。 功能:在屏幕上顯示一個字符串。 入口參數(shù):是被輸出字符串首址,接收入口參數(shù)的是寄存器DS和DX,分別存入被輸出字符串首址的段基值和偏移量。 采用9號功能輸出字符串,要求字符串以“$”結(jié)束,該字符作為字符串結(jié)束符,不輸出。,5.3DOS功能調(diào)用(續(xù)),4.字符串輸出(續(xù)) 例如: DATA SEGMENTS STRING DB Hello ASM!$;定義字符串 DATA ENDS CODE SEGMENT MOV DX,OFFSET STRING MOV AH,9 INT 21H CODE ENDS,5.3DOS功能調(diào)用(續(xù)),5.進(jìn)程終止 功能調(diào)用號AH=4CH。 功能:結(jié)束當(dāng)前程序,返回DOS。 例如: MOV AH,4CH 或 MOV AX,4C00H INT 21H,5.3.2 BIOS功能調(diào)用,BIOS常駐ROM,獨(dú)立于DOS,可與任何操作系統(tǒng)一起工作。 它的主要功能是驅(qū)動系統(tǒng)所配置的外部設(shè)備,如磁盤驅(qū)動器、顯示器、打印機(jī)及異步通信接口等。 通過INT 10HINT 1AH向用戶提供服務(wù)程序的入口,使用戶無須對硬件有深入了解,就可完成對I/O設(shè)備的控制與操作。 BIOS的中斷調(diào)用與DOS功能調(diào)用類似。,5.3.2BIOS功能調(diào)用(續(xù)),鍵盤I/O程序以16H號中斷處理程序的形式存在,它提供若干功能,每一個功能有一個編號。 在調(diào)用鍵盤I/O程序時,把功能編號置入AH寄存器,然后發(fā)出中斷指令I(lǐng)NT 16H。調(diào)用返回后,從有關(guān)寄存器中取得出口參數(shù)。,5.3.2BIOS功能調(diào)用舉例,例如: MOV AH,0 INT 16H 上面的程序段利用BIOS中斷服務(wù),實現(xiàn)從鍵盤讀一個字符的功能。,5.4匯編語言程序設(shè)計,8086匯編語言程序采用模塊化結(jié)構(gòu),通常由一個主程序模塊和多個子程序(過程)模塊構(gòu)成。 對于簡單程序,只有主程序模塊,沒有子程序模塊。 匯編語言程序有3種基本結(jié)構(gòu): 順序結(jié)構(gòu) 分支結(jié)構(gòu) 循環(huán)結(jié)構(gòu),5.4.1程序的質(zhì)量標(biāo)準(zhǔn),衡量程序的質(zhì)量通常有以下幾個標(biāo)準(zhǔn): 程序正確、完整; 程序易讀性強(qiáng); 程序的執(zhí)行速度快; 程序占內(nèi)存小,程序代碼的行數(shù)少。,5.4.2匯編語言程序設(shè)計的基本步驟, 分析問題,抽象出描述問題的數(shù)學(xué)模型; 確定解決問題的算法或算法思想; 程序模塊劃分在解決復(fù)雜實際問題時,往往需要把它分成若干功能模塊,在進(jìn)行功能模塊劃分后,必須確定各功能模塊間的通信問題; 繪制各功能模塊流程圖或結(jié)構(gòu)圖; 分配存儲空間、寄存器等工作單元;,5.4.2匯編語言程序設(shè)計的基本步驟(續(xù)), 根據(jù)流程圖,編寫程序; 靜態(tài)檢查,糾正錯誤; 上機(jī)運(yùn)行調(diào)試,糾正錯誤,直至測試通過; 整理資料,建立完整的文檔。,5.4.3順序結(jié)構(gòu)程序設(shè)計,順序結(jié)構(gòu)程序又稱簡單程序。 采用這種結(jié)構(gòu)的程序,按照指令書寫的順序逐條執(zhí)行,程序的執(zhí)行路徑?jīng)]有分支和循環(huán)。,順序結(jié)構(gòu)程序設(shè)計舉例,【例5-2】編程將內(nèi)存數(shù)據(jù)段字節(jié)單元INDAT存放的一個數(shù)n(假設(shè)0 n 9 ),以十進(jìn)制形式在屏幕上顯示出來。 例如,若INSTR單元存放的是數(shù)8,則在屏幕上顯示:8D。,【例5-2】程序代碼,DATA SEGMENT ;數(shù)據(jù)段定義 INDAT DB 8 DATA ENDS CODE SEGMENT ;代碼段定義 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化DS,【例5-2】程序代碼(續(xù)),MOV DL,INDAT OR DL,30H MOV AH 2 INT 21H MOV DL,D MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,5.4.4 分支結(jié)構(gòu)程序設(shè)計,分支結(jié)構(gòu)程序利用條件轉(zhuǎn)移指令或跳轉(zhuǎn)表,使程序執(zhí)行完某條指令后,根據(jù)指令執(zhí)行后狀態(tài)標(biāo)志的情況選擇要執(zhí)行哪個程序段。 分支結(jié)構(gòu)程序的指令執(zhí)行順序與指令的存儲順序不一致。 轉(zhuǎn)移指令JMP和Jcc可以實現(xiàn)分支結(jié)構(gòu)。,分支結(jié)構(gòu)的三種形式,單分支結(jié)構(gòu)程序設(shè)計舉例,【例5-3】編寫程序段,求AX中存放的帶符號數(shù)的絕對值,結(jié)果存RES單元。 CMP AX,0 JGE ISPOSITIVE NEG AX ISPOSITIVE: MOV RES,AX 本例采用的是單分支結(jié)構(gòu)。特點(diǎn)是:條件成立時程序跳轉(zhuǎn);否則,順序執(zhí)行。,雙分支結(jié)構(gòu)程序設(shè)計舉例,【例5-4】 編程判斷DAT單元存放的帶符號數(shù)的正負(fù)。 如該數(shù)為負(fù)數(shù),則顯示“DAT is a negative number!”;否則顯示“DAT is a nonnegative number!”。,【例5-4】(續(xù)),DATA SEGMENT ;數(shù)據(jù)段定義 N DB DAT is a negative number!,$ NN DB DAT is a nonnegative number! $ DATA ENDS CODE SEGMENT ;代碼段定義 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;設(shè)置DS,【例5-4】(續(xù)),MOV AX,-3 CMP AX,0 JGE ISNN LEA DX,N MOV AH,9 INT 21H JMP FINISH,【例5-4】(續(xù)),ISNN: LEA DX,NN MOV AH,9 INT 21H FINISH: MOV AH,4CH INT 21H CODE ENDS END START,【例5-4】(續(xù)),【例5-4】采用的是雙分支結(jié)構(gòu)。 采用這種結(jié)構(gòu)時,特別要注意第一個分支后要利用JMP指令(程序第16行)使程序跳轉(zhuǎn)到第二個分支的后面。,多分支結(jié)構(gòu)程序設(shè)計舉例,【例5-5】 編程求分段函數(shù)Y的值。已知變量X為16位帶符號數(shù),分段函數(shù)的值要求保存到字單元Y中。函數(shù)定義如下:,【例5-5】(續(xù)),DATA SEGMENT ;數(shù)據(jù)段定義 X DW -128 Y DW ? DATA ENDS CODE SEGMENT ;代碼段定義 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX,【例5-5】(續(xù)),MOV AX,X CMP AX,0 JG ISPN JZ ISZN MOV Y,-1 JMP FINISH ISPN: MOV Y,1 JMP FINISH ISZN: MOV Y,0,【例5-5】(續(xù)),FINISH: MOV AH,4CH INT 21H CODE ENDS END START 本例實現(xiàn)的是多分支結(jié)構(gòu)。 設(shè)計多分支結(jié)構(gòu)程序時,應(yīng)注意: 要為每個分支安排出口; 各分支的公共部分盡量集中,以減少程序代碼; 無條件轉(zhuǎn)移沒有范圍的限制,但條件轉(zhuǎn)移指令只能在-128+127字節(jié)范圍內(nèi)轉(zhuǎn)移; 調(diào)試程序時,要對每個分支進(jìn)行調(diào)試。,5.4.5 循環(huán)結(jié)構(gòu)程序設(shè)計,當(dāng)程序處理的問題需要包含多次重復(fù)執(zhí)行某些相同的操作時,在程序中可使用循環(huán)結(jié)構(gòu)來實現(xiàn),即用同一組指令,每次替換不同的數(shù)據(jù),反復(fù)執(zhí)行這一組指令。 使用循環(huán)結(jié)構(gòu),可以縮短程序代碼,提高編程效率。,循環(huán)結(jié)構(gòu)程序的組成,循環(huán)程序由以下3個部分組成。 (1)初始化部分 初始化部分是循環(huán)的準(zhǔn)備部分,在這部分應(yīng)完成地址指針、循環(huán)計數(shù)、結(jié)束條件等初值的設(shè)置。 (2)循環(huán)體 循環(huán)體包括以下3個部分。 循環(huán)工作部分:是循環(huán)程序的主體。完成程序的基本操作,循環(huán)多少次,這部分語句就執(zhí)行多少次。 循環(huán)修改部分:修改循環(huán)工作部分的變量地址等,保證每次循環(huán)參加執(zhí)行的數(shù)據(jù)能發(fā)生有規(guī)律的變化。,循環(huán)結(jié)構(gòu)程序的組成(續(xù)),循環(huán)控制部分:控制循環(huán)執(zhí)行的次數(shù),檢測和修改循環(huán)控制計數(shù)器,控制循環(huán)的運(yùn)行和結(jié)束。 (3)循環(huán)結(jié)束部分 在循環(huán)結(jié)束部分,完成循環(huán)結(jié)束后的處理,如數(shù)據(jù)分析、結(jié)果的存放等。,循環(huán)程序結(jié)構(gòu),設(shè)計循環(huán)結(jié)構(gòu)程序時,要注意以下問題: 選用計數(shù)循環(huán)還是條件循環(huán),采用直到型循環(huán)結(jié)構(gòu)還是當(dāng)型循環(huán)結(jié)構(gòu); 可以用循環(huán)次數(shù)、計數(shù)器、標(biāo)志位、變量值等多種方式來作為循環(huán)的控制條件,進(jìn)行選擇時,要綜合考慮循環(huán)執(zhí)行的條件和循環(huán)退出的條件; 注意不要把初始化部分放到循環(huán)體中,循環(huán)體中要有能改變循環(huán)條件的語句。,循環(huán)結(jié)構(gòu)程序設(shè)計舉例,【例5-6】 編程顯示以“!”結(jié)尾的字符串。 如:“Welcome to MASM!”。,【例5-6】(續(xù)),DATA SEGMENT MYSTR DB Welcome to MASM! DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX,【例5-6】(續(xù)),LEA SI,MYSTR NEXTCHAR: MOV DL,SI CMP DL,! JZ FINISH MOV AH,2 INT 21H INC SI JMP NEXTCHAR,【例5-6】(續(xù)),FINISH: MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START 由于只知道循環(huán)結(jié)束的條件是該字符串以“!”結(jié)束,不知道字符串的長度,所以,采用了條件控制的方法來控制循環(huán)的次數(shù)。,循環(huán)結(jié)構(gòu)程序設(shè)計舉例(續(xù)),【例5-7】 編程以二進(jìn)制形式顯示BX的值(假設(shè)為無符號數(shù))。 如果(BX)=20,那么顯示:0000000000010100B。 CODE SEGMENT ASSUME CS:CODE START: MOV AX,DATA MOV DS,AX,【例5-7】(續(xù)),MOV BX,20 MOV CX,16 ; 計數(shù)器CX,置初值16 NEXTCHAR: ROL BX,1 ;顯示順序是從左往右, MOV DL,BL ;要顯示的值僅占最低位D0 AND DL,1 ;清除D7D1 OR DL,30H,【例5-7】(續(xù)),MOV AH,2 INT 21H ;利用2號DOS調(diào)用顯示 LOOP NEXTCHAR ;循環(huán)執(zhí)行16次 FINISH: MOV DL,B MOV AH,2 INT 21H ;利用2號DOS調(diào)用,顯示B,【例5-7】(續(xù)),MOV AH,4CH INT 21H ; 返回操作系統(tǒng) CODE ENDS END START 本例中,由于已知BX是16位的,因此,循環(huán)的次數(shù)就是16次,所以可以采用計數(shù)法控制循環(huán)。,5.4.6子程序設(shè)計,在許多應(yīng)用程序中,常常需要多次用到一段程序。這時,為了避免重復(fù)編寫程序,節(jié)省內(nèi)存空間,可以把該程序段獨(dú)立出來,以供其他程序調(diào)用,這段程序稱為“子程序”或“過程”。 子程序是可供其他程序調(diào)用的具體特定功能的程序段。 調(diào)用子程序的程序體,稱為“主程序”或“調(diào)用程序”。,采用子程序進(jìn)行程序設(shè)計的注意點(diǎn),現(xiàn)場保護(hù)和恢復(fù) 所謂“現(xiàn)場保護(hù)”是指子程序運(yùn)行時,對可能破壞的主程序用到的寄存器、堆棧、標(biāo)志位、內(nèi)存數(shù)據(jù)值進(jìn)行的保護(hù)。 所謂“現(xiàn)場恢復(fù)”指由子程序結(jié)束運(yùn)行返回主程序時,對被保護(hù)的寄存器、堆棧、標(biāo)志位、內(nèi)存數(shù)據(jù)值的恢復(fù)。常利用堆棧和空閑的存儲區(qū)實現(xiàn)現(xiàn)場保護(hù)和現(xiàn)場恢復(fù)。,子程序嵌套 一個程序可以調(diào)用某個子程序,該子程序可以調(diào)用其他子程序,這就形成了子程序嵌套。 子程序嵌套調(diào)用的層次不受限制,其嵌套層數(shù)稱為“嵌套深度”。 由于子程序中使用堆棧來保護(hù)斷點(diǎn),堆棧操作的“后進(jìn)先出”特性能自動保證各個層次子程序斷點(diǎn)的正確入棧和返回。 在嵌套子程序設(shè)計中,應(yīng)注意寄存器的保護(hù)和恢復(fù),避免各層子程序之間寄存器發(fā)生沖突。特別是在子程序中使用PUSH、POP指令時,要格外小心,以免造成子程序無法正確返回。,參數(shù)傳遞 主程序在調(diào)用子程序時,經(jīng)常需要向子程序傳遞一些參數(shù)或控制信息,子程序執(zhí)行完成后,也常常需要把運(yùn)行的結(jié)果返回給調(diào)用程序,這種調(diào)用程序和子程序之間的信息傳遞,稱為“參數(shù)傳遞”。 參數(shù)傳遞的主要方法有:寄存器傳遞、內(nèi)存變量傳遞和堆棧傳遞。 傳遞的內(nèi)容如果是數(shù)據(jù)本身,稱為“值傳遞”;如果是數(shù)據(jù)所在單元的地址,稱為“地址傳遞”。,4.編寫子程序調(diào)用方法說明 為了方便地使用子程序,應(yīng)編寫子程序調(diào)用說明。 子程序調(diào)用方法說明包括: 子程序功能 入口參數(shù) 出口參數(shù) 使用的寄存器或存儲器及調(diào)用實例。,子程序設(shè)計舉例,【例5-8】 利用寄存器傳遞參數(shù)。編寫子程序,實現(xiàn)以二進(jìn)制形式顯示BX的值(假設(shè)為無符號數(shù))。,【例5-8】(續(xù)),;- ;子程序名:DISP_BINARY ;功能:以二進(jìn)制形式顯示BX的值(假設(shè)為無符號數(shù)) ;入口參數(shù):BX ;出口參數(shù):無 ;- DISP_BINARY PROC PUSH CX PUSH DX PUSH AX PUSHF ;保護(hù)現(xiàn)場,【例5-8】(續(xù)),MOV CX,16 NEXTCHAR: ROL BX,1 MOV DL,BL AND DL,1 OR DL,30H MOV AH,2 INT 21H LOOP NEXTCHAR,【例5-8】(續(xù)),FINISH: MOV DL,B MOV AH,2 INT 21H POPF ;恢復(fù)現(xiàn)場 POP AX POP DX POP CX RET DISP_BINARY ENDP,【例5-8】(續(xù)),本例利用寄存器BX傳遞參數(shù)。 作為出口參數(shù)的寄存器是不能保護(hù)的,否則就失去了傳遞參數(shù)的作用; 作為入口參數(shù)的寄存器可以保護(hù)也可以不保護(hù)。 由于寄存器的數(shù)量有限,這種方法只適用于少量數(shù)據(jù)的傳遞。 當(dāng)有大量數(shù)據(jù)要傳遞時,需要用到指定單元或堆棧的方法傳遞參數(shù)。,子程序設(shè)計舉例(續(xù)),【例5-9】 利用指定存儲單元進(jìn)行參數(shù)傳遞,編程利用子程序?qū)崿F(xiàn)數(shù)據(jù)塊的復(fù)制。 SSEG SEGMENT DW 64 DUP(?) TOS LABEL WORD SSEG ENDS,【例5-9】(續(xù)),DATA SEGMENT BUF1 DB 1,2,3,4,5,6,7,8,9,100 BUF2 DB 10 DUP(?) SRCADDR DW ? DSTADDR DW ? LEN DW ? DATA ENDS,【例5-9】(續(xù)),CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:SSEG,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,SSEG MOV SS,AX MOV SP,OFFSET TOS,【例5-9】(續(xù)),LEA AX,BUF1 MOV SRCADDR,AX ; 置源數(shù)據(jù)區(qū)首地址 LEA AX,BUF2 MOV DSTADDR,AX ; 置目的數(shù)據(jù)區(qū)首地址 MOV LEN,10 ; 置數(shù)據(jù)塊長度 CALL MOVEMYDAT ;調(diào)用子程序MOVEMYDAT MOV AH,4CH INT 21H,【例5-9】(續(xù)),;- ;子程序名:MOVEMYDAT ;功能:數(shù)據(jù)塊復(fù)制 ;入口參數(shù):源數(shù)據(jù)區(qū)首地址存SRCADDR ;入口參數(shù):目的數(shù)據(jù)區(qū)首地址存DSTADDR,數(shù)據(jù)塊長度存LEN ;出口參數(shù):無 ;-,【例5-9】(續(xù)),MOVEMYDAT PROC MOV SI,SRCADDR MOV DI,DSTADDR MOV CX,LEN STD ADD SI,CX DEC SI ADD DI,CX DEC DI BEGIN: REP MOVSB RET MOVEMYDAT ENDP CODE ENDS END START,本例利用指定存儲單元進(jìn)行參數(shù)傳遞。這種方法實現(xiàn)的子程序通用性較差。,【例5-10】 利用堆棧進(jìn)行參數(shù)傳遞。 編程利用子程序求2個含有10個元素的無符號字節(jié)數(shù)組AD1和AD2對應(yīng)元素之和,計算結(jié)果存入SUM字節(jié)數(shù)組(不考慮運(yùn)算結(jié)果溢出的情況)。,【例5-10】(續(xù)),SSEG SEGMENT STACK STACK DW 64 DUP(?) TOS LABEL WORD SSEG ENDS DATA SEGMENT AD1 DB 1,2,3,4,5,6,7,8,9,100 AD2 D
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙生意干股合同范本
- 勞動工作合同范本
- 廈門駕校培訓(xùn)合同范本
- 紀(jì)錄片《瘋狂攝影師》漢英交傳實踐報告
- 工業(yè)機(jī)器人離線編程練習(xí)題庫及參考答案
- 用戶心理在電子商務(wù)運(yùn)營中的運(yùn)用
- 通信管道合同范本
- 特殊電機(jī)采購合同范本
- 美容學(xué)徒收費(fèi)合同范本
- 空調(diào)拆裝合同范本
- 《輕鋼建筑》課件
- 尿源性膿毒血癥護(hù)理
- 2024解析:第十一章 功和機(jī)械能-講核心(解析版)
- 中建住宅樓懸挑卸料平臺專項施工方案
- 【MOOC】數(shù)據(jù)庫系統(tǒng)(下):管理與技術(shù)-哈爾濱工業(yè)大學(xué) 中國大學(xué)慕課MOOC答案
- 日本留學(xué)中介簽約合同
- 鐵路安全應(yīng)急預(yù)案
- 《城市軌道交通車輛構(gòu)造》 課件 2.2 不銹鋼車體結(jié)構(gòu)認(rèn)知
- 古詩詞誦讀《李憑箜篌引》 公開課一等獎創(chuàng)新教案統(tǒng)編版高中語文選擇性必修中冊
- 小學(xué)生日常行為規(guī)范實施方案
- 2024年遼寧省鞍山岫巖滿族自治縣事業(yè)單位招聘(150人)歷年高頻難、易錯點(diǎn)500題模擬試題附帶答案詳解
評論
0/150
提交評論