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