




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、微機(jī)原理與接口技術(shù)主講:陸強(qiáng) 信息工程學(xué)院 電子信息教研室第5章 匯編語(yǔ)言程序設(shè)計(jì)5.1 匯編語(yǔ)言的特點(diǎn)(了解)5.2 匯編語(yǔ)言程序結(jié)構(gòu)和基本語(yǔ)法(重點(diǎn))5.3 匯編語(yǔ)言程序設(shè)計(jì)基本方法(重點(diǎn))5.4 Windows匯編語(yǔ)言程序設(shè)計(jì)(自學(xué))5.5 匯編語(yǔ)言與高級(jí)語(yǔ)言的混合編程(自學(xué))5.1 匯編語(yǔ)言的特點(diǎn) 匯編語(yǔ)言的定義: 匯編語(yǔ)言(ASSEMBLY LANGUAGE)是一種以處理器指令系統(tǒng)為基礎(chǔ)的低級(jí)程序設(shè)計(jì)語(yǔ)言,它采用助記符來(lái)表示操作碼,用標(biāo)識(shí)符號(hào)來(lái)表示操作數(shù)地址碼。 匯編語(yǔ)言程序特點(diǎn): 與機(jī)器相關(guān); 執(zhí)行效率高; 編程復(fù)雜。5.2 匯編語(yǔ)言程序結(jié)構(gòu)和基本語(yǔ)法 5.2.1 示例程序 例5-
2、1: 功能:求C=A+B(A、B、C均為字節(jié)數(shù)據(jù))。 在高級(jí)語(yǔ)言中,完成某個(gè)加法功能,我們可采用語(yǔ)句C=A+B,只要給變量A和B賦一確定值,此加法就可以實(shí)現(xiàn)了。 在匯編語(yǔ)言中則不同, 程序必須指出A,B存放在何處,相加后的結(jié)果又存放在何處,然后才能實(shí)現(xiàn)這一加法運(yùn)算。 顯然, 匯編語(yǔ)言在通過(guò)程序告訴計(jì)算機(jī)做什么和如何做時(shí),顯得更加具體。正是這種具體, 使得該語(yǔ)言與計(jì)算機(jī)(處理器)緊密相關(guān), 從而也要求學(xué)習(xí)和使用匯編語(yǔ)言的人對(duì)處理器的結(jié)構(gòu)有更加深入的了解。DATA SEGMENT;定義段DATA ADB 12H;定義變量A,其值為12H BDB 34H;定義變量B,其值為34H C DB ?;定義
3、變量C,但沒(méi)有賦值DATA ENDS;DATA段定義結(jié)束 CODE SEGMENT;定義段CODE ASSUME CS:CODE, DS:DATA ;規(guī)定DATA、CODE為數(shù)據(jù)段和代碼段 START: MOVAX,DATA ;用標(biāo)號(hào)START指明程序執(zhí)行的起始點(diǎn) MOVDS,AX;給數(shù)據(jù)段寄存器DS賦值 MOVAL,A;將變量A的值送入寄存器AL ADDAL,B;將AL的值與變量B的值相加,和存入AL MOVC,AL;將AL的值送給變量C MOVAH,4CH INT21H;調(diào)用DOS中斷,退出程序并返回DOS狀態(tài)CODE ENDS;CODE段定義結(jié)束 ENDSTART;整個(gè)源程序結(jié)束 匯編語(yǔ)
4、言源程序由若干個(gè)段組成(完整的匯編語(yǔ)言源程序由數(shù)據(jù)段、代碼段、附加段、堆棧段組成,其中代碼段是不可缺少的),在代碼段中用ASSUME偽指令將段地址與段寄存器的對(duì)應(yīng)關(guān)系告訴匯編程序,每個(gè)段以SEGMENT語(yǔ)句開(kāi)始,以ENDS語(yǔ)句結(jié)束,整個(gè)源程序以END結(jié)束。 段由若干語(yǔ)句組成,一條語(yǔ)句一般寫(xiě)在一行上,書(shū)寫(xiě)時(shí)語(yǔ)句的各部分應(yīng)盡量對(duì)齊。 匯編語(yǔ)言程序中至少要有一個(gè)啟動(dòng)標(biāo)號(hào),作為程序開(kāi)始執(zhí)行時(shí)目標(biāo)代碼的入口地址。啟動(dòng)標(biāo)號(hào)常用START、BEGIN等命名。 為增加程序的可讀性,可在匯編語(yǔ)言語(yǔ)句“;”后加上注釋。 為保證在執(zhí)行過(guò)程中數(shù)據(jù)段地址的正確性,在源程序中需要對(duì)DS寄存器進(jìn)行初始化。 為了在程序結(jié)束時(shí)
5、返回DOS,一般通過(guò)調(diào)用DOS中斷的4CH子功能來(lái)實(shí)現(xiàn)。5.2 匯編語(yǔ)言程序結(jié)構(gòu)和基本語(yǔ)法 5.2.2 基本概念 匯編語(yǔ)言源程序由語(yǔ)句序列構(gòu)成。 其語(yǔ)句序列可分為3種類(lèi)型: 指令語(yǔ)句 偽指令語(yǔ)句 宏指令語(yǔ)句 匯編語(yǔ)言中的語(yǔ)句 即可執(zhí)行語(yǔ)句(即第4章中介紹的處理器指令系統(tǒng)),在匯編后要產(chǎn)生對(duì)應(yīng)的目標(biāo)代碼,CPU根據(jù)這些代碼執(zhí)行相應(yīng)的操作。 格式: 標(biāo)號(hào): 操作數(shù) ;注釋 舉例: START: MOV AX,DATA ;用標(biāo)號(hào)START指明程 ;序執(zhí)行的起始點(diǎn) 指令語(yǔ)句 即不可執(zhí)行語(yǔ)句,在匯編中不產(chǎn)生目標(biāo)代碼,用于指示匯編程序如何匯編源程序,利用它定義和說(shuō)明常量和變量的屬性及存儲(chǔ)器單元的分配等。
6、格式: 名字 操作數(shù) ;注釋 舉例: A DB 12H ;定義變量A,其值為12H 偽指令語(yǔ)句(結(jié)合5.2.3) 即以一個(gè)宏名定義的一段指令序列,在匯編中凡是出現(xiàn)宏指令語(yǔ)句的地方,都會(huì)有相應(yīng)的指令語(yǔ)句序列的目標(biāo)代碼插入。 格式: 標(biāo)號(hào): 實(shí)參表 ;注釋 宏指令語(yǔ)句(結(jié)合5.2.5)標(biāo)號(hào)和名字稱(chēng)為標(biāo)識(shí)符,匯編語(yǔ)言中標(biāo)識(shí)符的組成規(guī)則如下:標(biāo)識(shí)符由字母、數(shù)字及規(guī)定的特殊符號(hào)(如 _、$、?、)組成;標(biāo)識(shí)符必須以字母打頭;標(biāo)識(shí)符字符長(zhǎng)度不得超過(guò)31;默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識(shí)符中字母的大小寫(xiě);用戶(hù)定義標(biāo)識(shí)符必須是唯一的,且不能與匯編語(yǔ)言專(zhuān)用的保留字重名。標(biāo)號(hào)用來(lái)指向一條指令或宏指令,表示后面的指令
7、第一個(gè)字節(jié)存放的內(nèi)存地址,標(biāo)號(hào)常作為轉(zhuǎn)移指令的操作數(shù),確定程序轉(zhuǎn)移的目標(biāo)地址;名字用來(lái)指向一條偽指令,用作變量名時(shí),表示變量存放在內(nèi)存中首字節(jié)的地址。指令的操作數(shù)可以是立即數(shù)、寄存器和存儲(chǔ)單元;偽指令的操作數(shù)可以是常數(shù)、變量名、表達(dá)式等;若有多個(gè)操作數(shù)時(shí),操作數(shù)之間用逗號(hào)間隔。由分號(hào)“;”后的部分為注釋內(nèi)容,用以增加源程序的可讀性,匯編程序在翻譯源程序時(shí)將跳過(guò)該部分,對(duì)它們不做任何處理。 匯編語(yǔ)句使用說(shuō)明 名字和標(biāo)號(hào)都具有3種屬性: 段屬性:表示標(biāo)號(hào)或變量所在段基址,標(biāo)號(hào)的段基址在CS段寄存器中,變量的段基址在DS或ES中。 偏移屬性:表示標(biāo)號(hào)或變量所在的段內(nèi)偏移地址,它代表從段的起始地址到定
8、義標(biāo)號(hào)或變量的位置之間的字節(jié)數(shù),段基址和偏移地址組成標(biāo)號(hào)或變量的邏輯地址。 類(lèi)型屬性:當(dāng)標(biāo)號(hào)作為轉(zhuǎn)移類(lèi)指令的操作數(shù)時(shí),可在段內(nèi)或段間轉(zhuǎn)移,其屬性有NEAR(段內(nèi)轉(zhuǎn)移)和FAR(段間轉(zhuǎn)移)2種,若沒(méi)有對(duì)標(biāo)號(hào)進(jìn)行類(lèi)型說(shuō)明,就默認(rèn)為NEAR屬性;對(duì)于變量,類(lèi)型屬性說(shuō)明變量在內(nèi)存中占多少個(gè)字節(jié),其屬性有BYTE(字節(jié))、WORD(字)、DOUBLE WORD(雙字)3種。 匯編語(yǔ)句使用說(shuō)明(續(xù)) 匯編語(yǔ)言中的常量與變量 常量:匯編中允許的常量有整數(shù)常量和字符串常量?jī)煞N。 變量:匯編語(yǔ)言中的變量用來(lái)表示存放在內(nèi)存中操作數(shù),它的值是可以改變的,變量的值就是操作數(shù)在內(nèi)存中首字節(jié)的地址,變量要事先定義才能使用
9、。對(duì)于變量,類(lèi)型屬性說(shuō)明變量在內(nèi)存中占多少個(gè)字節(jié),其屬性有BYTE(字節(jié))、WORD(字)、DOUBLE WORD(雙字)3種。 整數(shù)常量可以采用4種表示方法: 二進(jìn)制常量:由數(shù)字0、1組成的序列,且以字母B結(jié)尾。 十進(jìn)制常量:由數(shù)字09組成的序列,結(jié)尾可以加上字母D。 八進(jìn)制常量:由數(shù)字07組成的序列,且以字母Q(或字母O)結(jié)尾。 十六進(jìn)制常量:由數(shù)字09、字母AF(或AF)組成的序列,以字母H結(jié)尾。 (為了避免與標(biāo)識(shí)符相混淆,十六進(jìn)制數(shù)在語(yǔ)句中 必須以數(shù)字打頭,凡是以字母AF開(kāi)始的十六進(jìn)制數(shù),必須在前面加上數(shù)字0)。 常量-整數(shù)常量 字符串常量是由單引號(hào)或雙引號(hào)括起來(lái)的單個(gè)字符或多個(gè)字符構(gòu)
10、成的。匯編程序把引號(hào)中的字符翻譯成它的ASCII碼值。如:A(等于41H)、BC(等于4243H)、“HELLO”等。 常量字符串常量 匯編語(yǔ)言中的運(yùn)算符與表達(dá)式 運(yùn)算符:匯編中的運(yùn)算符分為6大類(lèi),它們是:算術(shù)運(yùn)算符、移位運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、分析運(yùn)算符、合成運(yùn)算符(見(jiàn)課本P131表5-1)。 表達(dá)式:表達(dá)式是常數(shù)、寄存器、標(biāo)號(hào)、變量與一些運(yùn)算符和操作碼相組合的序列。 表達(dá)式的運(yùn)算不由CPU完成,而是在程序匯編過(guò)程中進(jìn)行計(jì)算確定,并將表達(dá)式的結(jié)果作為操作數(shù)參與指令所規(guī)定的操作。 當(dāng)各種運(yùn)算符同時(shí)出現(xiàn)在同一表達(dá)式中時(shí),按照運(yùn)算符的優(yōu)先級(jí)進(jìn)行計(jì)算,對(duì)于優(yōu)先級(jí)相同的運(yùn)算符,按照從左到右的順
11、序進(jìn)行計(jì)算(見(jiàn)課本P132表5-2)。 數(shù)值表達(dá)式:由數(shù)值和運(yùn)算符組成,產(chǎn)生一個(gè)數(shù)值結(jié)果,只有大小,沒(méi)有屬性。 地址表達(dá)式:由指令尋址方式中簡(jiǎn)單的地址表達(dá)式和特殊算符組成,其結(jié)果是一個(gè)表示存儲(chǔ)器地址的變量或標(biāo)號(hào)。 補(bǔ) 充 知 識(shí)-表達(dá)式的分類(lèi) 特殊算符(見(jiàn)課本P131表5-1) 取偏移地址算符 OFFSET 取段地址算符 SEG 例如:MOV AX,SEG DATA MOV DS,AX 取類(lèi)型算符 TYPE(結(jié)合課本P135表5-3) 取變量個(gè)數(shù)算符 LENGTH 取變量字節(jié)數(shù)算符 SIZE 合成算符PTR:類(lèi)型 PTR OPRD 合成算符THIS 短標(biāo)號(hào)算符SHORT 字節(jié)分離算符HIGH和
12、LOWDATA SEGMENT VAR DW ? ARRAY DD 10 DUP(?) STR DB THIS IS A TESTDATA ENDS : MOV AX,TYPE VAR MOV BX,TYPE ARRAY MOV CX,TYPE STR;AX=2;BX=4;CX=1補(bǔ)充例題5.2 匯編語(yǔ)言程序結(jié)構(gòu)和基本語(yǔ)法 5.2.3 偽指令 匯編語(yǔ)言中有豐富的偽指令。依其功能可將其分為數(shù)據(jù)定義偽指令、符號(hào)定義偽指令、段定義偽指令、段分配偽指令、過(guò)程定義偽指令、模塊定義偽指令、結(jié)構(gòu)定義偽指令和記錄定義偽指令等。 數(shù)據(jù)定義偽指令 功能:用來(lái)為變量申請(qǐng)固定長(zhǎng)度的存儲(chǔ)空間,并可同時(shí)將相應(yīng)的存儲(chǔ)單元初
13、始化。 格式:變量名 偽指令助記符 初值表 變量名為用戶(hù)自定義標(biāo)識(shí)符,表示初值表中首個(gè)元素的邏輯地址,可以通過(guò)變量名來(lái)訪問(wèn)它所指示的存儲(chǔ)單元,有時(shí)也可以省略變量名。 變量名 DB:定義字節(jié)變量,即其后的每個(gè)操作數(shù)均占1個(gè)字節(jié); DW:定義字變量,即其后的每個(gè)操作數(shù)均占2個(gè)字節(jié); DD:定義雙字變量,即其后的每個(gè)操作數(shù)均占4個(gè)字節(jié); DQ:定義4字變量,即其后的每個(gè)操作數(shù)均占8個(gè)字節(jié); DT:定義10字節(jié)變量,即其后的每個(gè)操作數(shù)均占10個(gè)字節(jié)。 注意: 存放多字節(jié)數(shù)據(jù)時(shí),數(shù)據(jù)高字節(jié)存放在高地址單元,低字節(jié)存放在低地址單元。 變量定義偽指令 初值表給出變量的初始化值,有多個(gè)值時(shí)用逗號(hào)分隔。 初始化
14、值可以是數(shù)值常數(shù),也可以是表達(dá)式、?,還可以由$、重復(fù)操作符DUP組成。其中: ?表示未賦初值; $ 表示將要分配的內(nèi)存單元的偏移地址; DUP表示重復(fù)初值。 格式為:重復(fù)次數(shù) DUP(重復(fù)參數(shù)) 說(shuō)明:重復(fù)參數(shù)可以是多個(gè),之間用逗號(hào)間隔。 舉例:2 DUP(1,2);等價(jià)于1,2,1,2 初值表 補(bǔ)充知識(shí)-如何給變量賦初值? 常數(shù)或數(shù)值表達(dá)式。 ASCII碼字符串:但只有DB定義時(shí),才允許超過(guò)2個(gè)字符。 地址表達(dá)式(變量名或標(biāo)號(hào)):僅適合DW和DD。 用DW時(shí),取地址表達(dá)式所在地址的偏移量賦給變量。 用DD時(shí),取地址表達(dá)式所在的段地址和偏移量賦給變量。 ?:表示定義的變量無(wú)確定值。 重復(fù)子句
15、:格式為:n DUP (表達(dá)式)。 可以是以上表達(dá)式的組合,表達(dá)式之間用逗號(hào)隔開(kāi)。 注意: 等價(jià)偽指令EQU,當(dāng)放在數(shù)據(jù)段中時(shí),不占內(nèi)存。 對(duì)于有符號(hào)數(shù),應(yīng)以補(bǔ)碼形式在內(nèi)存中存放。DATA SEGMENTDA1 DB 01H,12H DA2 DW 1234H DA3 DD 56789012HDATA ENDS變量名偏移地址單元數(shù)據(jù)DA10000H01HDA2DA30001H0002H0003H0004H0005H0006H0007H12H34H12H12H90H78H56H補(bǔ)充例題DATA SEGMENT BUF DB AB,0DH,0AH A DW M B DW 0FFAAH C DD BU
16、F M DB 2 DUP(2,B),12,1,2DATA ENDS補(bǔ)充例題設(shè)DS=0AC0H,數(shù)據(jù)存儲(chǔ)形式如下:變量名偏移地址單元數(shù)據(jù)變量名偏移地址單元數(shù)據(jù)BUFABC0000H0001H0002H0003H0004H0005H0006H0007H0008H0009H000AH000BH000CH000DH000EH000FH0010H0011H0012H0013H02H42H02H42H31H32H01H02H41H42H0DH0AH00HAAHFFH00H00HC0H0AHM0CH 起始位置定位偽指令ORG 功能:在數(shù)據(jù)段內(nèi)一般從偏移地址為0的存儲(chǔ)單元開(kāi)始,依次按順序分配內(nèi)存單元;使用OR
17、G可以指定從某一個(gè)偏移地址開(kāi)始分配內(nèi)存單元。 格式1:ORG *H 格式2:ORG 表達(dá)式 ;從表達(dá)式的值指定的偏移地址, ;開(kāi)始分配的內(nèi)存單元。例5-3:DATA SEGMENT X DB 64*2-100,D DB CHN DW ? ORG 0100H Y DW 2 DUP(100) M DB 2 DUP(1,2 DUP(1,2)Z DW $-10 DATA ENDS 符號(hào)定義偽指令 功能:用來(lái)定義符號(hào)常量,系統(tǒng)不會(huì)給符號(hào)常量分配內(nèi)存空間。 指令有EQU(等價(jià)偽指令)、=(等號(hào)偽指令)。 格式: 符號(hào) EQU 表達(dá)式 符號(hào) = 表達(dá)式 ;左邊符號(hào)的值為右邊表達(dá)式的值。 說(shuō)明: 兩者的區(qū)別是
18、用“=”定義的符號(hào)常量可以被重新定義,而用EQU定義的符號(hào)常量則不能被重新定義。 LABEL偽指令 功能:為其后定義的變量或標(biāo)號(hào)定義一個(gè)不同類(lèi)型的別名。 格式: 變量或標(biāo)號(hào) LABEL 類(lèi)型 說(shuō)明: 類(lèi)型為BYTE、WORD、DWORD、NEAR或FAR。例5-6:VARLABEL WORD XDB AB;變量VAR、X指向內(nèi)存中的同一單元, ;但兩者類(lèi)型分別為字類(lèi)型、字節(jié)類(lèi)型MOVAX,VAR;等價(jià)于MOV AX,4241HMOVAL,X;等價(jià)于MOV AL,41H 段定義偽指令 匯編語(yǔ)言源程序由若干個(gè)段組成,段定義偽指令(SEGMENT/ENDS)用來(lái)定義一個(gè)段,要求給出段名,由SEGME
19、NT指定段的開(kāi)始,ENDS指定段的結(jié)束。 格式為: 段名 SEGMENT 定位類(lèi)型 組合類(lèi)型 類(lèi)別 ;語(yǔ)句序列 段名 ENDS 說(shuō)明1、SEGMENT和ENDS必須成對(duì)出現(xiàn)。2、段名由用戶(hù)自己命名,須符合標(biāo)識(shí)符命名規(guī)則,前后段名必 須保持一致。每個(gè)段的段名即為該段的段基址。3、定位類(lèi)型用來(lái)說(shuō)明對(duì)段起始地址的要求,可以省略。定位類(lèi)型有以下4種: BYTE:段的起始地址可在任意字節(jié)邊界上。即段起始地址是任意的; WORD:要求段的起始地址在任意字邊界上。即段起始地址 最低位為0,亦即段起始地址必須為偶地址; PARA:要求段的起始地址在節(jié)(16字節(jié))的邊界上,即 段起始地址低4位全部為0,如:XX
20、XX0H。缺省定位類(lèi)型時(shí),默認(rèn)為PARA類(lèi)型; PAGE:要求段的起始地址在頁(yè)(256字節(jié))邊界上,即段起始地址低8位全部為0,如:XXX00H。補(bǔ)充例題STACK SEGMENT DB 100 DUP(?)STACK ENDSDATA1 SEGMENT BYTE STRING DB This is an example.DATA1 ENDSDATA2 SEGMENT WORD BUFFER DW 40 DUP (0)DATA2 ENDCODE1 SEGMENT PAGECODE1 ENDSCODE2 SEGMENT START:MOV AX,STACK MOV SS,AXCODE2 ENDS
21、END START各邏輯段的起始地址和結(jié)束地址段名定位類(lèi)型字節(jié)數(shù)起始地址結(jié)束地址STACKPARA100(64H)00000H00063HDATA1BYTE19(13H)00064H00076HDATA2WORD80(50H)00078H000C7HCODE1PAGE13(0DH)00100H0010CHCODE2PARA52(34H)00110H00143H4、組合類(lèi)型用來(lái)說(shuō)明同類(lèi)別名的段的連接方式,可以省略。組合類(lèi)型有以下6種: NONE:不與其他段連接。缺省組合類(lèi)型時(shí),默認(rèn)為NONE類(lèi)型; PUBLIC:將不同程序模塊中同名同類(lèi)型的段按順序連接成一個(gè)共同的段裝入內(nèi)存; STACK:指定該
22、段為堆棧段,并將不同程序模塊中的堆棧段按順序連接成一個(gè)堆棧段。即所有程序模塊共用一個(gè)堆棧段; COMMON:將不同程序模塊中同名同類(lèi)型的段都從同一個(gè)地址開(kāi)始裝入,即以覆蓋方式連接,各個(gè)邏輯段將發(fā)生重疊,段長(zhǎng)度為最大段的長(zhǎng)度; AT 表達(dá)式:按照表達(dá)式的值指定的段基址將段裝入內(nèi)存; MEMORY:多個(gè)邏輯段連接時(shí),連接程序?qū)驯径芜B接在其他所有段之上。若多個(gè)段均為MEMORY類(lèi)型時(shí),則將第一個(gè)MEMORY段至于所有段之上,其他MEMORY段當(dāng)成COMMON類(lèi)型來(lái)處理。 說(shuō)明(續(xù))5、類(lèi)別名必須用引起來(lái),用來(lái)說(shuō)明該段類(lèi)別名,在連接時(shí)將同類(lèi)別名的段按照組合類(lèi)型進(jìn)行組合。 說(shuō)明: 類(lèi)別名由用戶(hù)自定義,
23、長(zhǎng)度不超過(guò)40個(gè)字符。 類(lèi)別名是在連接時(shí)決定各邏輯段的裝入順序。當(dāng)幾個(gè)程序模塊進(jìn)行連接時(shí),其中具有相同類(lèi)別名的邏輯段被裝入連續(xù)的內(nèi)存區(qū),類(lèi)別名相同的邏輯段,按出現(xiàn)的先后順序排列。沒(méi)有類(lèi)別名的邏輯段,與其他無(wú)類(lèi)別名的邏輯段一起連續(xù)裝入內(nèi)存。 說(shuō)明(續(xù))補(bǔ)充例題假設(shè)一個(gè)主程序中有5個(gè)邏輯段,段名和類(lèi)別名分別為: STK1 SEGMENT STACK CODE1 SEGMENT DATA1 SEGMENT BUFFER DATA2 SEGMENT TABLE DATA3 SEGMENT BUFFER還有一個(gè)子程序,包括4個(gè)邏輯段,段名和類(lèi)別名分別為: DATA4 SEGMENT TABLE DATA
24、5 SEGMENT BUFFER STK2 SEGMENT STACK CODE2 SEGMENT 當(dāng)將兩個(gè)程序進(jìn)行連接時(shí),兩個(gè)程序模塊中各個(gè)邏輯段裝入內(nèi)存的順序:BUFFERDATA3TABLEDATA2BUFFERDATA1無(wú)CODE1STACKSTK1類(lèi)別名段名主程序無(wú)CODE2STACKSTK2BUFFERDATA5TABLEDATA4類(lèi)別名段名子程序內(nèi)存DATA4DATA2DATA5DATA3DATA1CODE2CODE1STK2STK1STACK無(wú)BUFFERTABLE 段分配偽指令 功能:用來(lái)說(shuō)明當(dāng)前哪些邏輯段為代碼段、哪些為數(shù)據(jù)段、哪些為堆棧段、哪些為附加段。 格式為: ASS
25、UME 段寄存器:段名,段寄存器:段名, 說(shuō)明: ASSUME偽指令只能設(shè)置在代碼段內(nèi),放在段定義語(yǔ)句之后。 ASSUME偽指令只是建立了邏輯段與段寄存器之間的關(guān)系,并沒(méi)有為段寄存器賦值。對(duì)于代碼段和堆棧段,由連接程序來(lái)設(shè)置CS、IP、SS、SP的值;而數(shù)據(jù)段和附加段則需要由用戶(hù)在程序中對(duì)DS、ES賦值。 每個(gè)段的段名即為該段的段基址,它是一個(gè)16位的立即數(shù),因此不能直接將它送給段寄存器,通常先將段名送給一個(gè)通用寄存器,然后將該通用寄存器的值再送給段寄存器,來(lái)對(duì)DS、ES賦值(由MOV指令來(lái)完成)。 例如:MOV AX,DATA MOV DS,AX 過(guò)程定義偽指令 對(duì)于程序中經(jīng)常用到的具有獨(dú)立
26、功能的語(yǔ)句組,可將它定義成一個(gè)子過(guò)程,通過(guò)CALL來(lái)調(diào)用執(zhí)行,可以簡(jiǎn)化主程序,實(shí)現(xiàn)模塊化程序設(shè)計(jì),提高編程效率。 格式: 過(guò)程名 PROC 屬性 ;語(yǔ)句序列 RET 過(guò)程名 ENDP1、過(guò)程名由用戶(hù)自己命名,但必須符合標(biāo)識(shí)符命名規(guī)則,前后過(guò)程名必須保持一致。過(guò)程名代表過(guò)程的入口地址。2、PROC指定過(guò)程的開(kāi)始,ENDP指定過(guò)程的結(jié)束,PROC和ENDP必須成對(duì)出現(xiàn)。3、屬性:過(guò)程屬性有NEAR(段內(nèi)近調(diào)用)、FAR(段間遠(yuǎn)調(diào)用)兩種,若缺省則為NEAR。NEAR屬性的過(guò)程只能被本代碼段內(nèi)的其他程序調(diào)用;FAR屬性的過(guò)程既可以被本代碼段內(nèi)的程序調(diào)用,又可以被其他代碼段內(nèi)的程序調(diào)用。4、過(guò)程必須以
27、RET結(jié)尾以便返回調(diào)用它的程序。5、子過(guò)程應(yīng)安排在代碼段的主程序之外,最好放在主程序執(zhí)行終止后的位置(返回DOS后、匯編結(jié)束END偽指令前),也可以放在主程序開(kāi)始執(zhí)行之前的位置。 說(shuō)明 補(bǔ)充知識(shí)-模塊定義與連接偽指令 在編寫(xiě)規(guī)模較大的匯編語(yǔ)言源程序時(shí),可以將整個(gè)程序劃分為幾個(gè)獨(dú)立的源程序,稱(chēng)之為模塊。 格式:NAME 模塊名;指定模塊名 說(shuō)明:1、NAME的前面不允許再加上標(biāo)號(hào)。 2、如果程序中沒(méi)有NAME偽指令,則匯編程序?qū)ITLE偽指令后面“標(biāo)題名”中的前六個(gè)字符作為模塊名。3、如果源程序中既沒(méi)有使用NAME,也沒(méi)有使用TITLE偽指令,則匯編程序?qū)⒃闯绦虻奈募鳛槟繕?biāo)程序的模塊名。4
28、、將各模塊分別進(jìn)行匯編,生成各自的目標(biāo)程序,最后將它們連接成為一個(gè)完整的可執(zhí)行程序。 全局標(biāo)識(shí)符偽指令 采用模塊化程序設(shè)計(jì),各模塊之間會(huì)存在著數(shù)據(jù)的交流,即在一個(gè)模塊中需要引用在另一個(gè)模塊中定義的變量、標(biāo)號(hào)、或過(guò)程。 模塊中的標(biāo)識(shí)符有兩種: 局部標(biāo)識(shí)符:僅供本模塊使用的標(biāo)識(shí)符; 全局標(biāo)識(shí)符:既可供本模塊使用,又可供另外的模塊使用的標(biāo)識(shí)符。 全局標(biāo)識(shí)符定義偽指令 要想讓其它模塊能調(diào)用本模塊中的標(biāo)識(shí)符,就需要在本模塊中將該標(biāo)識(shí)符定義為全局標(biāo)識(shí)符。 格式:PUBLIC 標(biāo)識(shí)符1,標(biāo)識(shí)符2, 全局標(biāo)識(shí)符聲明偽指令: 要想在本模塊中調(diào)用其它模塊里的全局標(biāo)識(shí)符,需要用EXTRN進(jìn)行聲明。 格式:EXTRN
29、 標(biāo)識(shí)符1:類(lèi)型,標(biāo)識(shí)符2:類(lèi)型, 說(shuō)明: 類(lèi)型可為BYTE、WORD、DWORD、NEAR或FAR。 某個(gè)主模塊需調(diào)用一個(gè)過(guò)程SBRT,并引用變量ALPHA和BETA,而上述過(guò)程和變量在另外兩個(gè)子模塊中定義,則主模塊中應(yīng)使用EXTRN偽指令將有關(guān)過(guò)程和變量說(shuō)明為外部的;而在相應(yīng)的子模塊中用PUBLIC偽指令將它們說(shuō)明為公共的。同時(shí),由于被調(diào)用的過(guò)程與調(diào)用它的主程序不在同一段中,因此過(guò)程的類(lèi)型應(yīng)該定義為FAR。補(bǔ)充例題DATA1 SEGMENT BUFFER DW 100 DUP (?)DATA1 ENDSDATA2 SEGMENT PUBLIC ;該段的組合類(lèi)型為PUBLIC EXTRN A
30、LPHA: BYTE, BETA: WORD DATA2 ENDSCODE1 SEGMENT EXTRN SBRT FAR ASSUME CS:CODE1,DS:DATAl,ES:DATA2 START : MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX CALL SBRTCODE1 ENDS END START主模塊PUBLIC SBRTCODE2 SEGMENT ASSUME CS:CODE2 SBRT PROC FAR SBRTENDPCODE2 ENDS ENDDATA2 SEGMENT PUBLIC PUBLIC ALPHA,BETA AL
31、PHADB 50 DUP (?) BETA DW ?DATA2ENDSEND子模塊1子模塊2 功能:表示程序的結(jié)束,匯編程序遇到END時(shí)結(jié)束匯編,其后的標(biāo)號(hào)為程序執(zhí)行的起始地址。 格式:END 標(biāo)號(hào) 程序結(jié)束偽指令5.2 匯編語(yǔ)言程序結(jié)構(gòu)和基本語(yǔ)法 5.2.4 結(jié)構(gòu)與記錄結(jié)構(gòu) 當(dāng)程序中的數(shù)據(jù)是由多個(gè)數(shù)據(jù)成員組成時(shí),如:學(xué)生信息表中的學(xué)生數(shù)據(jù),包含學(xué)號(hào)、姓名、性別、年齡等多個(gè)成員數(shù)據(jù),若用前面的方式來(lái)定義多個(gè)學(xué)生數(shù)據(jù)就比較麻煩。8086宏匯編提供了結(jié)構(gòu)(STRUCTURES)來(lái)實(shí)現(xiàn)對(duì)這種數(shù)據(jù)的處理。 結(jié)構(gòu)就是相互關(guān)聯(lián)的一組數(shù)據(jù)的某種組合形式。使用結(jié)構(gòu)數(shù)據(jù)前,需要先定義結(jié)構(gòu)類(lèi)型,再用定義好的結(jié)構(gòu)類(lèi)
32、型去定義結(jié)構(gòu)變量,并完成結(jié)構(gòu)變量的初始化。 格式: 結(jié)構(gòu)類(lèi)型定義偽指令 結(jié)構(gòu)類(lèi)型名 STRUC 字段名 數(shù)據(jù)定義語(yǔ)句序列 結(jié)構(gòu)類(lèi)型名 ENDS1、組成結(jié)構(gòu)的變量稱(chēng)為結(jié)構(gòu)的字段,相應(yīng)的變量名稱(chēng)為字段名。2、結(jié)構(gòu)中的字段名代表了從結(jié)構(gòu)的開(kāi)始到相應(yīng)字段的偏移。3、在說(shuō)明結(jié)構(gòu)類(lèi)型時(shí),可以給字段賦初值,也可以不賦初值。4、在說(shuō)明結(jié)構(gòu)類(lèi)型時(shí)不進(jìn)行任何存儲(chǔ)分配,只有在定義結(jié)構(gòu)變量時(shí)才進(jìn)行存儲(chǔ)分配。 說(shuō)明: 舉例: STUDENT STRUC NO DB ?NAMEX DB JACK SEX DB M AGE DB ? STUDENT ENDS 結(jié)構(gòu)變量定義偽指令 格式:變量名 結(jié)構(gòu)類(lèi)型名 字段值表 說(shuō)明:1
33、、字段值表用來(lái)給結(jié)構(gòu)變量中各結(jié)構(gòu)字段賦初值,其類(lèi)型、順序應(yīng)與結(jié)構(gòu)類(lèi)型定義中的字段保持一致,各個(gè)字段初始化值之間用逗號(hào)間隔。2、給結(jié)構(gòu)變量中各結(jié)構(gòu)字段賦初值時(shí),有一定的限制:在結(jié)構(gòu)類(lèi)型定義中只具有一項(xiàng)數(shù)據(jù)的結(jié)構(gòu)字段,可以通過(guò)字段值表來(lái)修改代替初始定義時(shí)的值;用DUP定義的字段或一個(gè)字段后有多個(gè)數(shù)據(jù)的字段,則不能修改其定義時(shí)的值,即不能通過(guò)字段值表來(lái)修改這些字段的值。3、若不需要修改某些字段的值(即仍采用其定義時(shí)的值),則在字段值表中對(duì)應(yīng)位置僅寫(xiě)一個(gè)逗號(hào)即可。4、若所有字段的值均采用其定義時(shí)的值,不需要修改,則僅寫(xiě)一對(duì)尖括號(hào)即可。 例5-14:DATA SEGMENTSTUDENT STRUCNO
34、 DB ?NAMEXDB JACKSEXDB MAGEDB ?STUDENT ENDS;定義結(jié)構(gòu)類(lèi)型X1 STUDENT 1,21X2 STUDENT 2,ANDY,22X3 STUDENT 3,ROSE,F(xiàn),20X4 STUDENT ,;定義結(jié)構(gòu)變量X1、X2、X3、X4DATA ENDS 在程序中可以直接引用結(jié)構(gòu)類(lèi)型變量,也可以引用結(jié)構(gòu)類(lèi)型變量中的某一字段。 格式:結(jié)構(gòu)變量名.字段名 舉例:MOV AL,X1.AGE ;將前面定義的STUDENT結(jié)構(gòu)類(lèi)型變量 ;X1中的AGE字段值送到AL中。等價(jià)于:MOV BX,OFFSET X1 MOV AL,BX.AGE 結(jié)構(gòu)類(lèi)型變量的引用5.2 匯
35、編語(yǔ)言程序結(jié)構(gòu)和基本語(yǔ)法 5.2.4 結(jié)構(gòu)與記錄記錄(自學(xué)) 一般來(lái)說(shuō),訪問(wèn)存儲(chǔ)器的最小單位是字節(jié),但在實(shí)際應(yīng)用當(dāng)中,某些數(shù)據(jù)只需用一個(gè)二進(jìn)制位來(lái)表示,如何按位訪問(wèn)這些數(shù)據(jù)呢?8086宏匯編提供了記錄(RECORD)來(lái)實(shí)現(xiàn)對(duì)這類(lèi)數(shù)據(jù)的處理。使用記錄前,也需要先定義記錄類(lèi)型,再用定義好的記錄類(lèi)型去定義記錄變量,并完成記錄變量的初始化。5.2 匯編語(yǔ)言程序結(jié)構(gòu)和基本語(yǔ)法 5.2.5 宏指令 如果在源程序中需要多次使用同一個(gè)程序段,可以將這個(gè)程序段定義為一個(gè)宏指令或子程序(過(guò)程),然后每次需要時(shí),即可簡(jiǎn)單地用宏指令名來(lái)代替(稱(chēng)為宏調(diào)用)或CALL調(diào)用,從而使源程序更加簡(jiǎn)潔、易讀、易于實(shí)現(xiàn)模塊化。 宏
36、調(diào)用與子程序(過(guò)程)的比較 相同點(diǎn): 用一條指令來(lái)代替一段程序,子程序和宏指令定義好之后都可以被多次調(diào)用,可以起到簡(jiǎn)化源程序的作用。 不同點(diǎn): 1、從代碼開(kāi)銷(xiāo)的角度來(lái)講,子程序優(yōu)于宏指令。 編譯宏指令時(shí),需要將每一個(gè)宏調(diào)用指令展開(kāi),有多少次調(diào)用,就要在目標(biāo)程序中插入多少次宏體程序段,因而調(diào)用次數(shù)越多,占用內(nèi)存空間就越大;編譯子程序時(shí)只占用一個(gè)程序段(即使是調(diào)用多次),因而匯編后產(chǎn)生的目標(biāo)程序占用內(nèi)存空間少。 2、從時(shí)間開(kāi)銷(xiāo)的角度來(lái)講,宏指令優(yōu)于子程序。 每次調(diào)用子程序時(shí)都要保護(hù)/恢復(fù)現(xiàn)場(chǎng)和斷點(diǎn),額外增加了時(shí)間開(kāi)銷(xiāo);而宏指令在執(zhí)行時(shí)不存在保護(hù)/恢復(fù)現(xiàn)場(chǎng)和斷點(diǎn)的問(wèn)題,執(zhí)行的時(shí)間短,速度快。 宏調(diào)用
37、與子程序(過(guò)程)的比較(續(xù))小結(jié) 小 結(jié) 一般來(lái)說(shuō),當(dāng)要重復(fù)執(zhí)行的程序不長(zhǎng),重復(fù)次數(shù)又多時(shí),速度是主要問(wèn)題,通常用宏指令;而要重復(fù)執(zhí)行的程序較長(zhǎng),重復(fù)次數(shù)又不是太多時(shí),額外操作所附加的時(shí)間就不明顯了,節(jié)省內(nèi)存空間應(yīng)視為主要問(wèn)題,通常采用子程序結(jié)構(gòu)。 宏定義 格式:宏指令名 MACRO 形式參數(shù)1,形式參數(shù)2宏體;語(yǔ)句序列 ENDM 說(shuō)明: 1、宏指令名由用戶(hù)自己命名,但必須符合標(biāo)識(shí)符命名規(guī)則。 2、MACRO指定宏定義的開(kāi)始,ENDM指定宏定義的結(jié)束,它們必須成對(duì)出現(xiàn)。 3、宏體為實(shí)現(xiàn)宏指令功能的語(yǔ)句序列。 4、形式參數(shù)列表用來(lái)給出宏定義中所用到的參數(shù),形式參數(shù)可有一個(gè)或多個(gè),也可以沒(méi)有。有多
38、個(gè)形式參數(shù)時(shí),參數(shù)之間以逗號(hào)隔開(kāi)。 5、宏定義不必在任何邏輯段中,通常寫(xiě)在源程序的開(kāi)頭。 6、宏定義中的注釋語(yǔ)句以“;”開(kāi)頭。 宏調(diào)用 定義:在程序當(dāng)中使用已經(jīng)定義過(guò)的宏指令,稱(chēng)為宏調(diào)用。 格式:宏指令名 實(shí)際參數(shù)1,實(shí)際參數(shù)2 說(shuō)明: 1、如果宏指令有形式參數(shù),在宏調(diào)用時(shí),必須在宏指令名后面寫(xiě)上實(shí)際參數(shù),并與形式參數(shù)一一對(duì)應(yīng),有多個(gè)實(shí)際參數(shù)時(shí),參數(shù)之間以逗號(hào)隔開(kāi)。一般情況下,實(shí)際參數(shù)與形式參數(shù)的個(gè)數(shù)和順序均應(yīng)一一對(duì)應(yīng)。但是,匯編程序允許二者的個(gè)數(shù)不等。當(dāng)實(shí)際參數(shù)多于形式參數(shù)時(shí),多余的實(shí)際參數(shù)被忽略。當(dāng)形式參數(shù)多于實(shí)際參數(shù)時(shí),認(rèn)為多余的形式參數(shù)為空。 2、具有宏調(diào)用的源程序被匯編時(shí),匯編程序?qū)?/p>
39、用宏定義時(shí)設(shè)計(jì)的宏體去代替宏指令名,并且用實(shí)際參數(shù)一一代替形式參數(shù),稱(chēng)為宏展開(kāi)。匯編程序在所展開(kāi)的指令前加上“1”號(hào)以示區(qū)別。 匯編時(shí),MASM對(duì)每個(gè)宏指令名自動(dòng)用相應(yīng)宏定義體中的程序段代替,這個(gè)過(guò)程稱(chēng)為宏擴(kuò)展。 宏擴(kuò)展DECADD1 MACRO OPR1,OPR2 MOV AL,OPR1 ADD AL,OPR2 DAA MOV OPR1, AL ENDMDECADD1 DL, BUFFERDECADD1 AREA1,AREA2 補(bǔ)充例題宏定義宏調(diào)用DECADD1 DL,BUFFER 1 MOV AL, DL 1 ADD AL,BUFFER 1 DAA 1 MOV DL,AL宏擴(kuò)展 1、宏定義
40、中的參數(shù)還可以是操作碼。 2、在宏定義中還可以使用分隔符&,展開(kāi)時(shí)把&前后的兩個(gè)符號(hào)連接起來(lái),形成操作碼、操作數(shù)或字符串。 3、在宏定義中可以調(diào)用之前已經(jīng)定義過(guò)的宏(宏定義允許嵌套)。 補(bǔ)充說(shuō)明: 宏定義: OP MACRO OPR1,OPR2,OPR3 MOV AX,OPR1 OPR2 AX,OPR3 ENDM 宏調(diào)用: OP X,ADD,Y ;假設(shè)X、Y為已經(jīng)在數(shù)據(jù)段定義好的 ;兩個(gè)字變量 宏展開(kāi): 1 MOV AX,X 1 ADD AX,Y 舉例 宏定義: SHIFT MARCO OPR1,OPR2,OPR3 MOV CL,OPR2 SH&OPR3 OPR1,CL ENDM 宏調(diào)用: S
41、HIFT AL,4,L 宏展開(kāi): 1 MOV CL,4 1 SHL AL,CL 舉例(續(xù)) 補(bǔ)充知識(shí)-取消宏定義 PURGE 格式: PURGE 宏指令名 【,】 功能:取消已有的宏定義。 說(shuō)明: MASM優(yōu)先考慮宏指令的定義,而與宏指令同名的指令助記符或偽指令原來(lái)的含義失效。當(dāng)用PURGE偽指令取消上述宏指令的定義后,即可恢復(fù)這些CPU指令或偽指令原來(lái)的含義。 局部標(biāo)號(hào)偽指令LOCAL 對(duì)于使用了標(biāo)號(hào)的宏,若多次調(diào)用,展開(kāi)時(shí)將多次出現(xiàn)相同的標(biāo)號(hào),這在匯編語(yǔ)言程序中是不允許的,匯編時(shí)將報(bào)錯(cuò)。8086宏匯編提供了局部標(biāo)號(hào)偽指令LOCAL來(lái)解決這一問(wèn)題。 格式:LOCAL 標(biāo)號(hào)1,標(biāo)號(hào)2 說(shuō)明:1
42、、標(biāo)號(hào)1、標(biāo)號(hào)2為宏定義中的標(biāo)號(hào)。2、LOCAL偽指令只能用在宏定義體內(nèi),還必須是MACRO偽操作后的第一個(gè)語(yǔ)句,且在MACRO與LOCAL之間不能出現(xiàn)注釋和分號(hào)標(biāo)志。3、對(duì)LOCAL后的標(biāo)號(hào),匯編程序?qū)⒂?0000”“?FFFF”來(lái)依次取代宏展開(kāi)時(shí)的標(biāo)號(hào)。這樣,在宏展開(kāi)后,程序中標(biāo)號(hào)都是唯一的。 文件包含偽指令I(lǐng)NCLUDE(自學(xué)) 當(dāng)多個(gè)程序要調(diào)用同一個(gè)宏時(shí),可以把這些宏組合起來(lái),建立一個(gè)獨(dú)立的文件,稱(chēng)之為宏庫(kù),其擴(kuò)展名是MAC或INC。當(dāng)需要調(diào)用宏庫(kù)中的宏時(shí),只需要在該程序的開(kāi)始用INCLUDE偽指令把該宏庫(kù)文件包含進(jìn)來(lái)即可。 格式為:INCLUDE 宏庫(kù)文件名 說(shuō)明: 匯編時(shí),將用IN
43、CLUDE偽指令指定的文件的內(nèi)容插入到該偽指令所在的位置,與源程序一起進(jìn)行匯編,所以要注意宏庫(kù)文件中的標(biāo)識(shí)符不能與源程序中的標(biāo)識(shí)符重名。 舉例:INCLUDE OUTPUT.MAC INCLUDE D:MASM5INPUT.MAC 重復(fù)匯編偽指令(自學(xué)) REPT:格式:REPEAT 重復(fù)次數(shù) 重復(fù)體 ENDM說(shuō)明:使匯編程序按照指定次數(shù)對(duì)重復(fù)體作重復(fù)匯編。 IRP:格式:IRP 形式參數(shù), 重復(fù)體 ENDM說(shuō)明:重復(fù)匯編時(shí),每作一次匯編就依次將實(shí)參表中的一個(gè)實(shí)參取代重復(fù)體中的形參。 IRPC:格式:IRPC 形參,字符串 重復(fù)體 ENDM說(shuō)明:重復(fù)匯編時(shí),每作一次匯編就依次用字符串中的一個(gè)字
44、符取代重復(fù)體中的形參。 條件匯編偽指令利用條件匯編偽指令可以有選擇的匯編某段源程序。其格式為:IFXX 表達(dá)式; 定義條件語(yǔ)句組1; 滿(mǎn)足條件時(shí)編譯語(yǔ)句組1 ELSE; ELSE部分也可以省略 語(yǔ)句組2; 不滿(mǎn)足條件時(shí)編譯語(yǔ)句組2ENDIF常用條件匯編偽指令見(jiàn)下表。前者是給匯編程序的命令,在匯編過(guò)程中測(cè)試條件;后者是給CPU的命令,在執(zhí)行過(guò)程中測(cè)試條件。補(bǔ)充知識(shí) 條件偽指令與條件轉(zhuǎn)移指令的區(qū)別: IF和IFE: IF格式:IF 表達(dá)式 功能:當(dāng)表達(dá)式的值不等于零時(shí),IF偽指令的條件為真,對(duì)規(guī)定的語(yǔ)句組進(jìn)行匯編。 IFE格式:IFE 表達(dá)式 功能:當(dāng)表達(dá)式的值等于零時(shí),IFE偽指令的條件為真,對(duì)
45、規(guī)定的語(yǔ)句組進(jìn)行匯編。補(bǔ) 充 知 識(shí) IFDEF 和IFNDEF : IFDEF格式:IFDEF 符號(hào) 功能:當(dāng)符號(hào)是一個(gè)已經(jīng)定義的標(biāo)號(hào)、變量或名字,或者已用EXTRN偽指令說(shuō)明其為外部符號(hào)時(shí),IFDEF偽指令的條件為真。 IFNDEF格式:IFNDEF 符號(hào) 功能:如果符號(hào)未經(jīng)定義,則IFNDEF偽指令的條件為真。補(bǔ) 充 知 識(shí) IFB 和IFNB : IFB格式:IFB 自變量 功能:如果自變量為空,IFB的條件為真。 IFNB格式:IFNB 自變量 功能:如果自變量不為空,則IFNB的條件為真。測(cè)試是否將一個(gè)實(shí)際參數(shù)傳遞給宏定義中一個(gè)指定的形式參數(shù)。補(bǔ) 充 知 識(shí) IFIDN 和IFDI
46、F :測(cè)試兩個(gè)字符串是否相同。 IFIDN格式:IFIDN 自變量1, 自變量2 功能:當(dāng)兩個(gè)字符串相同時(shí),IFIDN偽指令的條件為真。 IFDIF格式:IFIDN 自變量1, 自變量2 功能:當(dāng)兩個(gè)字符串不同時(shí),IFDIF偽指令的條件為真。補(bǔ) 充 知 識(shí)5.2 匯編語(yǔ)言程序結(jié)構(gòu)和基本語(yǔ)法 5.2.6 簡(jiǎn)化段定義(自學(xué)) 5.3 匯編語(yǔ)言程序設(shè)計(jì)基本方法 5.3.1 程序設(shè)計(jì)的基本步驟 分析問(wèn)題 確定算法 設(shè)計(jì)流程 分配空間 編寫(xiě)程序 調(diào)試運(yùn)行 7/18/202283 流程圖符號(hào)5.3 匯編語(yǔ)言程序設(shè)計(jì)基本方法 5.3.2 順序、分支與循環(huán)程序設(shè)計(jì) 利用計(jì)算機(jī)解決實(shí)際問(wèn)題時(shí),其操作控制執(zhí)行步驟
47、有時(shí)是按順序執(zhí)行的,有時(shí)需要根據(jù)實(shí)際情況選擇某一個(gè)分支的操作執(zhí)行,有時(shí)需要對(duì)某一些操作步驟反復(fù)執(zhí)行,與之相對(duì)應(yīng),就有3種程序結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。 順序結(jié)構(gòu)程序完全按指令書(shū)寫(xiě)的前后順序,從頭至尾逐條執(zhí)行,是最常用、最基本的程序結(jié)構(gòu)。常用于處理查表程序、計(jì)算表達(dá)式程序。 順序結(jié)構(gòu) 根據(jù)指定的條件選擇程序執(zhí)行的方向,這種程序結(jié)構(gòu)稱(chēng)為分支程序結(jié)構(gòu)。常根據(jù)CMP、TEST等指令執(zhí)行后形成的狀態(tài)標(biāo)志,通過(guò)轉(zhuǎn)移指令JXX判斷標(biāo)志位的變化,來(lái)實(shí)現(xiàn)條件判斷控制程序轉(zhuǎn)向某個(gè)分支執(zhí)行;或通過(guò)JMP實(shí)現(xiàn)無(wú)條件轉(zhuǎn)移。 根據(jù)分支轉(zhuǎn)向的不同結(jié)構(gòu),可將分支結(jié)構(gòu)分為3種:?jiǎn)畏种А㈦p分支和多分支結(jié)構(gòu)。 分支結(jié)構(gòu)
48、單分支程序滿(mǎn)足條件時(shí)轉(zhuǎn)向分支執(zhí)行,否則順序執(zhí)行。 條件成立轉(zhuǎn)向分支語(yǔ)句體2執(zhí)行,否則順序執(zhí)行分支語(yǔ)句體1,并且執(zhí)行完分支語(yǔ)句體1后要跳過(guò)分支語(yǔ)句體2,用JMP無(wú)條件跳轉(zhuǎn)到分支語(yǔ)句體2后執(zhí)行。 雙分支程序 需要對(duì)多個(gè)條件進(jìn)行判斷,每個(gè)條件都對(duì)應(yīng)一個(gè)分支,滿(mǎn)足某個(gè)條件時(shí)就進(jìn)入相對(duì)應(yīng)的分支執(zhí)行。 多分支程序 邏輯分解方法 將多分支結(jié)構(gòu)以邏輯等效的方法,分解為一串雙分支結(jié)構(gòu)。 地址表方法 在數(shù)據(jù)段定義一個(gè)地址表,依次存放各分支語(yǔ)句體的入口地址,用寄存器間接尋址或寄存器相對(duì)尋址方式產(chǎn)生轉(zhuǎn)移目標(biāo)地址,實(shí)現(xiàn)轉(zhuǎn)移。 分支入口地址地址表首地址偏移地址。對(duì)于多分支程序結(jié)構(gòu),可以采用以下2種解決方法: 說(shuō)明: 1、對(duì)于既能用雙分支結(jié)構(gòu)、又能用單分支結(jié)構(gòu)實(shí)現(xiàn)的程序,宜采用單分支結(jié)構(gòu),以減少轉(zhuǎn)移次數(shù),程序結(jié)構(gòu)簡(jiǎn)單。 2、對(duì)于多分支結(jié)構(gòu)程序,宜采用地址表法,以減少轉(zhuǎn)移次數(shù),程序結(jié)構(gòu)簡(jiǎn)單。 3、對(duì)分支結(jié)構(gòu)程序進(jìn)行測(cè)試時(shí),應(yīng)對(duì)每一個(gè)分支都進(jìn)行檢測(cè),才能保證整個(gè)程序的正確性。 循環(huán)結(jié)構(gòu) 根據(jù)某一條件是否成立判斷是否需要重復(fù)執(zhí)行某個(gè)語(yǔ)句組,這種程序結(jié)構(gòu)稱(chēng)為循環(huán)結(jié)構(gòu)。7/18/202293 循環(huán)初始化:位于循環(huán)程序開(kāi)頭,設(shè)置各工作單元的初始值,設(shè)定循環(huán)次數(shù)等。 循環(huán)體:循環(huán)體也稱(chēng)為循環(huán)處理部分,是循環(huán)程序的核心,用于完成實(shí)際操作處理,是重復(fù)的執(zhí)行部分。 循環(huán)控制:位于循環(huán)體內(nèi),一般由循環(huán)次數(shù)修改、指針修改和條件
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 租農(nóng)村廠房合同范本
- 付款委托合同范本
- 上半年電工工作總結(jié)
- 三年級(jí)下冊(cè)語(yǔ)文教學(xué)工作計(jì)劃
- 各種工程合同范本
- 人防工程物業(yè)管理合同范例
- 單位簡(jiǎn)易裝修合同范本
- 買(mǎi)房單合同范本
- 化肥質(zhì)保合同范本
- 《輪椅上的霍金》讀書(shū)心得體會(huì)
- 《急性冠狀動(dòng)脈綜合征》課件
- 《馬克思生平故事》課件
- 2024-2025學(xué)年四川省成都市高一上學(xué)期期末教學(xué)質(zhì)量監(jiān)測(cè)英語(yǔ)試題(解析版)
- 《以哪吒精神照亮成長(zhǎng)之路》開(kāi)學(xué)家長(zhǎng)會(huì)課件
- HRBP工作總結(jié)與計(jì)劃
- 八大危險(xiǎn)作業(yè)安全培訓(xùn)考試試題及答案
- 2025中國(guó)船舶集團(tuán)限公司招聘高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 2025年上半年中電科太力通信科技限公司招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年沙洲職業(yè)工學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 【化學(xué)】常見(jiàn)的鹽(第1課時(shí))-2024-2025學(xué)年九年級(jí)化學(xué)下冊(cè)(人教版2024)
評(píng)論
0/150
提交評(píng)論