匯編語(yǔ)言入門教程-第五章:匯編語(yǔ)言程序結(jié)構(gòu).ppt
教學(xué)重點(diǎn),本章重點(diǎn)掌握: 程序的格式、開(kāi)發(fā)方法 參數(shù)的表達(dá)、變量的定義 變量和標(biāo)號(hào)的屬性,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),第一章 基礎(chǔ)知識(shí),機(jī)器語(yǔ)言計(jì)算機(jī)能夠直接識(shí)別并執(zhí)行的二進(jìn)制機(jī)器指令序列,優(yōu)點(diǎn):開(kāi)銷小、運(yùn)行速度快; 缺點(diǎn):難以編寫(xiě)和理解,編程效率很低。,匯編語(yǔ)言(Assembly Language) 用助記符號(hào)表示機(jī)器指令代碼、變量地址,標(biāo)號(hào)等的符號(hào)指令序列。,優(yōu)點(diǎn):易記、易理解,易編寫(xiě)程序,大大提高了編程效率 ; 問(wèn)題:需要將助記符號(hào)翻譯為機(jī)器語(yǔ)言。,匯編語(yǔ)言源程序:用匯編語(yǔ)言編寫(xiě)的程序。,匯編程序:將助記符號(hào)翻譯為機(jī)器語(yǔ)言的語(yǔ)言處理程序,以便 計(jì)算機(jī)能夠識(shí)別。,匯編:將助記符號(hào)翻譯為機(jī)器語(yǔ)言的過(guò)程。,理解以上幾個(gè)名詞概念: 匯編語(yǔ)言、匯編語(yǔ)言源程序、匯編程序、匯編,概 念,第一節(jié):匯編程序功能及上機(jī)過(guò)程,匯編程序功能,一般匯編程序都應(yīng)具有如下功能: 宏匯編功能 支持地址和數(shù)據(jù)的符號(hào)表示 支持內(nèi)存管理 支持程序的模塊化組織 支持多種類型的數(shù)據(jù)表示等,匯編程序依賴于硬件,不同機(jī)型的系統(tǒng)有自己的匯編程序。,上機(jī)過(guò)程,上機(jī)過(guò)程如圖所示,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),匯編語(yǔ)言源程序的結(jié)構(gòu)與書(shū)寫(xiě)格式,匯編語(yǔ)言源程序是段結(jié)構(gòu)的:代碼段、數(shù)據(jù)段、堆棧段、附加段,源程序由段組成,每段有一個(gè)段名,segment定義段起點(diǎn),ends定義段結(jié)束點(diǎn)。每段由若干語(yǔ)句行組成,源程序以end結(jié)束。,例字符串傳送,指令和偽指令,指令使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的語(yǔ)句,就是前一章學(xué)習(xí)的處理器指令 偽指令(Directive)不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說(shuō)明性語(yǔ)句,例如,數(shù)據(jù)說(shuō)明、變量定義等等 偽指令與具體的處理器類型無(wú)關(guān),但與匯編程序的版本有關(guān),本課程采用微軟宏匯編程序 MASM 5.0,匯編語(yǔ)言語(yǔ)句一般格式為: 標(biāo)識(shí)符/語(yǔ)句標(biāo)號(hào) 指令名 操作數(shù)序列 ;注釋,標(biāo)識(shí)符用來(lái)為變量、段及過(guò)程等命名,語(yǔ)句標(biāo)號(hào)標(biāo)識(shí)符后加 : ,提供轉(zhuǎn)移地址,指令名指令可分為三類:機(jī)器指令、偽指令和宏指令。,機(jī)器指令:指令系統(tǒng)中的指令,程序運(yùn)行時(shí)由CPU執(zhí)行;,偽指令:匯編程序執(zhí)行的操作,規(guī)定匯編程序如何按要求進(jìn)行匯編及分配內(nèi)存 。,宏指令:由一系列指令或偽指令構(gòu)成,匯編時(shí)展開(kāi)成若干條機(jī)器指令,用于提高編程效率。,操作數(shù)序列可以是常量、變量、表達(dá)式、寄存器名或標(biāo)號(hào)等,用逗號(hào)隔開(kāi)。,(偽指令和宏指令由匯編程序在匯編期間處理 ),注釋符 “;”后可給出語(yǔ)句注釋,提高可讀性和可理解性。,第二節(jié):匯編語(yǔ)言語(yǔ)句格式與分類,(1)常量 00110110B 389D 467O B407H 3.475E+5 Input a number,(2)變量 變量名:存儲(chǔ)單元的符號(hào)地址 變量值:存儲(chǔ)單元中的數(shù)據(jù),MOV AL, A mov al, a,變量的三種屬性: 段值(SEG):變量所在段的起始地址 偏移量(OFFSET):段起點(diǎn)距離變量所在存儲(chǔ)單 元位置的字節(jié)數(shù),類型(TYPE):變量占用的字節(jié)數(shù),常量、變量、標(biāo)號(hào),(3)標(biāo)號(hào) 標(biāo)號(hào):存放指令的存儲(chǔ)單元的符號(hào)地址,常用作轉(zhuǎn)移地址。,NEAR :2字節(jié)轉(zhuǎn)移地址, CMP AX,BX JNE NEXT NEXT: MOV AX,0 ,標(biāo)號(hào)的三種屬性: 段值(SEG):標(biāo)號(hào)所在段的起始地址 偏移量(OFFSET):段起點(diǎn)距離標(biāo)號(hào)所指存儲(chǔ)單 元位置的字節(jié)數(shù),類型(TYPE): NEAR , FAR,(偏移地址),短指針(近指針),段內(nèi)轉(zhuǎn)移,FAR :4字節(jié)轉(zhuǎn)移地址,(段、偏移地址),長(zhǎng)指針(遠(yuǎn)指針),段間轉(zhuǎn)移,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),匯編語(yǔ)言程序的語(yǔ)句類型:1、程序執(zhí)行指令語(yǔ)句。2、偽操作語(yǔ)句。 3、宏指令語(yǔ)句。,偽操作的功能:偽操作又稱為偽指令,它不象機(jī)器指令那樣是在程序運(yùn)行期間由計(jì)算機(jī)來(lái)執(zhí)行的,它是在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的操作,它們可以完成如下功能: (1)符號(hào)定義偽指令 (2)數(shù)據(jù)定義偽指令 (3)段定義偽指令 (4) 過(guò)程定義偽指令 (5)條件匯編偽指令 (6)宏指令 (7)結(jié)構(gòu)與記錄,一、數(shù)據(jù)定義及存儲(chǔ)器分配偽操作,格式: Variable Mnemonic Operand , , Operand ;Comments,變量(Variable)字段:是可有可無(wú)的,它用符號(hào)地址表示,其作用與指令語(yǔ)句前的標(biāo)號(hào)相同,但它的后面不跟冒號(hào)。如果語(yǔ)句中有變量則匯編程序使其記以第一個(gè)字節(jié)的偏移地址。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),注釋(Comments)字段:用來(lái)說(shuō)明該偽操作的功能,它也是可有可無(wú)的。 助記符(Mnemonic)字段:說(shuō)明所用偽操作的助記符,常用的有以下幾種:,DB偽操作:用來(lái)定義字節(jié),其后的每個(gè)操作數(shù)都占有一個(gè)字節(jié)。 DW的操作:用來(lái)定義字,其后的每個(gè)操作數(shù)占有一個(gè)字(低位字節(jié)在第一個(gè)字節(jié)地址中,高位字節(jié)在第二個(gè)字節(jié)地址中)。,DD偽操作:用來(lái)定義雙字,其后的每個(gè)操作數(shù)占有二個(gè)字。 DQ偽操作:用來(lái)定義四個(gè)字,其后的每個(gè)操作數(shù)占有四個(gè)字。 DT偽操作:用來(lái)定義十個(gè)字節(jié),其后的每個(gè)操作數(shù)占有十個(gè)字節(jié),形成壓縮的BCD碼。,這些偽操作可以把其后面跟著的數(shù)據(jù)存入指定的存儲(chǔ)單元,或者只分配存儲(chǔ)器空間而并不存入確定的數(shù)值。DW和DD偽操作可以存儲(chǔ)偏移地址或完整的地址 。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),例 操作數(shù)可以是常數(shù),或者是表達(dá)式(根據(jù)該表達(dá)式可以求得一個(gè)常數(shù)),如 DATA_BYTE DB 10,4,l0H DATA_WORD DW 100,100H,-5 DATADW DD 3*20,0FFFDH 匯編程序可以在匯編期間在存儲(chǔ)器中存入數(shù)據(jù),如右圖所示。,例 操作數(shù)也可以是字符串,如: MESSAGE DB H2LLO,則存儲(chǔ)器存儲(chǔ)情況如下圖所示:,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),注意:DB AB和DW AB的存儲(chǔ) 分配空間的不同。如下圖:,例 操作數(shù)?可以保留存儲(chǔ)空間,但不存入數(shù)據(jù)。 如:ABC DB 0,?, ?, ?,0 DFF DW ?, 52, ? 經(jīng)匯編后的存儲(chǔ)情況如右圖所示。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),操作數(shù)字段還可以使用復(fù)制操作符來(lái)復(fù)制某個(gè)(或某些)操作數(shù)。其格式為: repeat_count DUP(operate, operate,),其中repeat_count可以是一個(gè)表達(dá)式,它的值應(yīng)該是一個(gè)正整數(shù),用來(lái)指定括號(hào)中的操作數(shù)的重復(fù)次數(shù)。,例 ARRAYl DB 2 DUP(0, 1,2,?) ARRAY2 DB 100 DUP(?),匯編后的存儲(chǔ)情況如下圖所示。,ARRAYl DB 2 DUP(0, 1,2,?) 和以下語(yǔ)句是等價(jià)的: ARRAYl DB 0,I,2,?,0,1,2,?,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),例 DUP操作可以嵌套,例如 ARRAY3 DB 100DUP(0,2 DUP(1,2),0,3),則匯編結(jié)果如右圖所示:,可以用DW或DD偽操作把變量或標(biāo)號(hào)的偏移地址(DW)或整個(gè)地址(DD)存入存儲(chǔ)器。用DD偽操作存入地址時(shí),第一個(gè)字為偏移地址,第二個(gè)字為段地址。,例如 PARAMETER_TABLE DW PAR1 DW PAR2 DW PAR3 INTERSEG_DATA DD DATA1 DD DATA2 則匯編后的存儲(chǔ)情況如下圖所示。其中偏移地址或段地址均占有一個(gè)宇,其低位字節(jié)占有第一個(gè)字節(jié),高位字節(jié)占有第二個(gè)字節(jié)。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),順便說(shuō)明一下,這里操作數(shù)字段中的變量或標(biāo)號(hào)可以使用表達(dá)式如 :,在這種情況下,匯編后,存儲(chǔ)器中應(yīng)該存入表達(dá)式的值。 例如 PARAMETER_TABLE DW PAR1+1 DW PAR2+1,說(shuō)明變量的類型屬性問(wèn)題 :,在數(shù)據(jù)定義偽操作前面的變量的值是該偽操作中的第一個(gè)數(shù)據(jù)項(xiàng)在當(dāng)前段內(nèi)的第一個(gè)字節(jié)的偏移地址。此外,它還有一個(gè)類型屬性用來(lái)表示該語(yǔ)句中的每一個(gè)數(shù)據(jù)項(xiàng)的長(zhǎng)度(以字節(jié)為單位表示),因此DB偽操作的類型屬性為1,DW為2,DD為4,DQ為8,DT則為10,變量表達(dá)式的屬性和變量是相同的。 匯編程序可以用這種隱含的類型屬性來(lái)確定某些指令是字指令還是字節(jié)指令。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),例如 OPER1 DB ?,? OPER2 DW ?,? MOV OPER1, 0 MOV OPER2, 0,則第一條指令應(yīng)為字節(jié)指令,第二條指令則應(yīng)為字指令。,如果有下列指令序列 :,OPER1 DB 1,2 OPER2 DW 1234H,2345H MOV AX ,OPER1+1 MOV AL ,OPER2,匯編程序在匯編這一段程序時(shí),能發(fā)現(xiàn)兩條MOV指令的兩個(gè)操作數(shù)的類型屬性是不相同的: OPERl十1為字節(jié)類型屬性而AX為字類型屬性; OPER2為字類型屬性而AL為字節(jié)類型屬性。 匯編語(yǔ)言將指示由于屬性類型不匹配出錯(cuò)。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),有一個(gè)辦法可以指定操作數(shù)的類型屬性,它優(yōu)先于隱含的類型屬性,即可以使用PTR屬性操作符。其格式為: type PTR Varible士 constant expression 其中類型可以是BYTE,WORD或DWORD(雙字),這樣變量的類型就可以指定了。上面例子可以寫(xiě)為: OPER1 DB 1,2 OPER2 DW 1234H,2345H MOV AX ,WORD PTR OPER1+1 MOV AL ,BYTE PTR OPER2,通過(guò)PTR屬性操作符就把OPER1十1的類型屬性指定為字,兩個(gè)操作數(shù)的屬性就一致了,匯編時(shí)不會(huì)出錯(cuò),而運(yùn)行時(shí)應(yīng)把OPER1十1的字內(nèi)容送到AX,即把OPER1十1的內(nèi)容送AL,把OPER2的第一個(gè)字節(jié)的內(nèi)容運(yùn)AH,所以指令執(zhí)行完后,(AX)3402H。 同樣,對(duì)于第二條語(yǔ)句(AL)=34H,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),LABEL偽操作 :,除了用屬性操作符給以定義外,還可以用LABEL偽操作來(lái)定義,其格式為: name LABEL type,(1) 對(duì)于數(shù)據(jù)項(xiàng)可以表示為: variable_name LABEL type 其中,type可以是BYTE,WORD或DWORD(雙字)。 ( 2)對(duì)于可執(zhí)行的代碼,則可表示為 label_name LABEL type 其中,type可以是NEAR或FAR。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),例如4.9 BYTE_ARRAY LABEL BYTE WORD_ARRAY DW 50 DUP(?) 這樣在100個(gè)字節(jié)數(shù)組中的第一個(gè)字節(jié)的地址賦于二個(gè)不同類型的變量名:字節(jié)類型的變量BYTE_ARRAY和字類型變量WORD_ARRAY。 指令 MOV WORD_ARRAY十2. , 0 把該數(shù)組的第3個(gè)和第4個(gè)字節(jié)置0,而 MOV BYTE_ARRAY十2. , 0 則把該數(shù)組的第3個(gè)字節(jié)置0。,例: LABF LABEL FAR LAB: MOV AX,100,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),二、表達(dá)式賦值偽操作EQU,有時(shí)程序中多次出現(xiàn)同一個(gè)表達(dá)式為方便起見(jiàn)可以用賦值偽操作給表達(dá)式賦予一個(gè)名字,其格式如下:,此后,程序中凡需要用到該表達(dá)式之處就可以用表達(dá)式名來(lái)代替了。 上式中的表達(dá)式可以是任何有效的操作數(shù)格式,可以是任何可以求出常數(shù)值的表達(dá)式,也可以是任何有效的助記符。舉例如下:,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),必須注意EQU語(yǔ)句的表達(dá)式中如果有變量或標(biāo)號(hào)的表達(dá)式,則在該語(yǔ)句前應(yīng)該先給出它們的定義。例如,語(yǔ)句 :,則必須放在DATA_ONE的定義之后才行,否則匯編程序?qū)⒅甘境鲥e(cuò)。,另外還有一個(gè)與EQU相類似的 = 偽操作也可以作為賦值偽操作使用。它們之間的區(qū)別是:EQU偽操作中的表達(dá)式名是不允許重復(fù)定義的,而 = 偽操作則允許重復(fù)定義。 例如: EMP = 6 或 EMP EQU 6都可以使數(shù)6賦以符號(hào)名EMP,但是不允許兩者同時(shí)使用。,第一個(gè)語(yǔ)句后的指令中EMP值為7;而第二個(gè)語(yǔ)句后的指令中EMP值為8。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),三、段定義偽操作,存儲(chǔ)器的物理地址是由段地址和偏移地址組合而成的,匯編程序在把源程序轉(zhuǎn)換為目標(biāo)程序時(shí),必須確定標(biāo)號(hào)和變量的偏移地址,并且需要把有關(guān)信息通過(guò)目標(biāo)模塊傳送給連接程序,以便連接程序把不同的段和模塊連接在一起形成一個(gè)可執(zhí)行程序。為此,需要用段定義偽操作,段定義偽操作的格式如下:,此外,還要明確段和段寄存器的關(guān)系,這可用ASSUME偽操作來(lái)實(shí)現(xiàn),其格式為:,其中assignment說(shuō)明分配情況,其格式為:,其中段寄存器名必須是CS、DS、ES和SS中的一個(gè),而段名則必須是由segment定義的段中的段名。 而ASSUME NOTHING則可取消前面由ASSUME所指定的段寄存器。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),例如:,由于assume偽操作只是指定某個(gè)段分配給那一個(gè)段寄存器,它并不能把段地址裝入段寄存器中,所以在代碼段中。還必須把段地址裝入相應(yīng)的段寄存器中。為此,在上例的程序中,分別用兩條MOV指令完成這一操作。如果程序中有堆棧段,也需要把段地址裝入SS中。但是,代碼段不需要這樣做,代碼段的這一操作在程序初始化時(shí)完成。 功能:,通知MASM用指定的段寄存器來(lái)尋址對(duì)應(yīng)的邏輯段,即建立段寄存器與段的缺省關(guān)系 在明確了程序中各段與段寄存器之間的關(guān)系后,匯編程序會(huì)根據(jù)數(shù)據(jù)所在的邏輯段,在需要時(shí)自動(dòng)插入段超越前綴。這是ASSUME偽指令的主要功能 ASSUME偽指令并不為段寄存器設(shè)定初值,連接程序LINK將正確設(shè)置CS : IP和SS : SP 由于數(shù)據(jù)段通常都需要,所以在樣板源程序中,首先為DS賦值;如果使用附加段,還要賦值ES,段寄存器的裝入,DS和ES的裝入 通過(guò)寄存器傳送 如:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX SS的裝入 (1)自動(dòng)裝入 采用定義段時(shí)指定組合類型STACK參數(shù),在ASSUME語(yǔ)句中建立SS的關(guān)系,這樣就可以自動(dòng)裝入SS。,SS段寄存器的裝入,stack1segment para stack dw 40h dup(?) stack1ends code1segment assume cs:code1,ss:stack1, ,SS段寄存器的裝入,(2) 程序設(shè)置 stack1segment para stack dw 40h dup(?) toplabelword stack1ends code1segment assume cs:code1,ss:stack1, mov ax,stack1 mov ss,ax mov sp,offset top ,CS和IP的裝入,初始化時(shí)裝入,根據(jù)END偽指令指示的地址 END 標(biāo)號(hào) END語(yǔ)句的作用: 告訴匯編程序,源程序結(jié)束 指定程序運(yùn)行時(shí)的起始地址,即: seg 標(biāo)號(hào) cs offset 標(biāo)號(hào) ip,匯編結(jié)束偽指令,END 標(biāo)號(hào),指示匯編程序MASM到此結(jié)束匯編過(guò)程 源程序的最后必須有一條END語(yǔ)句 可選的標(biāo)號(hào)用于指定程序開(kāi)始執(zhí)行點(diǎn),連接程序?qū)?jù)此設(shè)置CS : IP值,不要糊涂 程序終止和匯編結(jié)束是兩碼事,CS和IP的裝入,(2)自動(dòng)修改CS和IP 執(zhí)行CALL FAR和RET指令 執(zhí)行JMP FAR指令 響應(yīng)中斷及中斷返回(IRET) RESET ,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),SEGMENT偽操作還可以增加類型及屬性的說(shuō)明,格式如下 :,一般情況下,這些說(shuō)明可以不用。但是,如果需要用連接程序把本程序與其他程序模塊相連接時(shí),就需要使用這些說(shuō)明。分別敘述如下:,* 定位類型(align_type)可以是:,段名 SEGMENT 定位類型 組合類型 段字類別名 段名 ENDS,實(shí)際上定位類型可以理解為對(duì)兩個(gè)相臨段的段地址給予的一些規(guī)定。定位類型可以有以下幾種:PARA:指定所定義的段開(kāi)始于小段邊界,實(shí)際是規(guī)定這個(gè)段的起始地址與前面一個(gè)段的起始地址之差必須是16字節(jié)的整數(shù)倍。這意味著相臨兩個(gè)段的段地址之差最小也得是1。PAGE:指定定義的段開(kāi)始于頁(yè)邊界,實(shí)際是規(guī)定這個(gè)段的起始地址與前面一個(gè)段的起始地址之差必須是256字節(jié)的整數(shù)倍。BYTE:所定義的段開(kāi)始于字節(jié)邊界,實(shí)際上是指這個(gè)段可以從任何地址開(kāi)始。WORD:所定義的段開(kāi)始于字邊界,實(shí)際是指這個(gè)段只能從偶數(shù)地址開(kāi)始。,如果源程序中指定了段的定位類型為PARA或PAGE,那么獲得的可執(zhí)行文件中相臨段的段地址就有差異。 但是如果源程序中指定了段的定位類型是BYTE或WORD,那么在可執(zhí)行文件中相臨段的段地址就有可能相同。 為了說(shuō)明這個(gè)問(wèn)題,我們下面給出了一個(gè)程序例:,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),*組合類型 (combine_type)設(shè)置一定的組合類型就可以通知LINK程序把一些分散在不同模塊內(nèi)的同類型段組織在一個(gè)段內(nèi),這樣可以使最終形成的可執(zhí)行文件結(jié)構(gòu)比較清晰。,PUBLIC 該段連接時(shí)將與有相同名字的其他分段連接在一起。其連接次序由連接命令指定。 COMMON 該段在連接時(shí)與其他同名分段有相同的起始地址,所以會(huì)產(chǎn)生覆蓋。COMMON的連接長(zhǎng)度是各分段中的最大長(zhǎng)度。 AT expression 使段的起始地址是表達(dá)式所計(jì)算出來(lái)的16位段地址。但它不能用來(lái)指定代碼段。 STOCK 指定該段在運(yùn)行時(shí)為堆棧段的部分。 MEMORY 指定該段將分配在所有其他連接在一起的段的前面(在高地址上),如果連接時(shí)有幾個(gè)指定MEMORY的段,則遇到的第一段作為MEMORY段,其他則作為COMMON段,*類別(CLASS) 連接時(shí)用于組成段組的名字:,可以是:,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),四、程序開(kāi)始和結(jié)束偽操作 (ASM操作規(guī)則),在程序的開(kāi)始可以用NAME或TITLE為模塊取名字,NAME的格式是: NAME module_name 匯編程序?qū)⒁越o出的module_name作為模塊的名字。如果程序中沒(méi)有NAME偽操作,則也可使用TITLE偽操作,其格式為; TITLE text TITLE 偽操作可指定每一頁(yè)上打印的標(biāo)題。同時(shí),如果程序中沒(méi)有使用NAME偽操作則程序?qū)⒂胻ext中的前六個(gè)字符作為模塊名。text最多可有60個(gè)字符。如果程序中既無(wú)NAME又無(wú)TITLE偽操作,則將用源文件名作為模塊名。所以NAME及TILLE偽操作并不是必要的, 表示源程序結(jié)束的偽操作的格式為:,其中標(biāo)號(hào)指示程序開(kāi)始執(zhí)行的起始地址。如果多個(gè)程序模塊相連接,則只有主程序要使用標(biāo)號(hào),其它子程序模塊則只用END而不必指定標(biāo)號(hào)。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),五、對(duì)準(zhǔn)偽操作,* EVEN的操作 :,使下一個(gè)字節(jié)地址成為偶數(shù)。一個(gè)字的地址最好從偶地址開(kāi)始,所以對(duì)于字?jǐn)?shù)組為保證其從偶地址開(kāi)始,可以在它前面用EVEN偽操作來(lái)達(dá)到這一目的。 例如:,* ORG Constant expression,如常數(shù)表達(dá)式的值為n,則ORG偽操作可以使下一個(gè)字節(jié)的地址成為常數(shù)表達(dá)式的值n。例 :,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),則VECT1的偏移地址值為0AH,而VECT2的偏移地址值為14H。,在匯編程序?qū)υ闯绦騾R編的過(guò)程中,使用地址計(jì)數(shù)器來(lái)保存當(dāng)前正在匯編的指令的地址。地址計(jì)數(shù)器的值可用$來(lái)表示,匯編語(yǔ)言允許用戶直接用$來(lái)引用地址計(jì)數(shù)器的值,因此 ORG $+8 可以表示跳過(guò)8個(gè)字節(jié)的存儲(chǔ)區(qū)。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),在指令和偽操作中也可以直接用$來(lái)表示地址計(jì)數(shù)器的值,如 JNE $+6 則轉(zhuǎn)向地址是JNE指令的首地址加上6。在這里,$十6必須是另一條指令的首地址,否則,匯編程序指示出錯(cuò)信息。當(dāng)$用在偽操作的參數(shù)字段時(shí),則和用在指令中的情況不同,它表示的是地址計(jì)數(shù)器的當(dāng)前值。,如匯編時(shí)ARRAY分配的偏移地址為0074H,則匯編后的存儲(chǔ)區(qū)將如右圖所示。應(yīng)該注意,ARRAY數(shù)組中的兩個(gè)十4得到的結(jié)果是不同的,這是由于$的值是在不斷變化的緣故。當(dāng)在指令中用到$時(shí),它只代表該指令的首地址,而與$本身所在的字節(jié)無(wú)關(guān)。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),六、基數(shù)控制偽操作,匯編程序默認(rèn)的是十進(jìn)制數(shù),為此,當(dāng)使用其他基數(shù)表示的常數(shù)時(shí),需要專門給以標(biāo)記如下: l 二進(jìn)制:后面跟字母B l 十進(jìn)制:默認(rèn),后面也可以跟字母D l 十六進(jìn)制:后面跟字母H,如果第一個(gè)字母是A-F時(shí),應(yīng)在其前面加上數(shù)字0 l 八進(jìn)制:后面跟O或Q。,RADIX偽操作,可以把默認(rèn)的基數(shù)改變?yōu)? 16范圍內(nèi)的任何基數(shù)。格式如下: RADIX expression,字符串可以看成串常數(shù),可以用單引號(hào)或雙引號(hào)把字符串放在其中,得到的是字符串的ASC碼值,例如ABCD。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),第三節(jié):匯編語(yǔ)言程序格式,匯編語(yǔ)言源程序中的每個(gè)語(yǔ)句可以由四項(xiàng)組成,格式如下:,其中: 名字項(xiàng)是個(gè)符號(hào)。 操作項(xiàng)是一個(gè)操作碼的助記符,它可以是指令、偽操作或宏指令名。 操作數(shù)項(xiàng)由一個(gè)或多個(gè)表達(dá)式組成,它提供為執(zhí)行所要求的操作而需要的信息。 注釋項(xiàng)用來(lái)說(shuō)明程序或語(yǔ)句的功能。為識(shí)別注釋項(xiàng)的開(kāi)始。也可以從一行的第一個(gè)字節(jié)開(kāi)始,此時(shí)整行都是注釋,常用來(lái)說(shuō)明下面一段程序的功能。,一 名字項(xiàng),源程序中用下列字符來(lái)表示名字 字母A Z 數(shù)字0 9 專用字符?、一、$,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),注意:(1)除數(shù)字外,所有字符都可以放在源語(yǔ)句的第一個(gè)位置。 (2)名字中如果用到則必須是第一個(gè)字符。 (3)可以用很多字符來(lái)說(shuō)明名字,但只有前面的31個(gè)字符能被匯編程序所識(shí)別。,用途:名字項(xiàng)可以是標(biāo)號(hào)或變量。它們都用來(lái)表示本語(yǔ)句的符號(hào)地址,它是可有可無(wú)的,只有當(dāng)需要用符號(hào)地址來(lái)訪問(wèn)該語(yǔ)句時(shí)它才需要出現(xiàn)。,標(biāo)號(hào):標(biāo)號(hào)在代碼段中定義,后面跟冒號(hào):,它也可以用LABEL或EQU偽操作來(lái)定義。此外它還可以作為過(guò)程名定義。標(biāo)號(hào)經(jīng)常在轉(zhuǎn)移指令或CALL指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向地址。 標(biāo)號(hào)有三種屬性;段、偏移及類型。,段屬性:定義標(biāo)號(hào)的段起始地址,此值必須在一個(gè)段寄存器中。而標(biāo)號(hào)的段則總是在CS寄存器中。 偏移屬性:標(biāo)號(hào)的偏移地址是16位無(wú)符號(hào)數(shù),它代表從段起始地址到定義標(biāo)號(hào)的位置之間的字節(jié)數(shù)。 類型屬性:用來(lái)指出該標(biāo)號(hào)是在本段內(nèi)引用還是在其它段中引用的。如在段內(nèi)引用的,則稱為NEAR,指針長(zhǎng)度為2字節(jié):如在段外引用,則稱為FAR,指針長(zhǎng)度為4字節(jié)。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),變量:變量在除代碼段以外的其他段中定義,后面不跟冒號(hào)。它也可以用LABEL或EQU偽操作來(lái)定義。變量經(jīng)常在操作數(shù)字段出現(xiàn)。它也有段、偏移及類型三種屬性。,段屬性:定義變量的段起始地址,此值必須在一個(gè)段寄存器中。 偏移屬性;變量的偏移地址是16位無(wú)符號(hào)數(shù),它代表從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。在當(dāng)前段內(nèi)給出變量的偏移值等于當(dāng)前地址計(jì)數(shù)器的值,當(dāng)前地址計(jì)數(shù)器的值可以用$來(lái)表示。 類型屬性;變量的類型屬性定義該變量所保留的字節(jié)數(shù)。如BYTE(1個(gè)字節(jié)長(zhǎng))、WORD(2個(gè)字節(jié)長(zhǎng))、DWORD(4個(gè)字節(jié)長(zhǎng))、DQ(8個(gè)字節(jié)長(zhǎng))、DT(10個(gè)字節(jié)長(zhǎng)),這一點(diǎn)在數(shù)據(jù)定義偽操作中已作了說(shuō)明。,在程序中同樣的標(biāo)號(hào)或變量的定義只允許出現(xiàn)一次,否則匯編程序會(huì)指示出錯(cuò)。,二、操作項(xiàng),操作項(xiàng)可以是指令、偽操作或宏指令的助記符。對(duì)于指令,匯編程序?qū)⑵浞g為機(jī)器語(yǔ)言指令。對(duì)于偽操作匯編程序?qū)⒏鶕?jù)其所要求的功能進(jìn)行處理。對(duì)于宏指令,則將根據(jù)其定義展開(kāi)。這在以后中將專門論述。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),三、操作數(shù)項(xiàng),操作數(shù)項(xiàng)由一個(gè)或多個(gè)表達(dá)式組成,多個(gè)操作數(shù)項(xiàng)之間一般用逗號(hào)分開(kāi)。對(duì)于指令,操作數(shù)項(xiàng)一般給出操作數(shù)地址,它們可能有一個(gè)或二個(gè)或一個(gè)也沒(méi)有。對(duì)于偽操作或宏指令則給出它們所要求的參數(shù)。,操作數(shù)項(xiàng)可以是常數(shù)、寄存器、標(biāo)號(hào)、變量或由表達(dá)式組成。,表達(dá)式是常數(shù)、寄存器、標(biāo)號(hào)、變量與一些操作符相組合的序列,可以有數(shù)字表達(dá)式和地址表達(dá)式兩種。在匯編期間,匯編程序按照一定的優(yōu)先規(guī)則對(duì)表達(dá)式進(jìn)行計(jì)算后可得到一個(gè)數(shù)值或一個(gè)地址。,(一)算術(shù)操作符,算術(shù)操作符有十、一、*、和MOD。其中MOD是指除法運(yùn)算后得到的余數(shù),如197的商是2,而19 MOD 7則為5(余數(shù)),算術(shù)操作符可以用于數(shù)字表達(dá)式或地址表達(dá)式中,但當(dāng)它用于地址表達(dá)式時(shí),只有當(dāng)其結(jié)果有明確的物理意義時(shí)其結(jié)果才是有效的。例如兩個(gè)地址相乘或相除是無(wú)意義的。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),例 : 如要求把首地址為BLOCK的字?jǐn)?shù)組的第6個(gè)字傳送到DX寄存器,可用指令 M0V DX,BLOCK十 (6 - 1)*2 例: 如數(shù)組ARRAY定義,如下試寫(xiě)出把數(shù)組長(zhǎng)度(字?jǐn)?shù))存入CX寄存器的指令。 ARRAY DW 1,2,3,4,5,6,7 ENDB DW ? 其中END是為計(jì)算數(shù)組長(zhǎng)度而建立的符號(hào)地址,所需指令如下 MOV CX ,(ENDBARRAY)2 匯編程序在匯編期間將計(jì)算表達(dá)式而形成指令 MOV CX , 7,(二)邏輯操作符,它有AND、OR、XOR和NOT。邏輯操作符是按位操作的,它只能用于數(shù)字表達(dá)式中。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),例:,其中PORT_VAL為端口號(hào),OUT指令中的表達(dá)式說(shuō)明當(dāng)PORT_VAL為偶數(shù)時(shí),輸出端口號(hào)與輸入端門號(hào)相同,而當(dāng)PORT_VAL為奇數(shù)時(shí),輸出瑞口號(hào)比輸入端口號(hào)小1。,(三)關(guān)系操作符,它有EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)6種。,關(guān)系操作符的兩個(gè)操作數(shù)必須都是數(shù)字或是同一段內(nèi)的兩個(gè)存儲(chǔ)器地址。計(jì)算的結(jié)果應(yīng)為邏輯值:結(jié)果為真,表示為0FFFFH,結(jié)果為假,則表示為0。,例:,則當(dāng)PORT_VAL5時(shí),匯編結(jié)果應(yīng)該是: MOV BX, 20 否則,匯編結(jié)果應(yīng)該是: MOV BX, 30,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),(四)數(shù)值回送操作符,它有TYPE、LENGTH、SIZE、OFFSET、SEG 5種。這些操作符把一些特征或存儲(chǔ)器地址的一部分作為數(shù)值回送。,* TYPE 格式為:TYPE Variable 或 label,如果是變量,則匯編程序?qū)⒒厮驮撟兞康囊宰止?jié)數(shù)表示的類型:DB為1,DW為2,DD為4,DQ為8,DT為10。如果是標(biāo)號(hào),則匯編程序?qū)⒒厮痛碓摌?biāo)號(hào)類型的數(shù)值:NEAR為-1,F(xiàn)AR為-2。,例:,ARRAY DW 1,2、3 ADD SI,TYPE ARRAY 匯編程序?qū)⑦@個(gè)指令形成為: ADD SI,2,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),* LENGTH 格式為: LENGTH Variable,對(duì)于變量中使用DUP的情況,匯編程序?qū)⒒厮头峙浣o該變量的單元數(shù)。而對(duì)于其他情況則回送1。,例 FEES DW 100 DUP(0) MOV CX,LENGTH FEES 匯編程序?qū)?duì)于指令形成為: MOV CX,100 例 ARRAY DW 1,2,3 MOV CX,LENGTH ARRAY 匯編程序?qū)?duì)于指令形成為: MOV CX,1 例 TABLE DB ABCD MOV CX,LENGTH TABLE 匯編程序?qū)?duì)于指令形成為; MOV CX,l,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),* SIZE 格式為: SIZE Variable,匯編程序應(yīng)回送分配給該變量的字節(jié)數(shù)。但是,此值是LENGTH值和TYPE值的乘積 。,對(duì)于上述例子的情況: MOV CX ,SIZE ARRAY 將形成為 MOV CX,2 MOV CX, SIZE TABLE 將形成為 MOV CX,1,*OFFSET 格式為:OFFSET Variable 或 label,匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的偏移地址值 。與LEA 具有相同功能。,MOV BX , OFFSET OPEN_ONE LEA BX,OPER_ONE,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),* SEG 格式為:SEG Variable 或 Label,匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的段地址值 .,例 如果DATA_SEG是從存儲(chǔ)器的05000H地址開(kāi)始的一個(gè)數(shù)據(jù)段的段名,OPERl 是該段中的一個(gè)變量名,則 MOV BX,SEG OPER1 將把0500H作為立即數(shù)插入指令。實(shí)際上由于段地址是由連接程序分配的,所以該立即數(shù)是連接時(shí)插入的。執(zhí)行期間則使BX寄存器的內(nèi)容成為0500H。,(五)屬性操作數(shù)符,有PTR、段操作符、SHORT、THIS、HIGH和LOW 6種。 格式為: type PTR expression,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),PTR用來(lái)建立一個(gè)符號(hào)地址,但它本身并不分配存儲(chǔ)器,只是用來(lái)給已分配的存儲(chǔ)地址賦予另一種屬性,使該地址具有另一種類型。 格式中的類型字段表示所賦予的新的類型屬性,而表達(dá)式字段則是被取代類型的符號(hào)地址。,例 已有數(shù)據(jù)定義如下:,可以用以下語(yǔ)句對(duì)這兩個(gè)字節(jié)賦予另一種類型定義:,后者也可以寫(xiě)成;,這里ONE_BYTE和TWO_BYTE兩個(gè)符號(hào)地址具有相同的段地址及偏移地址,但是它們的類型屬性不同,前者為1,后者為2。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),類型可有BYTE、WORD、DWORD、NEAR和PAR幾種,所以PTR也可以用來(lái)建立字、雙字或段內(nèi)及段間的指令單元。,例如 :MOV BX ,5,指令把立即數(shù)存入BX內(nèi)容指定的存儲(chǔ)單元中,但匯編程序不能分清是存入字單元還是字節(jié)單元,此時(shí)必須用PTR操作符來(lái)說(shuō)明屬性,應(yīng)該寫(xiě)明:,MOV BYTE PTR BX,5 或 MOV WORD PTR BXl,5,* 段操作符:用來(lái)表示一個(gè)標(biāo)量、變量或地址表達(dá)式的段屬性。例如,用段前綴指定某段的地操作數(shù),MOV AX,ES:BX+SI,格式 段寄存器:地址表達(dá)式,* SHORT:用來(lái)修飾JMP指令中轉(zhuǎn)向地址的屬性,指出轉(zhuǎn)向地址是在下一條指令地址的127個(gè)字節(jié)范圍之內(nèi)。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),* THIS: 格式為: THIS attribute 或 type,它可以象PTR一樣建立一個(gè)指定類型(BYTE、WORD或DWORD)的或指定距離(NEAR或FAR)的地址操作數(shù)。該操作數(shù)的段地址和偏移地址與下一個(gè)存儲(chǔ)單元地址相同。 例如:,此時(shí)FIRST_BYTE的偏移地址值和WORD_TABLE完全相同,但它是字節(jié)類型的,而WORD_TABLE則是字類型的。,又如: START EQU THIS FAR MOV CX,l00,MOV指令有一個(gè)FAR屬性的地址START,這就允許其它段的JMP指令直接跳轉(zhuǎn)到START來(lái)。,* HIGH和LOW,稱為字節(jié)分離操作符字節(jié)。它接收一個(gè)數(shù)或地址表達(dá)式,HIGH取其高位字節(jié),LOW取其低位字節(jié)。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),例如:,我們知道表達(dá)式是常數(shù)、寄存器、標(biāo)號(hào)、變量和操作符的組合,在計(jì)算表達(dá)式值時(shí),應(yīng)該首先計(jì)算優(yōu)先級(jí)高的操作符,然后從左到右地對(duì)優(yōu)先級(jí)相同的操作符進(jìn)行計(jì)算。括號(hào)也可以改變計(jì)算次序,括號(hào)內(nèi)的表達(dá)式應(yīng)優(yōu)先計(jì)算。,下面給出操作符的優(yōu)先級(jí)別(其中有些操作符我們并未提到過(guò),需要時(shí)可從手冊(cè)中查到),從高到低排列如下:,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),(六)注釋,注釋項(xiàng)用來(lái)說(shuō)明一段程序或一條或幾條指令的功能,它是可有可無(wú)的。但是,對(duì)于匯編語(yǔ)言程序來(lái)說(shuō),注釋項(xiàng)的作用是很明顯的,它可以使程序易于被讀懂,因此,編制程序必須寫(xiě)好注釋。,根據(jù)上面介紹的內(nèi)容,這里給出一個(gè)匯編完整的例子來(lái)說(shuō)明匯編語(yǔ)言的編程框架和結(jié)構(gòu)。,例:從鍵盤(pán)輸入字符并將輸入的字符顯示出來(lái),如果輸入是英文字符小寫(xiě)字母,將小寫(xiě)字母轉(zhuǎn)換成為大寫(xiě)字母。,data segment message dbThis is a sample program of keyboard and disply db0dh,0ah,Please strike the key!,0dh,0ah,$ data ends ;定義數(shù)據(jù)段,數(shù)據(jù)段給出提示內(nèi)容。在數(shù)據(jù)段中0dh和0ah分別表示回車和 ;換行字符。字符$表示字符串的結(jié)束標(biāo)志。如果沒(méi)有回車和換行會(huì)出現(xiàn)什 ;么顯示結(jié)果。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),stacksegment stack db50 dup(?) stackends ;定義堆棧段。其中 參數(shù)stack表示程序在運(yùn)行過(guò)程中,該段為系統(tǒng)堆棧段中 ;的一部分。如果不加這個(gè),將單獨(dú)對(duì)本程序建立堆棧。,codesegment assumecs:code,ds:data,ss:stack ;明確段寄存器與段定義之間的關(guān)系,start:movax,data movds,ax mov ax,stack;可以省,為什么? mov ss,ax ;可以省,為什么? ;初始化段寄存器,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),movdx,offset message movah,9 int21h ;顯示字符串。調(diào)用21H中斷(也是DOS功能調(diào)用)的9號(hào)功能,該功能是 ;顯示字符串,其中DS:DX為字符串地址,$為字符串結(jié)束標(biāo)志。,again:movah,1 int21h;調(diào)用21H中斷的1號(hào)功能,將鍵盤(pán)輸入的字符ASC碼存在al寄存器 cmpal,1bh;和ESC鍵輸入字符對(duì)比 jeexit;如果是按下ESC鍵,就跳轉(zhuǎn)結(jié)束 cmpal,61h;和a字符對(duì)比 jcnd;產(chǎn)生借位,就是小于a字符,跳轉(zhuǎn)到nd直接輸入結(jié)果 cmpal,7ah;和z字符對(duì)比 jand;沒(méi)有借位同時(shí)不為零,大于z字符,跳轉(zhuǎn)到nd直接輸入結(jié)果,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),andal,11011111b;如果輸入字符在a與z之間,通過(guò)與運(yùn)算,將小寫(xiě)轉(zhuǎn) ;換為大寫(xiě)。Sub al,aA也一樣 nd:movdl,al;將字符傳入到dl寄存器中 movah,2 int21h;調(diào)用21中斷的功能2,將dl寄存器的字符輸出 jmpagain;循環(huán)執(zhí)行,直到按下ESC鍵退出 exit:movah,4ch int21h;調(diào)用21中斷的4ch功能,返回dos codeends;代碼段結(jié)束 endstart;結(jié)束匯編,程序結(jié)束,如果將主程序建立為過(guò)程,由DOS調(diào)用該過(guò)程。進(jìn)入程序后,首先把DS的內(nèi)容和0作為段地址和偏移地址入棧,以便在程序結(jié)束時(shí)用RET指令返回DOS,這是一種較好的工作方式。如果在主程序開(kāi)始時(shí)沒(méi)有用上面三條指令在堆棧中建立返回信息,則在程序結(jié)束時(shí)效不能直接用RET返回指令,而應(yīng)該使用編號(hào)為4c的功能調(diào)用返回DOD。程序改為如下。,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),datasegment message dbThis is a sample program of keyboard and disply db0dh,0ah,Please strike the key!,0dh,0ah,$ dataends stacksegment stack db50 dup(?) stackends codesegment assumecs:code,ds:data,ss:stack main proc far start: push ds xor ax,ax,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),push ax movax,data movds,ax mov ax,stack mov ss,ax movdx,offset message movah,9 int21h again:movah,1 int21h cmpal,1bh jeexit cmpal,61h,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),jcnd cmpal,7ah jand ;andal,11011111b sub al,a-A nd:movdl,al movah,2 int21h jmpagain exit: ret main endp codeends endstart,第一章 基礎(chǔ)知識(shí),第五章 匯編語(yǔ)言程序結(jié)構(gòu),匯編語(yǔ)言程序上機(jī)過(guò)程,實(shí)驗(yàn)?zāi)康? 1、掌握常用工具軟件MASM和LINK的使用。 2、偽指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。 3、利用的 1號(hào)功能實(shí)現(xiàn)鍵盤(pán)輸入的方法。 4、用INT 21H 4C號(hào)功能返回系統(tǒng)的方法。 程序: 1、鍵盤(pán)輸入字符并輸出,大寫(xiě)轉(zhuǎn)換為小寫(xiě)輸出。 2、將字符串This is a program 用十六進(jìn)制顯示出來(lái) 3、將寄存器BX中的數(shù)據(jù)以ASC碼的形式顯示 實(shí)驗(yàn)步驟: 1、用用文字編輯工具(記事本或EDIT)將源程序輸入,其擴(kuò)展名為.ASM。 2、用MASM對(duì)源文件進(jìn)行匯編,產(chǎn)生.OBJ文件和.LST文件。若匯編時(shí)提示有錯(cuò),用文字編輯工具修改源程序后重新匯編,直至通過(guò)。 3、用TYPE命令顯示1產(chǎn)生的.LST文件。 4、用LINK將.OBJ文件連接成可執(zhí)行的.EXE文件。 5、在DOS狀態(tài)下運(yùn)行LINK產(chǎn)生的。EXE文件。 實(shí)驗(yàn)報(bào)告: 1、匯編,連接及調(diào)試時(shí)產(chǎn)生的錯(cuò)誤,其原因及解決辦法。 2、思考: 若在源程序中把INT 21H的H省去,會(huì)產(chǎn)生什么現(xiàn)象?,