匯編語言上機(jī)指導(dǎo)_第1頁
匯編語言上機(jī)指導(dǎo)_第2頁
匯編語言上機(jī)指導(dǎo)_第3頁
匯編語言上機(jī)指導(dǎo)_第4頁
匯編語言上機(jī)指導(dǎo)_第5頁
已閱讀5頁,還剩176頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編語言程序設(shè)計教學(xué)重點第3章學(xué)習(xí)了8086硬指令,第4章介紹MASM根本的偽指令〔偽操作〕。第4章重點掌握:程序的格式、開發(fā)方法參數(shù)的表達(dá)、變量的定義變量和標(biāo)號的屬性硬指令和偽指令硬指令——使CPU產(chǎn)生動作、并在程序執(zhí)行時才處理的語句,就是第3章學(xué)習(xí)的處理器指令。偽指令〔偽操作:Directive〕——不產(chǎn)生CPU動作、在程序執(zhí)行前由匯編程序處理的說明性語句,例如,處理器選擇、定義程序模式、定義數(shù)據(jù)、分配存儲區(qū)、指示程序結(jié)束等等。偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān)。第四章匯編語言程序格式4.1 匯編語言程序的開發(fā)4.2 參數(shù)、變量、標(biāo)號及相關(guān)偽操作4.3 程序段的定義的相關(guān)偽操作后一頁前一頁退出4.1匯編語言程序的開發(fā)4.1.1 匯編程序功能4.1.2 匯編語言程序的語句格式4.1.3 匯編語言程序的程序格式4.1.4 匯編語言程序的上機(jī)過程后一頁前一頁目錄退出4.1.1匯編程序功能匯編語言程序的建立及匯編過程匯編程序的主要功能常用的匯編程序后一頁前一頁目錄退出〔1〕匯編語言程序的建立及匯編過程匯編語言程序的建立及匯編過程,如圖4.1所示。在計算機(jī)上運行匯編語言程序的步驟是:用編輯程序建立ASM源文件;用MASM程序把ASM文件轉(zhuǎn)換成OBJ文件;用LINK程序把OBJ文件轉(zhuǎn)換成EXE文件;用DOS命令直接鍵入文件名就可執(zhí)行該程序。后一頁前一頁目錄退出〔2〕匯編程序的主要功能檢查源程序。測出源程序中的語法錯誤,并給出出錯信息。產(chǎn)生源程序的目標(biāo)程序,并可給出列表文件〔同時列出匯編語言和機(jī)器語言的文件,稱為LST文件〕。展開宏指令。后一頁前一頁目錄退出〔3〕常用的匯編程序Microsoft公司推出的宏匯編程序MASM〔MacroAssembler〕;Borland公司推出的TASM〔TurboAssembler〕。本課程采用MASM6.11后一頁前一頁退出目錄圖4.1匯編語言程序的建立及匯編過程編輯程序匯編程序連接程序MASMLINKPROGR.ASM文件PROGR.OBJ文件PROGR.EXE文件返回4.1.2匯編語言程序的語句格式匯編語言語句格式: [name] operation operand [;comment]執(zhí)行性語句——由硬指令構(gòu)成的語句,它通常對應(yīng)一條機(jī)器指令,出現(xiàn)在程序的代碼段中:

標(biāo)號:硬指令助記符 操作數(shù),操作數(shù) ;注釋說明性語句——由偽指令構(gòu)成的語句,它通常指示匯編程序如何匯編源程序:

名字偽指令助記符參數(shù),參數(shù),… ;注釋后一頁前一頁退出目錄1.名字〔name〕項源程序中用以下字符來表示名字項〔name〕:字母 A~Z數(shù)字 0~9專用字符 ?,·,@,-,$注意:名字不能以數(shù)字開頭。名字中如果用到·,那么必須是第一個字符。匯編程序只識別名字的前31個字符。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識符中的字母大小寫。后一頁前一頁退出目錄標(biāo)號、名字與標(biāo)識符name可以是標(biāo)號或變量。它們都用來表示本語句的符號地址,都是可有可無的,只有當(dāng)需要用到符號地址來訪問該語句時,它才需要出現(xiàn)。標(biāo)號:在代碼段中定義,是反映硬指令位置〔邏輯地址〕的標(biāo)識符,后跟一個冒號分隔。經(jīng)常在轉(zhuǎn)移指令或CALL指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向地址。后一頁前一頁退出目錄標(biāo)號、名字與標(biāo)識符名字:是反映偽指令位置〔邏輯地址〕和屬性的標(biāo)識符,后跟空格或制表符分隔,沒有冒號??捎肔ABEL或EQU偽操作來定義。還可以作為過程名定義〔第六章中介紹〕。標(biāo)識符〔Identifier〕:每個標(biāo)識符的定義是唯一的,還不能是匯編語言采用的保存字。后一頁前一頁退出目錄2.保存字保存字〔ReservedWord〕是匯編程序已經(jīng)利用的標(biāo)識符,主要有:硬指令助記符——例如:MOV、ADD偽指令助記符——例如:DB、EQU操作符——例如:OFFSET、PTR存放器名——例如:AX、CS預(yù)定義符號——例如:@data后一頁前一頁退出目錄3.指令助記符硬指令助記符可以是任何一條處理器指令,也可以是一條宏指令偽指令助記符將在本章和下章學(xué)習(xí)。前一章引入的定義字節(jié)數(shù)據(jù)和字符串的DB就是偽指令。后一頁前一頁退出目錄4.操作數(shù)與參數(shù)處理器指令的操作數(shù)可以是立即數(shù)、存放器和存儲單元。偽指令的參數(shù)可以是常數(shù)、變量名、表達(dá)式等,可以有多個,參數(shù)之間用逗號分隔。后一頁前一頁退出目錄5.注釋〔comment〕項注釋〔comment〕項:用來說明程序或語句的功能。;為注釋的開始。;可以從一行的第一個字符開始,此時整行都是注釋,常用來說明下面一段程序的功能。匯編程序在翻譯源程序時將跳過該局部,不對它們做任何處理。后一頁前一頁退出目錄形成良好的編程習(xí)慣,寫注釋是重要的一項!6.分隔符語句的4個組成局部要用分隔符分開。標(biāo)號后用冒號,注釋前用分號。操作數(shù)之間和參數(shù)之間使用逗號分隔。其他局部通常采用空格或制表符。多個空格和與一個制表符的作用相同。MASM支持續(xù)行符“\〞。后一頁前一頁退出目錄4.1.3匯編語言程序的程序格式完整的匯編語言源程序由段組成。一個匯編語言源程序可以包含假設(shè)干個代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列。需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點。所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi)。通常,程序還需要一個堆棧段。匯編語言源程序段定義格式有兩種:簡化段定義格式——從MASM5.0開始支持完整段定義格式——MASM5.0以前就具有后一頁前一頁退出目錄;PROGRAMTITLEGOESHERE-;Followedbydescriptivephrases;EQUSTATEMENTSGOHERE;****************************************************Datareasegment ;definedatasegment;DATAGOESHEREDatareaends;***************************************************Prognamsegment ;definecodesegment;匯編語言源程序舉例1后一頁前一頁退出目錄Main proc far ;mainpartofprogram assume cs:program,ds:datareaStart: ;startingexecutionaddress;setupstackforreturn

pushds ;saveolddatasegment subax,ax ;putzeroinax pushax ;saveitonstack;setDSregistertocurrentdatasegment movax,datarea ;datareasegmentaddr movds,ax ;intoDSregister;MAINPARTOFPROGRAMGOESHERE匯編語言源程序舉例1首先把DS的內(nèi)容和0作為段地址和偏移地址入棧,以便在程序結(jié)束時用RET指令返回DOS,這是一種工作方式。如果在主程序開始時沒有這三條指令在堆棧段建立返回信息,那么在程序結(jié)束時就不能直接用RET返回指令,而應(yīng)該用DOS功能調(diào)用4CH:MOVAX,4C00HINT21H這種方式更加普遍。后一頁前一頁退出目錄

ret ;returntoDOSMain endp ;endofmainpartofprogram;Sub1 proc near ;definesubprocedure;SUBROUTINEGOESHERESub1 endp ;endofsubprocedure;Prognamend ;endofcodesegment;****************************************************

endstart ;endofassembly匯編語言源程序舉例1后一頁前一頁退出目錄 .modelsmall ;definememorymodel .stack100h ;definestacksegment .data ;definedatasegment;DATAGOESHERE .code ;definecodesegmentMain proc farStart: movax,@data ;datasegmentaddr movds,ax ;intoDSregister匯編語言源程序舉例2后一頁前一頁退出目錄;MAINPARTOFPROGRAMGOESHERE

movax,4c00h int21h ;returntoDOSMain endp ;endofmainprogram

endstart ;endofassembly匯編語言源程序舉例2后一頁前一頁退出目錄4.1.4匯編語言程序的上機(jī)過程建立匯編語言的工作環(huán)境建立ASM文件;用MASM程序產(chǎn)生OBJ文件;用LINK程序產(chǎn)生EXE文件;程序的執(zhí)行。后一頁前一頁退出目錄1.建立匯編語言的工作環(huán)境為運行匯編語言程序至少要在磁盤上建立以下文件:編輯程序,如EDIT.EXE匯編程序,如MASM.EXE連接程序,如LINK.EXE調(diào)試程序,如DEBUG.COM必要時,還可建立如CREF.EXE,EXE2BIN.EXE等文件。后一頁前一頁退出目錄2.建立ASM文件用編輯程序EDIT在磁盤上建立如下的源程序EX_MOVS.ASM。例4.30把40個字母a的字符串從源緩沖區(qū)傳送到目的緩沖區(qū)。后一頁前一頁退出目錄;PROGRAMTITLESGOESHERE-ex_movs;***************************************************Data segment ;definedatasegment source_buffer db 40dup(‘a(chǎn)’)Data ends;***************************************************Extra segment ;defineextrasegment dest_buffer db 40dup(?)Extra ends;***************************************************Code segment ;definecodesegment;匯編語言源程序.ASM后一頁前一頁退出目錄Main proc far ;mainpartofprogram assumecs:code,ds:data,es:extraStart: ;startingexecutionaddress;setupstackforreturn

pushds ;saveolddatasegment subax,ax ;putzeroinax pushax ;saveitonstack匯編語言源

程序.ASM后一頁前一頁退出目錄;setDSregistertocurrentdatasegment movax,datarea ;datareasegmentaddr movds,ax ;intoDSregister;setESregistertocurrentextrasegment movax,extra ;extrasegmentaddr moves,ax ;intoESregister;MAINPARTOFPROGRAMGOESHERE匯編語言源

程序.ASM后一頁前一頁退出目錄 leasi,source_buffer ;putoffsetaddrofsource ;bufferinSI leadi,dest_buffer ;putoffsetaddrofdest ;bufferinDI cld ;setDFflagtoforward movcx,40 ;putcountinCX repmovsb ;moveentirestring ret ;returntoDOSMain endp ;endofcodesegment;Code ends ;endofcodesegment;*************************************************** end start ;endofassembly后一頁前一頁退出目錄3.用MASM程序產(chǎn)生OBJ文件用匯編程序?qū)υ闯绦蛭募R編,產(chǎn)生二進(jìn)制的目標(biāo)文件〔.OBJ文件〕,其操作與匯編程序答復(fù)如下:C>masmex_movsMicrosoft(R)MacroAssemblerVersion5.00Copyritht(C)MicrosoftCorp1981-1985,1987,Allrightsreserved.Objectfilename[ex_movs,obj]:Sourcelisting[NUL.LST]:ex_movsCross-reference[NUL.CRF]:ex_movs 51646+447778Bytessymbolspacefree 0WarningErrors 0SevereErrorsOBJ文件列表文件(.LST)段名表和符號表文件(.CRF文件)后一頁前一頁退出目錄例4.30的列表文件EX_MOVS.LST。這個文件同時列出了源程序和機(jī)器語言程序清單,并給出符號表,方便程序調(diào)試。這個文件可有可無,如果不需要,那么直接在[NUL.LST]:后敲回車;否那么,可答復(fù)文件名,這里是ex_movs。程序請看教材P148-151。后一頁前一頁退出目錄例4.30的交叉引用表EX_MOVS.REF文件。匯編程序提供的第三個文件是CRF文件,用來產(chǎn)生交叉引用表REF。交叉引用表給出了用戶定義的所有符號,對于每個符號列出了其定義所在行號〔加上#〕及引用的行號。CRF文件,為大程序的修改提供方便,而一般較小的程序那么可不使用,所以可直接在[NUL.REF]:后直接敲回車;如果希望建立交叉引用表,那么應(yīng)用文件名來答復(fù),這里是ex_movs,這樣就產(chǎn)生了EX_MOVS.CRF文件。為了建立交叉引用表,必須調(diào)用CREF程序,所以如果需要就應(yīng)該從系統(tǒng)中把CREF.EXE文件COPY到你的磁盤上。具體做法和程序,請看教材P151-152。后一頁前一頁退出目錄4.用LINK程序產(chǎn)生EXE文件OBJ文件不是可執(zhí)行文件,還需要用連接程序LINK把OBJ文件轉(zhuǎn)換為可執(zhí)行的EXE文件。如果一個程序是由多個模塊組成時,也要通過連接程序LINK把它們連接在一起,操作方法及機(jī)器答復(fù)如下:C>linkex_movsMicrosoft(R)MacroAssemblerVersion5.00Copyritht(C)MicrosoftCorp1981-1985,1987,Allrightsreserved.RunFile[EX_MOVS.EXE]:ListFile[NUL.MAP]:ex_movsLibraries[.LIB]:LINK: WarningL4021:nostacksegmentEXE文件列表文件(.MAP)庫文件LIB后一頁前一頁退出目錄LINK程序的文件LINK程序有兩個輸入文件OBJ和LIB。OBJ是需要連接的目標(biāo)文件;LIB是程序中要用到的庫文件,如無需要,那么直接敲回車。LINK程序有兩個輸出文件EXE和MAP。EXE是最后得到的可執(zhí)行文件;直接敲回車。MAP是連接程序的列表文件,又稱為連接映像〔linkmap〕,它給處每個段在存儲器中的分配情況。后一頁前一頁退出目錄例4.30的連接映像EX_MOVS.MAP文件LINK:warningL4021:nostacksegmentStart Stop Length Name class00000H 00027H 00028H DATA 00030H 00057H 00028H EXTRA00060H 0007CH 0001DH CODEProgramentrypointat0006:0000連接程序在給出的無堆棧段的警告性錯誤并不映像程序的運行。到此,連接過程已結(jié)束,可以執(zhí)行EX_MOVS程序了。后一頁前一頁退出目錄5.程序的執(zhí)行在建立了EXE文件后,就可以直接從DOS執(zhí)行程序,如下所示:C>ex_movsC>程序運行結(jié)束并返回DOS。如果用戶程序中,有在終端顯示結(jié)果的語句,那么程序運行結(jié)束,可在終端看到運行結(jié)果。EX_MOVS程序沒有顯示結(jié)果的語句,那么可通過調(diào)試程序DEBUG的D命令來檢查附加段是否已得到了從源緩沖區(qū)傳來的40個字母a。后一頁前一頁退出目錄4.2參數(shù)、變量、標(biāo)號及相關(guān)偽操作4.2.1 數(shù)值型參數(shù)4.2.2 數(shù)據(jù)定義及存儲器分配偽操作4.2.3地址計數(shù)器與對準(zhǔn)偽操作4.2.4 變量和標(biāo)號的屬性后一頁前一頁退出目錄本節(jié)重點本節(jié)詳細(xì)討論匯編語言程序語句的主要局部:參數(shù)變量名標(biāo)號并引出相關(guān)的偽指令和操作符。本節(jié)重點掌握:常數(shù)的表達(dá)變量定義偽指令DB/DW/DD地址操作符和類型操作符后一頁前一頁退出目錄4.2.1數(shù)值型參數(shù)在源程序語句格式的4個組成局部中,參數(shù)是指令的操作對象〔在學(xué)習(xí)硬指令時被稱為操作數(shù)〕,由一個或多個表達(dá)式組成,參數(shù)之間用逗號分隔。參數(shù)根據(jù)指令不同可以沒有,可以有1個、2個或多個。匯編語言程序中,參數(shù)可以是常數(shù)、存放器、標(biāo)號、變量或由表達(dá)式組成。指令參數(shù)有數(shù)值型,它的主要形式是常數(shù)和數(shù)值表達(dá)式。硬指令的操作數(shù)有立即數(shù);立即數(shù)就要用數(shù)值型參數(shù)表達(dá)。后一頁前一頁退出目錄1.常數(shù)常數(shù)〔常量〕表示一個固定的數(shù)值。它又分成多種形式:十進(jìn)制常數(shù)十六進(jìn)制常數(shù)二進(jìn)制常數(shù)八進(jìn)制常數(shù)字符串常數(shù)符號常數(shù)表達(dá)式賦值偽操作EQU基數(shù)控制偽操作后一頁前一頁退出目錄十進(jìn)制常數(shù)由0~9數(shù)字組成,以字母D或d結(jié)尾。缺省情況下,后綴D或d可以省略。匯編語言大小寫不敏感,D和d通用。例如:100、255D后一頁前一頁退出目錄十六進(jìn)制常數(shù)由0~9、A~F組成,以字母H或h結(jié)尾。以字母A~F開頭的十六進(jìn)制數(shù),前面要用0表達(dá),以防止與其他符號混淆。匯編語言大小寫不敏感,H和h通用例如:64H、0FFh、0B800H后一頁前一頁退出目錄二進(jìn)制常數(shù)由0或1兩個數(shù)字組成,以字母B或b結(jié)尾。匯編語言大小寫不敏感,B和b通用。例如:01101100B后一頁前一頁退出目錄八進(jìn)制常數(shù)由0~7數(shù)字組成,以字母Q或q結(jié)尾。匯編語言大小寫不敏感,Q和q通用。例如:144Q各種進(jìn)制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù)。后一頁前一頁退出目錄

基數(shù)控制偽操作MASM提供基數(shù)控制.RADIX偽指令可以改變默認(rèn)進(jìn)制,其格式是: .RADIXn其中,n用來表示基數(shù)值〔用十進(jìn)制數(shù)表示〕。例如: MOV BX,0FFH .RADIX 16 與 MOV BX,178 MOV BX,0FFH MOV BX,178D是等價的。

.RADIX16把基數(shù)定位十六進(jìn)制后,十進(jìn)制數(shù)后面都應(yīng)跟字母D。如果某個十六進(jìn)制數(shù)的末字符為D,那么應(yīng)在其后跟字母H,以免與十進(jìn)制數(shù)發(fā)生混淆。后一頁前一頁退出目錄字符串常數(shù)用單引號或雙引號括起來的單個字符或多個字符,其數(shù)值是每個字符對應(yīng)的ASCII碼的值。例如: 'd'=64H 'AB'=4142H 'Hello,Everybody!'后一頁前一頁退出目錄符號常數(shù)利用一個標(biāo)識符表達(dá)的一個數(shù)值。MASM提供等價機(jī)制,用于常量定義。符號定義偽指令:等價EQU偽指令等號=偽指令常數(shù)假設(shè)使用有意義的符號名來表示,可以提高程序的可讀性,同時更具有通用性。后一頁前一頁退出目錄表達(dá)式賦值偽操作EQU符號定義偽指令:用于常量定義,利用一個標(biāo)識符表達(dá)的一個數(shù)值。等價EQU偽指令:Expression_nameEQUExpression符號名EQU數(shù)值表達(dá)式符號名EQU<字符串>其中符號名不允許重復(fù)定義。等號=偽指令符號名=數(shù)值表達(dá)式符號名允許重復(fù)定義。常數(shù)假設(shè)使用有意義的符號名來表示,可以提高程序的可讀性,同時更具有通用性。二者區(qū)別后一頁前一頁退出目錄例:CONSTANT EQU 256 ;數(shù)賦以符號名DATA EQU HEIGHT+12 ;地址表達(dá)式賦以符號名ALPHA EQU 7 BETA EQU ALPHA-2 ADDR EQU VAR+BETA

B EQU [BETA] ;變址引用賦以符號名BP8 EQU DS:[BP+8]

;加段前綴的變址引用賦以符號名P8這是一組賦值偽操作,把7-2=5賦以符號名BETA,VAR+5賦以符號名ADDR。必須注意:在EQU語句的表達(dá)式中,如果有變量或標(biāo)號的表達(dá)式,那么在該語句前應(yīng)該先給出它們的定義。例如:ABEQUDATA_ONE+2那么必須放在DATA_ONE的定義之后才行,否那么匯編程序?qū)⒊鲥e。EQU偽指令后一頁前一頁退出目錄例:;******************************************EMP EQU7 ;EMP的值為7…EMPEQUEMP+1 ;錯誤;這種情況不允許;******************************************…EMP=7 ;EMP的值為7…EMP=EMP+1 ;EMP的值為8;這種情況是允許的EQU與=偽指令后一頁前一頁退出目錄2.數(shù)值型表達(dá)式數(shù)值表達(dá)式一般是指由運算符連接的各種常數(shù)所構(gòu)成的表達(dá)式。匯編程序在匯編過程中計算表達(dá)式,最終得到一個數(shù)值。程序運行之前,就已經(jīng)計算出了表達(dá)式;所以,程序運行速度沒有變慢,但增強(qiáng)程序的可讀性。MASM對除偽指令外各種匯編時處理的指令統(tǒng)稱為操作符〔Operator〕。后一頁前一頁退出目錄運算符后一頁前一頁退出目錄例4.18例4.19后一頁前一頁退出目錄例4.18 MOV DX,BLOCK+〔6-1〕*2該指令實現(xiàn):把首地址為BLOCK的字?jǐn)?shù)組的第6個字傳送到DX存放器。后一頁前一頁退出目錄例4.19 ARRARY DW 1,2,3,4,5,6,7 ARYEND DW ? … … MOV CX,〔ARYEND-ARRAY〕/2 ;相當(dāng)于MOVCX,7以上指令實現(xiàn):將ARRAY數(shù)組長度存入CX存放器。其中,ARYEND是為計算數(shù)組長度而建立的符號地址。后一頁前一頁退出目錄邏輯運算符實現(xiàn)按位相與、相或、異或、求反的邏輯運算。

oral,03hAND45h ;等價于oral,01h例4.20、4.21后一頁前一頁退出目錄例4.20 IN AL,PORT_VAL OUT PORT_VAL AND0FEH,AL當(dāng)PORT_VAL為偶數(shù)時,輸出端口號與輸入端口號相同;當(dāng)PORT_VAL為奇數(shù)時,輸出端口號比輸入端口號小1。例4.21 AND DX,PORT_VALAND0FEH匯編時對表達(dá)式進(jìn)行計算得到一個端口號;程序運行時,將DX的內(nèi)容與端口號相“與〞,結(jié)果保存到DX中。邏輯運算符舉例后一頁前一頁退出目錄移位運算符實現(xiàn)對數(shù)值的左移、右移的邏輯操作;移入低位或高位的是0。格式為:數(shù)值表達(dá)式SHL/SHR移位次數(shù)假設(shè)移位次數(shù)大于15,那么結(jié)果為0。例如:moval,0101bSHL(2*2) ;等價于moval,01010000b后一頁前一頁退出目錄關(guān)系運算符用于比較和測試符號數(shù)值。關(guān)系運算符的兩個操作數(shù)必須是數(shù)字,或是同一段內(nèi)的兩個存儲器地址。MASM用0FFFFH〔補(bǔ)碼-1〕表示條件為真。MASM用0000H表示條件為假。例4.22:movbx,((PORTLT5)AND20)OR((PORTGE5)AND30) ;當(dāng)PORT<5時,匯編結(jié)果為movbx,20 ;否那么,匯編結(jié)果為movbx,30后一頁前一頁退出目錄上下別離符取數(shù)值的高半局部或低半局部。HIGH、LOW字節(jié)別離符:從一個字?jǐn)?shù)值或符號常量中得到高、低字節(jié)。HIGHWORD、LOWWORD字別離符:從MASM6.0引入的,取一個符號常量〔不能是其他常數(shù)〕的高字或低字局部。

后一頁前一頁退出目錄例: movah,HIGH8765h

;等價于movah,87h CONSTEQU0ABCDH ;定義一個符號常量 MOVAH,HIGHCONST ;等價與MOVAH,0ABH dd_valueequ0ffff1234h ;定義一個符號常量movax,LOWWORDdd_value ;等價于movax,1234h上下別離符舉例后一頁前一頁退出目錄3.運算符的優(yōu)先級1 ()<>[]·LENGTHSIZEWIDTHMASK2 PTROFFSETSEGTPYETHIS:3 HIGELOW4 */MODSHLSHR5 +-6 EQNEGTLTGELE7 NOT8 AND9 ORXOR10 SHORT建議采用圓括號“〔〕〞顯式表達(dá),它可以極大地提高程序的可閱讀性。后一頁前一頁退出目錄4.地址型參數(shù)匯編語言程序中,指令參數(shù)還有地址型,它的主要形式是標(biāo)號和名字〔變量名、段名、過程名等〕。硬指令的操作數(shù)有存儲單元;存儲單元就應(yīng)該用地址型參數(shù)〔存儲器操作數(shù)〕表達(dá)。后一頁前一頁退出目錄4.2.2數(shù)據(jù)定義及存儲器分配偽操作該類偽操作又稱變量定義偽指令。變量定義〔Define〕偽指令為變量申請固定長度的存儲空間,并可同時將相應(yīng)的存儲單元初始化。 變量名偽指令助記符初值表格式:[Variable]MnemonicOperand,…,Operand[;Commnet]后一頁前一頁退出目錄變量名〔variable〕變量名為用戶自定義標(biāo)識符,表示初值表首元素的邏輯地址;用這個符號表示地址,常稱為符號地址。變量名可以沒有。這種情況,匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g,無符號地址。設(shè)置變量名是為了方便存取它指示的存儲單元。后一頁前一頁退出目錄初值表初值表是用逗號分隔的參數(shù)。主要由數(shù)值常數(shù)、表達(dá)式或?、DUP組成?——表示初值不確定,即未賦初值;DUP——表示重復(fù)初值。DUP的格式為: 重復(fù)次數(shù)DUP(重復(fù)參數(shù))Repeat_countDUP〔operand,…,opreand〕其中repeat_count可以是一個表達(dá)式,它的值應(yīng)該是一個正整數(shù),用來指定括號中的操作數(shù)的重復(fù)次數(shù)。后一頁前一頁退出目錄變量定義偽指令助記符〔Mnemonic〕變量定義偽指令根據(jù)申請的主存空間單位分類,說明所定義的數(shù)據(jù)類型。DB——定義字節(jié)偽指令DW——定義字偽指令DD——定義雙字偽指令DF——定義3字偽指令DQ——定義4字偽指令DT——定義10字節(jié)偽指令這些偽操作可以把其后跟著的數(shù)據(jù)存入指定的存儲單元,形成初始化數(shù)據(jù);或者只分配存儲空間而并不存入確定的數(shù)值,形成未初始化數(shù)據(jù)。可存儲由16位段地址及32位偏移地址組成的遠(yuǎn)地址指針??纱鎯Φ刂沸纬蓧嚎sBCD碼后一頁前一頁退出目錄1.定義字節(jié)單元偽指令DBDB偽指令用于分配一個或多個字節(jié)單元,并可以將它們初始化為指定值。初值表中每個數(shù)據(jù)一定是字節(jié)量〔Byte〕,存放一個8位數(shù)據(jù):可以是0~255的無符號數(shù)或是-128~+127帶符號數(shù)也可以是字符串常數(shù)后一頁前一頁退出目錄2.定義字單元偽指令DWDW偽指令用于分配一個或多個字單元,并可以將它們初始化為指定值。初值表中每個數(shù)據(jù)一定是字量〔Word〕,一個字單元可用于存放任何16位數(shù)據(jù):一個段地址一個偏移地址兩個字符0~65535之間的無符號數(shù)-32768~+32767之間的帶符號數(shù)后一頁前一頁退出目錄3.定義雙字單元偽指令DDDD偽指令用于分配一個或多個雙字單元,并可以將它們初始化為指定值。初值表中每個數(shù)據(jù)是一個32位的雙字量〔DoubleWord〕:可以是有符號或無符號的32位整數(shù)也可以用來表達(dá)16位段地址〔高位字〕和16位的偏移地址〔低位字〕的遠(yuǎn)指針vardd DD 0,?,12345678hfarpoint DD 00400078h后一頁前一頁退出目錄4.其他數(shù)據(jù)單元定義偽指令定義3字偽指令DF——用于為一個或多個6字節(jié)變量分配空間及初始化。6字節(jié)常用在32位CPU中表示一個48位遠(yuǎn)指針〔16位段選擇器:32位偏移地址〕定義4字偽指令DQ——用于為一個或多個8字節(jié)變量分配空間及初始化。8字節(jié)變量可以表達(dá)一個64位整數(shù)定義10字節(jié)偽指令DT——用于為一個或多個10字節(jié)變量分配空間及初始化。10字節(jié)變量可以表達(dá)擴(kuò)展精度浮點數(shù)后一頁前一頁退出目錄例4.7DATA_BYTEDB10,4,10HDATA_WORDDW100,100H,-5DATA_DWDD3*20,0FFFDH匯編程序可以在匯編期間在存儲器中存入數(shù)據(jù),如圖4.2所示。操作數(shù)是常數(shù)、表達(dá)式后一頁前一頁退出目錄例4.8MESSAGE DB‘HELLO’ DB‘AB’ DW‘AB’那么存儲器存儲情況如圖4.5所示。操作數(shù)是字符串后一頁前一頁退出目錄例4.9操作數(shù)?可以保存存儲空間,但不存入數(shù)據(jù)。如:ABCDB0,?,?,?,0DEFDW?,52,?經(jīng)匯編后的存儲情況如圖4.4所示。操作數(shù)是?后一頁前一頁退出目錄例4.10ARRAY1 DB2DUP(0,1,2,?)ARRAY2 DB100DUP(?)匯編后的存儲情況如圖4.5所示。重復(fù)定義DUP后一頁前一頁退出目錄例4.11DUP操作可以嵌套,例如:ARRAY3db100dup(0,2dup(1,2),0,3)那么匯編后的結(jié)果如圖4.6所示。DUP嵌套后一頁前一頁退出目錄例4.12PARAMETER_TABLE DW PAR1 DW PAR2 DW PAR3INTERSEG_DATA DD DATA1 DD DATA2那么匯編程序的存儲情況如圖4.7所示。表達(dá)式為符號地址386及其后繼機(jī)型具有16位段地址及32位偏移地址組成的48位遠(yuǎn)地址,可用DF偽指令來定義。后一頁前一頁退出目錄例4.13

.386Datasegsegmentparause32‘data’Parse_tabledb2048dup(0)TblptrdfParse_tableDatasegends匯編后的存儲情況如圖4.8所示。DF偽指令后一頁前一頁退出目錄5.變量定義偽指令使用說明操作數(shù)中的變量或標(biāo)號可以是表達(dá)式,匯編后,存儲器中應(yīng)該存入表達(dá)式的值。DB、DW、DD、DF、DQ、DT等偽操作在MASM6中可用BYTE、WORD、DWORD、FWORD、QWORD、TBYTE來取代,其含義是等同的。后一頁前一頁退出目錄4.2.3地址計數(shù)器與對準(zhǔn)偽操作地址計數(shù)器$ORG偽操作EVEN偽操作ALIGN偽操作后一頁前一頁退出目錄1.地址計數(shù)器$地址計數(shù)器〔locationcounter〕用來保存當(dāng)前正在匯編的指令的偏移地址。當(dāng)開始匯編或在每一段開始時,把地址計數(shù)器初始化為零。匯編過程中,每處理一條指令,地址計數(shù)器就增加一個值,此值為該指令所需要的字節(jié)數(shù)。地址計數(shù)器的值可用符號“$〞表示。匯編語言允許用戶直接用$來引用地址計數(shù)器的值。后一頁前一頁退出目錄例如:指令 JNS$+6的轉(zhuǎn)向地址為JNS指令的首地址加上6。當(dāng)$用在指令中時,它表示本條指令的第一個字節(jié)的地址。這里,$+6必須是另一條指令的首地址。否那么,匯編程序?qū)⒅甘境鲥e信息。當(dāng)$用在偽操作的參數(shù)字段時,那么表示地址計數(shù)器的當(dāng)前值。例4.17 ARRAYDW1,2,$+4,3,4,$+4這里,$表示當(dāng)前偏移地址。匯編后的存儲區(qū)如圖4.9所示。地址計數(shù)器$后一頁前一頁退出目錄圖4.9地址計數(shù)器$在指令中用到$時,它只代表該指令的首地址,而與$本身所在的字節(jié)無關(guān)。后一頁前一頁退出目錄2.ORG偽操作定位偽指令控制數(shù)據(jù)的偏移地址。ORG參數(shù) 或 ORGconstantexpressionORG偽指令是將當(dāng)前偏移地址指針指向參數(shù)表達(dá)的偏移地址。 ORG100h ;從100h處安排數(shù)據(jù)或程序 ORG$+10 ;使偏移地址加10,即跳過10個字節(jié)空間如常數(shù)表達(dá)式的值為n,那么ORG偽操作可以使下一個字節(jié)的地址成為常數(shù)表達(dá)式的值n。常數(shù)表達(dá)式也可以表示從當(dāng)前已定義過的符號開始的位移量,或表示從當(dāng)前地址計數(shù)器值$開始的位移量。

舉例1舉例2后一頁前一頁退出目錄例如: VECTORS SEGMENT

ORG 10 ;VECT1的偏移地址為0AH VECT1 DW 47A5H ;VECT2的偏移地址為14H ORG 20 VECT2 DW 0C596H … VECTORS ENDSORG偽操作舉例1后一頁前一頁退出目錄例如: ORG$+8可以表示跳過了8個字節(jié)的存儲區(qū),亦即建立一個8字節(jié)的未初始化的數(shù)據(jù)緩沖區(qū)。如程序中需要訪問該存儲區(qū),那么可用label偽操作來定義該緩沖區(qū)的如下變量名:BUFFER LABEL BYTE ORG $+8或BUFFER DB 8DUP〔?〕ORG偽操作舉例2后一頁前一頁退出目錄3.EVEN偽操作EVEN ;從偶地址開始EVEN偽指令使下一個變量或指令開始于偶數(shù)字節(jié)地址。EVEN偽操作可以保證字?jǐn)?shù)組從偶數(shù)地址開始。例如:DATA_SEG SEGMENT … EVEN WORD_ARRAY DW 100DUP〔?〕 … DATA_SEG ENDS一個字的地址最好從偶地址開始。后一頁前一頁退出目錄4.ALIGN偽操作ALIGNn ;從n的整數(shù)倍地址開始ALIGN偽操作是將當(dāng)前偏移地址指針指向n〔n是2的乘方〕的整數(shù)倍的地址。如果原地址指針已指向n的整數(shù)倍地址,那么不做調(diào)整;否那么將指針加以1~n-1中的一個數(shù),使地址指針指向下一個n的整數(shù)倍地址。ALIGN2與EVEN等價。后一頁前一頁退出目錄舉例Datasegment data01db1,2,3 ;data01的偏移地址為0000h even ;等價于align2 data02dw5 ;data02的偏移地址為0004h

align4

data03dd6 ;data03的偏移地址為0008h org$+10h data04db‘a(chǎn)bc’ ;data04的偏移地址為001chDataendsalign偽操作舉例后一頁前一頁退出目錄4.2.4變量和標(biāo)號的屬性標(biāo)號和名字一經(jīng)定義便具有以下兩類三種屬性:①段值標(biāo)號和名字對應(yīng)存儲單元的段地址。②偏移值標(biāo)號和名字對應(yīng)存儲單元的偏移地址。③類型標(biāo)號、子程序名的類型可以是NEAR〔近〕和FAR〔遠(yuǎn)〕,分別表示段內(nèi)或段間。變量名的類型可以是BYTE〔字節(jié)〕、WORD〔字〕和DWORD〔雙字〕等。地址屬性類型屬性后一頁前一頁退出目錄變量的類型屬性變量的類型屬性〔typeattribute〕:用來表示該語句中的每一個數(shù)據(jù)項的長度〔以字節(jié)為單位表示〕。因此,DB/DW/DD/DF/DQ/DT偽操作的類型屬性分別為1、2、4、6、8、10。變量表達(dá)式的屬性和變量是相同的。匯編程序可以用這種隱含的類型屬性來確定某些指令是字指令還是字節(jié)指令。后一頁前一頁退出目錄例4.14OPER1 DB ?,?OPER2 DW ?,? … MOVOPER1,0 ;字節(jié)指令 MOVOPER2,0 ;字指令變量的類型屬性后一頁前一頁退出目錄例4.15OPER1 DB 1,2OPER2 DW 1234H,5678H …

MOV AX,OPER1+1

;類型不匹配

MOV AL,OPER2

;類型不匹配;OPER1+1為字節(jié)類型屬性,OPER2為字類型屬性;可以用PTR、LABLE偽指令來指定操作數(shù)的類型。操作數(shù)類型屬性后一頁前一頁退出目錄1.地址操作符取得名字或標(biāo)號的段地址和偏移地址兩個屬性。[] 將括起的表達(dá)式作為存儲器地址$ 當(dāng)前偏移地址: 采用指定的段地址存放器OFFSET 名字/標(biāo)號 ;返回名字或標(biāo)號的偏移地址SEG 名字/標(biāo)號 ;返回名字或標(biāo)號的段地址舉例后一頁前一頁退出目錄

org$+10 array db45,45h .code

movax,segarray movds,ax movbx,offsetarray ;等價于leabx,array

movcl,array+4 ;等效于movcl,array[4]

movax,es:[2000h]地址操作符

加4個字節(jié)單元后一頁前一頁退出目錄例4.27

MOV BX,OFFSETOPER_ONE ;與LEABX,OPER_ONE等價例4.28 如果DATA_SEG是從存儲器05000H地址開始的一個數(shù)據(jù)段的段名,OPER1是該段中的一個變量名。

MOV BX,SEGOPER1 ;匯編結(jié)果:MOV BX,0500H ;將OPER1所在段的起始偏移地址送入BX。地址操作符后一頁前一頁退出目錄2.類型操作符類型操作符對名字或標(biāo)號的類型屬性進(jìn)行有關(guān)設(shè)置。類型名PTR名字/標(biāo)號THIS類型名SHORT標(biāo)號TYPE名字/標(biāo)號SIZEOF變量名LENGTHOF變量名后一頁前一頁退出目錄〔1〕類型名 PTR名字/標(biāo)號PTR操作符使名字或標(biāo)號具有指定的類型。類型名可以是BYTE/WORD/DWORD/FWORD/QWORD/TBYTE或者是NEAR/FAR,還可以是由STRUCT、RECORD、UNION以及TYPEDEF定義的類型。

moval,byteptrw_var ;w_var是一個字變量 jmpfarptrn_label ;n_label是一個標(biāo)號使用PTR操作符,可以臨時改變名字或標(biāo)號的類型。后一頁前一頁退出目錄例4.29

TWO_BYTE DW ? … ONE_TYPE EQU BYTEPTRTWO_BYTE;ONE_TYPE與TWO_TYPE具有相同的段、偏移地址;但ONE_TYPE為BYTE類型,類型屬性為1;TWO_TYPE為WORD類型,類型屬性為2 OTHER_TYPE EQU BYTEPTR(TWO_BYTE+1);也可寫成:;OTHER_TYPE EQU ONE_BYTE+1例:MOV BYTE PTR[BX],5 MOV WORDPTR[BX],5PTR操作符舉例后一頁前一頁退出目錄〔2〕THIS類型名利用THIS說明的操作數(shù)具有匯編時的當(dāng)前邏輯地址,但具有指定的類型。

LABEL偽指令的功能等同于“EQUTHIS〞。后一頁前一頁退出目錄例: b_varequTHISbyte ;按字節(jié)訪問變量b_var,但與w_var的地址相同 w_vardw10dup(0) ;按字訪問變量w_var f_jumpequTHISfar ;用f_jump為段間轉(zhuǎn)移〔f_jumplabelfar〕 n_jump:movax,w_var ;用n_jump為段內(nèi)近轉(zhuǎn)移,但兩者指向同一條指令THIS操作符舉例后一頁前一頁退出目錄例:FIRST_TYPE EQU THISBYTEWORD_TABLE DW 100DUP(?);FIRST_TYPE與WORD_TABLE地址相同,但前者為字節(jié)類型,后者為字類型。START EQU THISFAR MOV CX,100;MOV指令具有了一個FAR屬性的地址START,這就允許其他段的JMP指令直接跳轉(zhuǎn)到START來。THIS操作符舉例后一頁前一頁退出目錄〔3〕SHORT標(biāo)號用來修飾JMP指令中轉(zhuǎn)向地址的屬性。指定標(biāo)號作為-128~+127字節(jié)范圍內(nèi)的短轉(zhuǎn)移。 jmpshortn_jump當(dāng)然,如果標(biāo)號實際上超出了這個范圍,那么出錯。對高版本MASM已無意義后一頁前一頁退出目錄〔4〕TYPE名字/標(biāo)號返回說明名字或標(biāo)號類型的一個字量數(shù)值:對變量,那么返回該變量的以字節(jié)數(shù)表示的類型。DB/DW/DD/DF/DQ/DT偽操作的類型屬性分別為1、2、4、6、8、10。對短、近和遠(yuǎn)轉(zhuǎn)移依次返回ff01h、ff02h和ff05h。對常數(shù),返回0。 后一頁前一頁退出目錄例: movax,TYPEw_var ;匯編結(jié)果為movax,2 movax,TYPEn_jump ;匯編結(jié)果為movax,0ff02h〔near標(biāo)號〕例4.23 ARRAY DW 1,2,3 … ADD SI,TYPEARRAY ;匯編結(jié)果為ADD SI,2TYPE操作符舉例后一頁前一頁退出目錄〔5〕LENGTH/LENGTHOF變量LENGTH對于變量中使用DUP的情況,將返回分配給該變量的單元數(shù),對于其他情況那么送1。SIZE返回LENGTH與TYPE的乘積。LENGTHOF返回整個變量的數(shù)據(jù)項數(shù)〔即元素數(shù)〕。操作符SIZEOF返回整個變量占用的字節(jié)數(shù)。 SIZEOF=LENGTHOF×TYPE

后一頁前一頁退出目錄例4.24

FEES DW 100DUP(0) … MOV CX,LENGTHFEES ;匯編結(jié)果:MOVCX,100

MOV DX,LENGTHOF FEES ;匯編結(jié)果:MOVDX,100

MOV CX,SIZEFEES

;匯編結(jié)果:MOVCX,200

MOVDX,SIZEOFFEES ;匯編結(jié)果:MOVDX,200LENGTH/SIZE后一頁前一頁退出目錄例4.25

ARRAY DW 1,2,3 … MOV CX,LENGTHARRAY ;匯編結(jié)果:MOVCX,1

MOV DX,LENGTHOF ARRAY ;匯編結(jié)果:MOVDX,3

MOV CX,SIZEARRAY

;匯編結(jié)果:MOVCX,2

MOVDX,SIZEOFARRAY ;匯編結(jié)果:MOVDX,6LENGTH/SIZE后一頁前一頁退出目錄例4.26

TABLE DB ‘ABCD’ … MOV CX,LENGTHTABLE ;匯編結(jié)果:MOVCX,1

MOV DX,LENGTHOF TABLE ;匯編結(jié)果:MOVDX,4

MOV CX,SIZETABLE

;匯編結(jié)果:MOVCX,1

MOVDX,SIZEOFTABLE ;匯編結(jié)果:MOVDX,4LENGTH/SIZE后一頁前一頁退出目錄4.3程序段的定義的相關(guān)偽操作4.3.1 DOS的程序結(jié)構(gòu)4.3.2 處理器選擇偽操作4.3.3 段定義偽操作4.3.4 程序開始和結(jié)束偽操作后一頁前一頁退出目錄4.3.1DOS的程序結(jié)構(gòu)EXE程序COM程序后一頁前一頁退出目錄1.EXE程序利用程序開發(fā)工具,通常將生成EXE結(jié)構(gòu)的可執(zhí)行程序〔擴(kuò)展名為.EXE的文件〕。它可以有獨立的代碼、數(shù)據(jù)和堆棧段,還可以有多個代碼段或多個數(shù)據(jù)段,程序長度可以超過64KB,執(zhí)行起始處可以任意指定。當(dāng)DOS裝入或執(zhí)行一個程序時,DOS確定當(dāng)時主存最低的可用地址作為該程序的裝入起始點。此點以下的區(qū)域稱為程序段。在程序段內(nèi)偏移0處,DOS為該程序建立一個程序段前綴控制塊PSP〔ProgramSegmentPrefix〕,它占256〔=100h〕個字節(jié);而在偏移100h處才裝入程序本身。后一頁前一頁退出目錄Exe程序的內(nèi)存映像圖后一頁前一頁退出目錄2.COM程序COM程序是一種將代碼、數(shù)據(jù)和堆棧段合一的結(jié)構(gòu)緊湊的程序,所有代碼、數(shù)據(jù)都在一個邏輯段內(nèi),不超過64KB,因而只能用來編制較小的程序。在程序開發(fā)時,需要滿足一定要求并采用相應(yīng)參數(shù)才能正確生成COM結(jié)構(gòu)的程序。COM文件存儲在磁盤上是主存的完全影象,不包含重新定位的加載信息,與EXE文件相比其加載速度更快,占用的磁盤空間也少。盡管DOS也為COM程序建立程序段前綴PSP,但由于兩種文件結(jié)構(gòu)不同,所以加載到主存后各段設(shè)置并不完全一樣。后一頁前一頁退出目錄COM程序COM文件也是一種可執(zhí)行文件,由程序本身的二進(jìn)制代碼組成,它沒有EXE文件所具有的包括有關(guān)文件信息的標(biāo)題區(qū)〔header〕,所以它占有的存儲空間比EXE文件要小。由于其小而簡單,裝入速度比EXE文件要快。COM文件不分段,其入口點必須是100H〔其前的256個字節(jié)為程序段前綴所在地〕,且不必設(shè)置堆棧段。在程序裝入時,由系統(tǒng)自動把SP建立在該段之末。對于所有的過程那么應(yīng)定義為NEAR。下面給出COM文件的源程序格式。后一頁前一頁退出目錄com程序的內(nèi)存映像圖后一頁前一頁退出目錄;PROGRAMTITLEGOESHERE-;Followedbydescriptivephrases;EQUstatementsgohere;****************************************************Prognam segment org 100h assumecs:prognam,ds:prognam,es:prognam,ss:prognam;Main proc near;PROGRAMGOESHERE movax,4c00h ;returntoDOS int21h;(orint20h)COM文件的源程序舉例1后一頁前一頁退出目錄;;DATAgoesherePronam ends;*************************************************** end mainCOM文件的源程序舉例1后一頁前一頁退出目錄;PROGRAMTITLEGOESHERE- .modeltiny .code org100hStart: jmpbeginMain proc near;DATAGOESHEREbegin:;PROGRAMGOESHERE movax,4c00h int21h end startCOM文件的源程序舉例2后一頁前一頁退出目錄COM文件的生成用戶在建立源程序后,同樣經(jīng)過匯編、連接形成EXE文件,然后可以通過EXE2BIN程序來建立COM文件,操作方法如下: C>exe2binfilenamefilename第一個filename給出已形成的EXE文件的文件名,但不必給出擴(kuò)展名。第二個filename即為所要求的COM文件的文件名,必須帶有擴(kuò)展名,這樣就形成了COM文件。在DOS系統(tǒng)下,可直接在機(jī)器上用文件名執(zhí)行。如果第二個filename后沒有帶擴(kuò)展名,那么生成BIN文件。在DOS系統(tǒng)運行時,必須先用rename命令將它改名為COM文件才能直接運行。COM文件還可以直接在調(diào)試程序DEBUG中用A或E命令建立,對于一些短小的程序,這也是一種相當(dāng)方便的方法。后一頁前一頁退出目錄4.3.2處理器選擇偽操作由于80x86的所有處理器都支持8086/8088指令系統(tǒng),但每一種高檔機(jī)型又都增加了一些新的指令,因此在編寫程序時都要對所用處理器有一個確定的選擇。本組偽操作的就是告訴匯編程序應(yīng)該選擇哪一種指令系統(tǒng)。本組偽操作的位置:一般放在整個程序的最前面,如不給出處理器選擇,那么默認(rèn)為.8086。也可放在程序中,如程序中用了一條80486所增加的指令,那么可在該指令的上一行加上.486。后一頁前一頁退出目錄處理器選擇偽操作主要有以下幾種:.8086 選擇8086指令系統(tǒng).286 選擇80286指令系統(tǒng).286P 選擇保護(hù)方式下的80286指令系統(tǒng).386 選擇80386指令系統(tǒng).386P 選擇保護(hù)方式下的80386指令系統(tǒng).486 選擇80486指令系統(tǒng).486P 選擇保護(hù)方式下的80486指令系統(tǒng) .586 選擇Pentium指令系統(tǒng).586P 選擇保護(hù)方式下的Pentium指令系統(tǒng) 指包括特權(quán)指令在內(nèi)的指令系統(tǒng)后一頁前一頁退出目錄4.3.3段定義偽操作完整的段定義偽操作存儲模型與簡化段定義偽操作段組定義偽操作段順序偽操作為確定標(biāo)號和變量〔代碼段和數(shù)據(jù)段的符號地址〕的偏移地址;把有關(guān)信息通過目標(biāo)模塊傳送給連接程序,以便連接程序把不同的段和模塊連接在一起,形成一個可執(zhí)行程序。后一頁前一頁退出目錄1.完整的段定義偽操作段名 segment [定位][組合][段字][‘類別’] ... ;語句序列段名 ends完整段定義由SEGMENT和ENDS這一對偽指令實現(xiàn),SEGMENT偽指令定義一個邏輯段的開始,ENDS偽指令表示一個段的結(jié)束。段定義指令后的4個關(guān)鍵字用于確定段的各種屬性,堆棧段要采用stack組合類型,代碼段應(yīng)具有‘code’類別,其他為可選屬性參數(shù)。如果不指定,那么采用默認(rèn)參數(shù);但如果指定,注意要按照上列次序。數(shù)據(jù)段、附加段、和堆棧段中,一般是存儲單元的定義、分配等偽操作;代碼段那么是指令及偽操作。后一頁前一頁退出目錄〔1〕定位類型〔align_type〕指定邏輯段在主存儲器中的邊界,可為:PARA 段的起始地址必須從小段邊界開始〔xxxx0000b〕。這樣,偏移地址可以從0開始。BYTE 該段可以從任何地址開始〔xxxxxxxxb〕,這樣起始偏移地址可能不是0。WORD 該段必須從字的邊界開始〔xxxxxxx0b〕,即段起始地址必須為偶數(shù)。DWORD該段必須從雙字的邊界開始〔xxxxxx00b〕。PAGE 該段必須從頁的邊界開始〔00000000b〕,該地址能被256整除。后一頁前一頁退出目錄默認(rèn)定位類型簡化段定義偽指令的代碼和數(shù)據(jù)段默認(rèn)采用WORD定位,堆棧段默認(rèn)采用PARA定位。完整段定義偽指令的默認(rèn)定位屬性是PARA,其低4位已經(jīng)是0,所以默認(rèn)情況下數(shù)據(jù)段的偏移地址從0開始。后一頁前一頁退出目錄〔2〕組合類型〔combine_type〕指定多個邏輯段之間的關(guān)系,可為:PRIVATE 該段為私有段,在連接時將不與其他模塊中同名分段合并。這是完整段定義偽指令默認(rèn)的段組合方式。PUBLIC 該段連接時,可以把不同模塊中的同名段相鄰地連接在一起,其連接次序由連接命令指定。每一分段都從小段的邊界開始,因此個模塊的原有段之間可能存在小于16字節(jié)的間隙。這是簡化段定義偽指令默認(rèn)的段組合。MEMORY 與PUBLIC同義。后一頁前一頁退出目錄組合類型〔combine_type〕STACK 把不同模塊中的同名段組合而形成一個堆棧段。該段的長度為各原有段的總和,各原有段之間并無PUBLIC所連接段中的間隙,而且棧頂可自動指向連接后形成的大段堆棧段的棧頂。這是堆棧段必須具有的段組合。COMMON 該段連接時,可以把不同模塊中的同名段重疊而形成一個段,由于各同名段有相同的起始地址,所以會產(chǎn)生覆蓋。COMMON的連接長度是各分段中的最大長度。重疊局部的內(nèi)容取決于排列在最后一段的內(nèi)容。ATexpression 使段地址是表達(dá)式所計算出來的16位值。但它不能用來指定代碼段。后一頁前一頁退出目錄〔3〕使用類型〔use_type〕為支持32位段而設(shè)置的屬性,只適用于386及其后繼機(jī)型。它用來說明使用16位尋址方式還是32位尋址方式。它們可以是:USE16 使用16位尋址方式。USE32 使用32位尋址方式。當(dāng)使用16位尋址方式時,段長<=64KB,地址的形式是16位段地址和16偏移地址;當(dāng)使用32位尋址方式時,段長可大4GB,地址的形式是16位段地址和32位偏移地址。編寫運行于實模式〔8086工作方式〕的匯編語言程序,必須采用USE16。使用類型的默認(rèn)項是USE16。后一頁前一頁退出目錄〔4〕類別〔‘class’〕在引號中給出連接時組成段組的類型名,段組的類型名可以是任意名稱。類型說明并不能把相同類別的段合并起來,但在連接程序組織段時,可將所有的同類別段相鄰分配。大多數(shù)MASM程序使用‘code’、‘data’和‘stack’來分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù)。后一頁前一頁退出目錄指定段存放器偽指令A(yù)SSUMEASSUME段存放器:段名[,段存放器名:段名,...]通知MASM用指定的段存放器來尋址對應(yīng)的邏輯段,即明確段和段存放器的關(guān)系。ASSUME說明分配情況。匯編程序會根據(jù)數(shù)據(jù)所在的邏輯段,在需要時自動插入段超越前綴。這是ASSUME偽指令的主要功能。其中段存放器必須是CS、DS、ES、SS〔386及其后繼機(jī)型還有FS和GS〕之一,段名那么必須是由SEGMENT定義的段中的段名。后一頁前一頁退出目錄ASSUME偽指令A(yù)SSUME偽指令并不為段存放器設(shè)定初值,連接程序LINK將正確設(shè)置CS:IP和SS:SP。由于數(shù)據(jù)段通常都需要,所以在樣板源程序中,首先為DS賦值;如果使用附加段,還要賦值ES。ASSUMENOTHING那么可取消前面由ASSUME所指定的段存放器。完整段定義舉例說明例4.1。后一頁前一頁退出目錄例4.1;*************************************************

data_seg1segment ;定義數(shù)據(jù)段 …… data_seg1ends;*************************************************

data_seg2segment ;定義附加段

…… data_seg2ends;*************************************************完整段定義后一頁前一頁退出目錄 code_segsegment ;定義代碼段 assumecs:code_seg,ds:data_seg1,es:data_seg2 start: ;程序開始執(zhí)行的位置 ;DS存放器中指定當(dāng)前數(shù)據(jù)段地址 movax,data_seg1 ;數(shù)據(jù)段首地址存入DS movds,ax ;ES存放器中指定當(dāng)前附加段地址 movax,data_seg2 ;附加段首地址存入ES moves,ax …… code_segends ;代碼段結(jié)束;************************************************** endstart完整段定義ASSUME并不能把段地址裝入段存放器中,所以代碼段中要有這樣的操作。如果有堆棧段,也需把段地址裝入SS中。代碼段不需要,代碼段的這一操作是在程序初始化時完成的。后一頁前一頁退出目錄2.存儲模型與簡化段定義偽操作MODEL偽操作簡化的段定義偽操作與簡化段定義有關(guān)的預(yù)定義符號用MODEL定義存儲模型時的段默認(rèn)屬性簡化段定義舉例后一頁前一頁退出目錄〔1〕MODEL偽操作

.MODEL存儲模式 [,模式選項]使用簡化段定義,必須有存儲模式偽指令。.model語句必須位于所有段定義語句之前。用來說明在存儲器中是如何安放各個段的。存儲模式?jīng)Q定一個程序的規(guī)模,確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性。MASM有7種不同的存儲模式:①TINY ②SMALL③MEDIUM ④COMPACT⑤LARGE ⑥HUGE⑦FLAT后一頁前一頁退出目錄①Tiny微型模式是MASM6.0才引入的用于創(chuàng)立COM類型程序,COM程序必須從0100H的存儲單元開始。這種模型一般用于小程序。用微型模式編寫匯編語言程序時,所有的段地址存放器都被設(shè)置為同一值。這意味著代碼段、數(shù)據(jù)段、堆棧段都在同一個段內(nèi),不大于64KB;訪問操作數(shù)或指令都只需要使用16位偏移地址。后一頁前一頁退出目錄②Small一般的程序〔例如本書的絕大多數(shù)程序例如和習(xí)題〕都可用這種模式。在小型模式下,一個程序至多只能有一個代碼段和一個數(shù)據(jù)段,每段不大于64KB。這里的數(shù)據(jù)段是指數(shù)據(jù)段、堆棧段和附加段的總和,它們共用同一個段基址,總長度不可超過64KB;因此小模式下程序的最大長度為128KB。訪問操作數(shù)或指令都只需要使用16位偏移地址;這意味著諸如指令轉(zhuǎn)移、程序調(diào)用以及數(shù)據(jù)訪問等都是近屬性〔NEAR〕,即小型模式下的調(diào)用類型和數(shù)據(jù)指針缺省分別為近調(diào)用和近指針。后一頁前一頁退出目錄③Medium中型模式是與緊湊模式互補(bǔ)的模式。適合于數(shù)據(jù)量小但代碼量大的程序。中型模式的代碼段可以超過64KB,有多個;但數(shù)據(jù)段只能有一個不大于64KB的段。這種模式下數(shù)據(jù)是近訪問;但代碼那么是遠(yuǎn)訪問,即調(diào)用類型缺省是遠(yuǎn)〔FAR〕調(diào)用,因為要利用段地址區(qū)別多個代碼段。后一頁前一頁退出目錄④Compact適合于數(shù)據(jù)量大但代碼量小的程序。緊湊模式下,代碼段被限制在一個不大于64KB的段內(nèi);而數(shù)據(jù)段那么可以有多個,超過64KB。這種模式下的代碼是近訪問,即調(diào)用類型缺省仍為近調(diào)用;而數(shù)據(jù)那么缺省為遠(yuǎn)〔FAR〕訪問,因為必須用段地址來區(qū)別多個數(shù)據(jù)段。后一頁前一頁退出目錄⑤Large較大型程序通常采用的存儲模式。大型模式允許的代碼段和數(shù)據(jù)段都有多個,都可以超過64KB;但全部的靜態(tài)數(shù)據(jù)〔不能改變的數(shù)據(jù)〕仍限制在64K字節(jié)內(nèi)。大型模式下的數(shù)據(jù)和代碼都可以遠(yuǎn)訪問。后一頁前一頁退出目錄⑥HugeHUGE〔巨型模式〕與大型模式根本相同,只是靜態(tài)數(shù)據(jù)不再被限制在64K字節(jié)之內(nèi)。后一頁前一頁退出目錄⑦Flat平展模式用于創(chuàng)立一個32位的程序,它只能運行在32位x86CPU上。DOS下不能使用FLAT模式,而編寫32位Windows9.x或Windows-NT的程序時,必須采用FLAT模式。MASM5版本不支持這種模型,當(dāng)MASM6可以支持。DOS下編程可選擇前六種模式,一般可以選用SMALL模式。TINY模式產(chǎn)生COM程序,其他模式產(chǎn)生EXE程序,F(xiàn)LAT模式只能用于32位程序。后一頁前一頁退出目錄ModeloptionsModeloptions允許用戶指定三種選項:高級語言接口操作系統(tǒng)

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論