版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
教學(xué)重點(diǎn)學(xué)習(xí)了8086硬指令,接著介紹MASM基本的偽指令。重點(diǎn)掌握:程序的格式、開(kāi)發(fā)方法參數(shù)的表達(dá)、變量的定義變量和標(biāo)號(hào)的屬性教學(xué)重點(diǎn)學(xué)習(xí)了8086硬指令,接著介紹MASM基本的偽指令。1硬指令和偽指令硬指令——使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的語(yǔ)句,就是我們剛剛學(xué)習(xí)的處理器指令偽指令(Directive)——不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說(shuō)明性語(yǔ)句,例如,數(shù)據(jù)說(shuō)明、變量定義等等偽指令與具體的處理器類(lèi)型無(wú)關(guān),但與匯編程序的版本有關(guān)
本課程采用微軟宏匯編程序MASM6.11硬指令和偽指令硬指令——使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處2匯編語(yǔ)言程序的開(kāi)發(fā)本節(jié)從匯編語(yǔ)言程序的語(yǔ)句格式出發(fā),給出第一個(gè)示范性的匯編語(yǔ)言源程序,并演示匯編語(yǔ)言程序的過(guò)程:編輯匯編連接調(diào)試即匯編語(yǔ)言程序的開(kāi)發(fā)方法匯編語(yǔ)言程序的開(kāi)發(fā)本節(jié)從匯編語(yǔ)言程序的語(yǔ)句格式出發(fā),給出第一3語(yǔ)句格式⑴執(zhí)行性語(yǔ)句——由硬指令構(gòu)成的語(yǔ)句,它通常對(duì)應(yīng)一條機(jī)器指令,出現(xiàn)在程序的代碼段中:標(biāo)號(hào):硬指令助記符操作數(shù),操作數(shù) ;注釋⑵說(shuō)明性語(yǔ)句——由偽指令構(gòu)成的語(yǔ)句,它通常指示匯編程序如何匯編源程序:名字偽指令助記符參數(shù),參數(shù),… ;注釋語(yǔ)句格式⑴執(zhí)行性語(yǔ)句——由硬指令構(gòu)成的語(yǔ)句,它通常對(duì)應(yīng)一條4 MOVCX,0 ;傳送指令,具有2個(gè)操作數(shù)DELAY: NOP ;空操作指令,沒(méi)有操作數(shù),帶有標(biāo)號(hào) LOOPDELAY ;循環(huán)指令,標(biāo)號(hào)DELAY說(shuō)明轉(zhuǎn)移位置BUFFER DB1,2,3,4,5,6,7
;數(shù)據(jù)定義偽指令,在主存中開(kāi)辟7個(gè)連續(xù)的字節(jié)單元,初值依次為1~7,BUFFER表示首地址匯編語(yǔ)言語(yǔ)句實(shí)例 MOVCX,0 ;傳送指令,具有2個(gè)操作數(shù)匯編語(yǔ)言語(yǔ)句實(shí)5標(biāo)號(hào)、名字與標(biāo)識(shí)符標(biāo)號(hào)是反映硬指令位置(邏輯地址)的標(biāo)識(shí)符,后跟一個(gè)冒號(hào)分隔名字是反映偽指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟空格或制表符分隔,沒(méi)有一個(gè)冒號(hào)標(biāo)識(shí)符(Identifier)一般最多由31個(gè)字母、數(shù)字及規(guī)定的特殊符號(hào)(如_、$、?、@)組成,不能以數(shù)字開(kāi)頭。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識(shí)符中的字母大小寫(xiě)一個(gè)程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,還不能是匯編語(yǔ)言采用的保留字標(biāo)號(hào)、名字與標(biāo)識(shí)符標(biāo)號(hào)是反映硬指令位置(邏輯地址)的標(biāo)識(shí)符,6保留字保留字(ReservedWord)是匯編程序已經(jīng)利用的標(biāo)識(shí)符,主要有:硬指令助記符——例如:MOV、ADD偽指令助記符——例如:DB、EQU操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS預(yù)定義符號(hào)——例如:@data保留字保留字(ReservedWord)是匯編程序已經(jīng)利用7助記符硬指令助記符可以是任何一條處理器指令,也可以是一條宏指令偽指令助記符將在本節(jié)學(xué)習(xí)定義字節(jié)數(shù)據(jù)和字符串的DB就是偽指令助記符硬指令助記符可以是任何一條處理器指令,也可以是一條宏指8操作數(shù)與參數(shù)處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲(chǔ)單元偽指令的參數(shù)可以是常數(shù)、變量名、表達(dá)式等,可以有多個(gè),參數(shù)之間用逗號(hào)分隔操作數(shù)與參數(shù)處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲(chǔ)單元9注釋語(yǔ)句中由分號(hào)“;”開(kāi)始的部分為注釋內(nèi)容,用以增加源程序的可讀性必要時(shí),一個(gè)語(yǔ)句行也可以由分號(hào)開(kāi)始作為階段性注釋匯編程序在翻譯源程序時(shí)將跳過(guò)該部分,不對(duì)它們做任何處理注釋語(yǔ)句中由分號(hào)“;”開(kāi)始的部分為注釋內(nèi)容,用以增加源程序的10分隔符語(yǔ)句的4個(gè)組成部分要用分隔符分開(kāi)標(biāo)號(hào)后用冒號(hào),注釋前用分號(hào)操作數(shù)之間和參數(shù)之間使用逗號(hào)分隔其他部分通常采用空格或制表符多個(gè)空格和制表符的作用與一個(gè)相同MASM支持續(xù)行符“\”分隔符語(yǔ)句的4個(gè)組成部分要用分隔符分開(kāi)11匯編語(yǔ)言源程序的組成原則完整的匯編語(yǔ)言源程序由段組成一個(gè)匯編語(yǔ)言源程序可以包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列需獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段,并指示程序執(zhí)行的起始點(diǎn),一個(gè)程序只有一個(gè)起始點(diǎn)所有的可執(zhí)行性語(yǔ)句必須位于某一個(gè)代碼段內(nèi),說(shuō)明性語(yǔ)句可根據(jù)需要位于任一段內(nèi)通常,程序還需要一個(gè)堆棧段匯編語(yǔ)言源程序的組成原則完整的匯編語(yǔ)言源程序由段組成12匯編語(yǔ)言源程序源程序分別用兩種格式書(shū)寫(xiě)第一種格式從MASM5.0開(kāi)始支持簡(jiǎn)化段定義格式第二種格式MASM5.0以前就具有完整段定義格式Hello,Everybody!程序功能匯編語(yǔ)言源程序源程序分別用兩種格式書(shū)寫(xiě)Hello,Ever13;test1.asm(文件名) .modelsmall ;定義程序的存儲(chǔ)模式 .stack ;定義堆棧段 .data ;定義數(shù)據(jù)段string db’Hello,Everybody!’,0dh,0ah,’$’
;在數(shù)據(jù)段定義要顯示的字符串 .code ;定義代碼段 .startup ;程序起始點(diǎn),建立DS、SS
movdx,offsetstring
;指定字符串
movah,9 int21h
;利用功能調(diào)用顯示信息 .exit0 ;程序結(jié)束點(diǎn),返回DOS end ;匯編結(jié)束例1a:簡(jiǎn)化段定義格式抽象;test1.asm(文件名)例1a:簡(jiǎn)化段定義格式抽象14;SampleA.ASM .modelsmall .stack .data
... ;在數(shù)據(jù)段定義數(shù)據(jù) .code .startup ;(注1)
... ;在代碼段填入指令序列 .exit0 ;(注2)
...
;子程序代碼 end ;(注3)簡(jiǎn)化段定義格式
MASM6.x支持;SampleA.ASM簡(jiǎn)化段定義格式
MASM6.x支15;test2.asm(文件名)stack segmentstack ;定義堆棧段 dw512dup(?) ;堆棧段有512字(1024字節(jié))空間stack ends ;堆棧段結(jié)束data segment ;定義數(shù)據(jù)段string db’Hello,Everybody!’,0dh,0ah,’$’data endscode segment’code’ ;定義代碼段 assumecs:code,ds:data,ss:stackstart: movax,data ;建立DS段地址 movds,ax例1b:完整段定義格式;test2.asm(文件名)例1b:完整段定義格式16 movdx,offsetstring movah,9 int21h movax,4c00h int21h ;利用功能調(diào)用返回DOScode ends ;代碼段結(jié)束 endstart ;匯編結(jié)束,同時(shí)指明程序起始點(diǎn)例1b:完整段定義格式抽象 movdx,offsetstring例1b:完整段定義17匯編語(yǔ)言程序的開(kāi)發(fā)過(guò)程編輯文本編輯器,如EDIT.COM源程序:文件名.asm匯編匯編程序,如ML.EXE目標(biāo)模塊:文件名.obj連接連接程序,如LINK.EXE可執(zhí)行文件:文件名.exe調(diào)試調(diào)試程序,如DEBUG.EXE應(yīng)用程序錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤匯編語(yǔ)言程序的開(kāi)發(fā)過(guò)程編輯文本編輯器,如EDIT.COM源18開(kāi)發(fā)過(guò)程1:源程序的編輯源程序文件要以ASM為擴(kuò)展名源程序文件的形成(編輯)可以通過(guò)任何一個(gè)文本編輯器實(shí)現(xiàn):DOS中的全屏幕文本編輯器EDIT其他程序開(kāi)發(fā)工具中的編輯環(huán)境MASM程序員工作平臺(tái)PWB中的編輯環(huán)境EDITtest1.asm開(kāi)發(fā)過(guò)程1:源程序的編輯源程序文件要以ASM為擴(kuò)展名19開(kāi)發(fā)過(guò)程2:源程序的匯編匯編是將源程序翻譯成由機(jī)器代碼組成的目標(biāo)模塊文件的過(guò)程MASM6.x提供的匯編程序是ML.EXE:ML/ctest1.asm如果源程序中沒(méi)有語(yǔ)法錯(cuò)誤,MASM將自動(dòng)生成一個(gè)目標(biāo)模塊文件(TEST1.obj);否則MASM將給出相應(yīng)的錯(cuò)誤信息這時(shí)應(yīng)根據(jù)錯(cuò)誤信息,重新編輯修改源程序后,再進(jìn)行匯編開(kāi)發(fā)過(guò)程2:源程序的匯編匯編是將源程序翻譯成由機(jī)器代碼組成的20開(kāi)發(fā)過(guò)程3:目標(biāo)模塊的連接連接程序能把一個(gè)或多個(gè)目標(biāo)文件和庫(kù)文件合成一個(gè)可執(zhí)行程序(.EXE、.COM文件):LINKtest1.obj如果沒(méi)有嚴(yán)重錯(cuò)誤,LINK將生成一個(gè)可執(zhí)行文件(test1.exe);否則將提示相應(yīng)的錯(cuò)誤信息這時(shí)需要根據(jù)錯(cuò)誤信息重新修改源程序后再匯編、鏈接,直到生成可執(zhí)行文件開(kāi)發(fā)過(guò)程3:目標(biāo)模塊的連接連接程序能把一個(gè)或多個(gè)目標(biāo)文件和庫(kù)21匯編和連接的依次自動(dòng)實(shí)現(xiàn)ML匯編程序可自動(dòng)調(diào)用LINK連接程序,實(shí)現(xiàn)匯編和連接的依次進(jìn)行MLtest1.asm匯編程序ML.EXE可帶其他參數(shù),常用ML/Fl/Sgtest1.asm該命令除產(chǎn)生模塊文件test1.obj和可執(zhí)行文件test1.exe外,還將生成列表文件test1.lst列表文件是一種文本文件,含有源程序和目標(biāo)代碼,對(duì)我們學(xué)習(xí)匯編語(yǔ)言程序設(shè)計(jì)和發(fā)現(xiàn)錯(cuò)誤很有用。采用/Sg選項(xiàng),將在列表文件中得到有些偽指令相應(yīng)的硬指令匯編和連接的依次自動(dòng)實(shí)現(xiàn)ML匯編程序可自動(dòng)調(diào)用LINK連接程22開(kāi)發(fā)過(guò)程4:可執(zhí)行程序的調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運(yùn)行:test1操作系統(tǒng)裝載該文件進(jìn)入主存,并開(kāi)始運(yùn)行如果出現(xiàn)運(yùn)行錯(cuò)誤,可以從源程序開(kāi)始排錯(cuò),也可以利用調(diào)試程序幫助發(fā)現(xiàn)錯(cuò)誤采用DEBUG.EXE調(diào)試程序:
DEBUGtest1.exe開(kāi)發(fā)過(guò)程4:可執(zhí)行程序的調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程序在操232.3.1參數(shù)、變量和標(biāo)號(hào)詳細(xì)討論匯編語(yǔ)言程序語(yǔ)句主要部分參數(shù)變量名標(biāo)號(hào)并引出相關(guān)的偽指令和操作符本節(jié)重點(diǎn)掌握:常數(shù)的表達(dá)、變量定義偽指令DB/DW/DD、地址操作符和類(lèi)型操作符2.3.1參數(shù)、變量和標(biāo)號(hào)詳細(xì)討論匯編語(yǔ)言程序語(yǔ)句主要部24一、數(shù)值型參數(shù)在源程序語(yǔ)句格式的4個(gè)組成部分中,參數(shù)是指令的操作對(duì)象(在學(xué)習(xí)硬指令時(shí)被稱(chēng)為操作數(shù)),參數(shù)之間用逗號(hào)分隔參數(shù)根據(jù)指令不同可以沒(méi)有,可以有1個(gè)、2個(gè)或多個(gè)匯編語(yǔ)言程序中,指令參數(shù)有數(shù)值型,它的主要形式是常數(shù)和數(shù)值表達(dá)式;硬指令的操作數(shù)有立即數(shù);立即數(shù)就要用數(shù)值型參數(shù)表達(dá)一、數(shù)值型參數(shù)在源程序語(yǔ)句格式的4個(gè)組成部分中,參數(shù)是指令的251、常數(shù)常數(shù)(常量)表示一個(gè)固定的數(shù)值它又分成多種形式:(1)十進(jìn)制常數(shù)(2)十六進(jìn)制常數(shù)(3)二進(jìn)制常數(shù)(4)八進(jìn)制常數(shù)(5)字符串常數(shù)(6)符號(hào)常數(shù)1、常數(shù)常數(shù)(常量)表示一個(gè)固定的數(shù)值26十進(jìn)制常數(shù)由0~9數(shù)字組成,以字母D或d結(jié)尾缺省情況下,后綴D或d可以省略匯編語(yǔ)言大小寫(xiě)不敏感,D和d通用例如:100、255D十進(jìn)制常數(shù)由0~9數(shù)字組成,以字母D或d結(jié)尾27十六進(jìn)制常數(shù)由0~9、A~F組成,以字母H或h結(jié)尾以字母A~F開(kāi)頭的十六進(jìn)制數(shù),前面要用0表達(dá),以避免與其他符號(hào)混淆匯編語(yǔ)言大小寫(xiě)不敏感,H和h通用例如:64H、0FFh、0B800H十六進(jìn)制常數(shù)由0~9、A~F組成,以字母H或h結(jié)尾28二進(jìn)制常數(shù)由0或1兩個(gè)數(shù)字組成,以字母B或b結(jié)尾匯編語(yǔ)言大小寫(xiě)不敏感,B和b通用例如:01101100B二進(jìn)制常數(shù)由0或1兩個(gè)數(shù)字組成,以字母B或b結(jié)尾29八進(jìn)制常數(shù)由0~7數(shù)字組成,以字母Q或q結(jié)尾匯編語(yǔ)言大小寫(xiě)不敏感,Q和q通用例如:144Q各種進(jìn)制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù)MASM提供基數(shù)控制.RADIX偽指令可以改變默認(rèn)進(jìn)制,其格式是: .RADIXn八進(jìn)制常數(shù)由0~7數(shù)字組成,以字母Q或q結(jié)尾30字符串常數(shù)用單引號(hào)或雙引號(hào)括起來(lái)的單個(gè)字符或多個(gè)字符,其數(shù)值是每個(gè)字符對(duì)應(yīng)的ASCII碼的值例如:'d'=64H'AB'=4142H'Hello,Everybody!'字符串常數(shù)用單引號(hào)或雙引號(hào)括起來(lái)的單個(gè)字符或多個(gè)字符,其數(shù)值31符號(hào)常數(shù)利用一個(gè)標(biāo)識(shí)符表達(dá)的一個(gè)數(shù)值MASM提供等價(jià)機(jī)制,用于常量定義符號(hào)定義偽指令:等價(jià)EQU偽指令符號(hào)名EQU數(shù)值表達(dá)式符號(hào)名EQU<字符串>等號(hào)=偽指令符號(hào)名=數(shù)值表達(dá)式常數(shù)若使用有意義的符號(hào)名來(lái)表示,可以提高程序的可讀性,同時(shí)更具有通用性實(shí)例符號(hào)常數(shù)利用一個(gè)標(biāo)識(shí)符表達(dá)的一個(gè)數(shù)值實(shí)例322、數(shù)值表達(dá)式數(shù)值表達(dá)式一般是指由運(yùn)算符連接的各種常數(shù)所構(gòu)成的表達(dá)式匯編程序在匯編過(guò)程中計(jì)算表達(dá)式,最終得到一個(gè)數(shù)值程序運(yùn)行之前,就已經(jīng)計(jì)算出了表達(dá)式;所以,程序運(yùn)行速度沒(méi)有變慢,但增強(qiáng)程序的可讀性MASM對(duì)除偽指令外各種匯編時(shí)處理的指令統(tǒng)稱(chēng)為操作符(Operator)2、數(shù)值表達(dá)式數(shù)值表達(dá)式一般是指由運(yùn)算符連接的各種常數(shù)所構(gòu)成33運(yùn)算符算術(shù)運(yùn)算符+
-
*
/MOD邏輯運(yùn)算符ANDORXORNOT移位運(yùn)算符SHLSHR關(guān)系運(yùn)算符EQNEGTLTGELE高低分離符HIGHLOWHIGHWORDLOWWORD運(yùn)算符算術(shù)運(yùn)算符34算術(shù)運(yùn)算符實(shí)現(xiàn)加、減、乘、除、取余的算術(shù)運(yùn)算movax,3*4+5 ;等價(jià)于movax,17其中MOD也稱(chēng)為取模,它產(chǎn)生除法之后的余數(shù),如19mod7=5加+和減-運(yùn)算符還可以用于地址表達(dá)式除加、減外,其他運(yùn)算符的參數(shù)必須是整數(shù)算術(shù)運(yùn)算符實(shí)現(xiàn)加、減、乘、除、取余的算術(shù)運(yùn)算35邏輯運(yùn)算符實(shí)現(xiàn)按位相與、相或、異或、求反的邏輯運(yùn)算oral,03hAND45h;等價(jià)于oral,01h邏輯運(yùn)算符實(shí)現(xiàn)按位相與、相或、異或、求反的邏輯運(yùn)算36移位運(yùn)算符實(shí)現(xiàn)對(duì)數(shù)值的左移、右移的邏輯操作;移入低位或高位的是0格式為:數(shù)值表達(dá)式SHL/SHR移位次數(shù)moval,0101bSHL(2*2);等價(jià)于moval,01010000b移位運(yùn)算符實(shí)現(xiàn)對(duì)數(shù)值的左移、右移的邏輯操作;移入低位或高位的37關(guān)系運(yùn)算符用于比較和測(cè)試符號(hào)數(shù)值MASM用0FFFFH(補(bǔ)碼-1)表示條件為真MASM用0000H表示條件為假movbx,((PORTLT5)AND20)OR((PORTGE5)AND30);當(dāng)PORT<5時(shí),匯編結(jié)果為movbx,20;否則,匯編結(jié)果為movbx,30關(guān)系運(yùn)算符用于比較和測(cè)試符號(hào)數(shù)值38高低分離符取數(shù)值的高半部分或低半部分HIGH、LOW從一個(gè)字?jǐn)?shù)值或符號(hào)常量中得到高、低字節(jié)movah,HIGH8765h ;等價(jià)于movah,87h從MASM6.0引入的HIGHWORD、LOWWORD取一個(gè)符號(hào)常量(不能是其他常數(shù))的高字或低字部分dd_valueequ0ffff1234h ;定義一個(gè)符號(hào)常量movax,LOWWORDdd_value ;等價(jià)于movax,1234h高低分離符取數(shù)值的高半部分或低半部分39操作符的優(yōu)先級(jí)1 ()<>[]·LENGTHSIZEWIDTHMASK2 PTROFFSETSEGTPYETHIS:3 HIGELOW4 */MODSHLSHR5 +-6 EQNEGTLTGELE7 NOT8 AND9 ORXOR10 SHORT
建議采用圓括號(hào)“()”顯式表達(dá),它可以極大地提高程序的可閱讀性操作符的優(yōu)先級(jí)1 ()<>[]·LENGT40地址型參數(shù)匯編語(yǔ)言程序中,指令參數(shù)還有地址型,它的主要形式是標(biāo)號(hào)和名字(變量名、段名、過(guò)程名等)硬指令的操作數(shù)有存儲(chǔ)單元;存儲(chǔ)單元就應(yīng)該用地址型參數(shù)(存儲(chǔ)器操作數(shù))表達(dá)地址型參數(shù)匯編語(yǔ)言程序中,指令參數(shù)還有地址型,它的主要形式是41二、變量定義偽指令變量定義(Define)偽指令為變量申請(qǐng)固定長(zhǎng)度的存儲(chǔ)空間,并可同時(shí)將相應(yīng)的存儲(chǔ)單元初始化變量名偽指令助記符初值表
變量定義偽指令最常使用二、變量定義偽指令變量定義(Define)偽指令為變量申請(qǐng)固42變量名變量名為用戶自定義標(biāo)識(shí)符,表示初值表首元素的邏輯地址;用這個(gè)符號(hào)表示地址,常稱(chēng)為符號(hào)地址變量名可以沒(méi)有。這種情況,匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g,無(wú)符號(hào)地址設(shè)置變量名是為了方便存取它指示的存儲(chǔ)單元變量名變量名為用戶自定義標(biāo)識(shí)符,表示初值表首元素的邏輯地址;43初值表初值表是用逗號(hào)分隔的參數(shù)主要由數(shù)值常數(shù)、表達(dá)式或?、DUP組成?——表示初值不確定,即未賦初值;DUP——表示重復(fù)初值DUP的格式為:重復(fù)次數(shù)DUP(重復(fù)參數(shù))初值表初值表是用逗號(hào)分隔的參數(shù)44變量定義偽指令助記符變量定義偽指令根據(jù)申請(qǐng)的主存空間單位分類(lèi)DB——定義字節(jié)偽指令DW——定義字偽指令DD——定義雙字偽指令DF——定義3字偽指令DQ——定義4字偽指令DT——定義10字節(jié)偽指令還有定位偽指令變量定義偽指令助記符變量定義偽指令根據(jù)申請(qǐng)的主存空間單位分類(lèi)45定義字節(jié)單元偽指令DBDB偽指令用于分配一個(gè)或多個(gè)字節(jié)單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)一定是字節(jié)量(Byte),存放一個(gè)8位數(shù)據(jù):可以是0~255的無(wú)符號(hào)數(shù)或是-128~+127帶符號(hào)數(shù)也可以是字符串常數(shù)實(shí)例定義字節(jié)單元偽指令DBDB偽指令用于分配一個(gè)或多個(gè)字節(jié)單元,46data segment ;數(shù)據(jù)段X db'a',-5 db2dup(100),?Y db'ABC'data ends字節(jié)單元定義實(shí)例應(yīng)用data segment ;數(shù)據(jù)段字節(jié)單元定義實(shí)例應(yīng)用47moval,X;此處X表示它的第1個(gè)數(shù)據(jù),故AL←'a'decX+1;對(duì)X為始的第2個(gè)數(shù)據(jù)減1,故成為-6movY,al;現(xiàn)在Y這個(gè)字符串成為'aBC'字節(jié)變量的應(yīng)用moval,X字節(jié)變量的應(yīng)用48定義字單元偽指令DWDW偽指令用于分配一個(gè)或多個(gè)字單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)一定是字量(Word),一個(gè)字單元可用于存放任何16位數(shù)據(jù):一個(gè)段地址一個(gè)偏移地址兩個(gè)字符0~65535之間的無(wú)符號(hào)數(shù)-32768~+32767之間的帶符號(hào)數(shù)實(shí)例定義字單元偽指令DWDW偽指令用于分配一個(gè)或多個(gè)字單元,并可49data segment ;數(shù)據(jù)段count dw8000h,?,'AB'maxint equ64hnumber dwmaxintarray dwmaxintdup(0)data ends字單元定義實(shí)例data segment ;數(shù)據(jù)段字單元定義實(shí)例50字變量和字常量的定義:WNUM EQU5678H ;定義WNUM為常量COUNT DW20H;定義COUNT變量,假設(shè)在數(shù)據(jù)段的偏移地址為10H字變量和字常量的應(yīng)用:MOVAX,[BX+SI+WNUM] ;MOVAX,[BX+SI+5678H]MOVAX,COUNT ;MOVAX,[0010H]MOVAX,[SI+COUNT] ;MOVAX,COUNT[SI] ;MOVAX,[SI+10H]LEABX,COUNT ;LEABX,[0010H]MOVBX,OFFSETCOUNT ;MOVBX,0010H字變量和字常量字變量和字常量的定義:字變量和字常量51定義雙字單元偽指令DDDD偽指令用于分配一個(gè)或多個(gè)雙字單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)是一個(gè)32位的雙字量(DoubleWord):可以是有符號(hào)或無(wú)符號(hào)的32位整數(shù)也可以用來(lái)表達(dá)16位段地址(高位字)和16位的偏移地址(低位字)的遠(yuǎn)指針vardd DD0,?,12345678hfarpoint DD00400078h定義雙字單元偽指令DDDD偽指令用于分配一個(gè)或多個(gè)雙字單元,52其他數(shù)據(jù)單元定義偽指令定義3字偽指令DF——用于為一個(gè)或多個(gè)6字節(jié)變量分配空間及初始化6字節(jié)常用在32位CPU中表示一個(gè)48位遠(yuǎn)指針(16位段選擇器:32位偏移地址)定義4字偽指令DQ——用于為一個(gè)或多個(gè)8字節(jié)變量分配空間及初始化8字節(jié)變量可以表達(dá)一個(gè)64位整數(shù)定義10字節(jié)偽指令DT——用于為一個(gè)或多個(gè)10字節(jié)變量分配空間及初始化10字節(jié)變量可以表達(dá)擴(kuò)展精度浮點(diǎn)數(shù)其他數(shù)據(jù)單元定義偽指令定義3字偽指令DF——用于為一個(gè)或多個(gè)53例2:數(shù)據(jù)定義綜合應(yīng)用-1/2 .modelsmall .stack .databvar DB16wvar DW4*3dvar DD4294967295 ;=232-1qvar DQ?
DB1,2,3,4,5tvar DT2345 ;定義了BCD碼2345Habc DB'a','b','c'msg DB'Hello',13,10,'$'bbuf DB12DUP('month')dbuf DD25DUP(?)CALLDOS EQU<int21h>例2:數(shù)據(jù)定義綜合應(yīng)用-1/2 .modelsmall54例2:數(shù)據(jù)定義綜合應(yīng)用-2/2 .code .startup movbl,bvar movax,wordptrdvar[0] movdx,wordptrdvar[2] ;取雙字到DX.AX movdx,offsetmsg movah,09h CALLDOS .exit0 end例2:數(shù)據(jù)定義綜合應(yīng)用-2/2 .code55例3:數(shù)據(jù)復(fù)制和顯示-1/2 .modelsmall .stack .datasourcedb33h,34h,35h,36h ;定義4個(gè)字符數(shù)據(jù)targetdb80dup(?) ;分配數(shù)據(jù)空間4×20=80 .code .startup movax,ds moves,ax ;data也作為附加段 cld movsi,offsetsource movdi,offsettarget movcx,80例3:數(shù)據(jù)復(fù)制和顯示-1/2 .modelsmall56例3:數(shù)據(jù)復(fù)制和顯示-2/2
repmovsb
;串傳送 movsi,0 ;顯示 movbx,offsettargetagain: movdl,[bx+si] movah,2 int21h incsi cmpsi,80 jbagain .exit0 end例3:數(shù)據(jù)復(fù)制和顯示-2/2 repmovsb ;串傳送57定位偽指令定位偽指令控制數(shù)據(jù)的偏移地址ORG參數(shù)ORG偽指令是將當(dāng)前偏移地址指針指向參數(shù)表達(dá)的偏移地址:ORG100h ;從100h處安排數(shù)據(jù)或程序ORG$+10;使偏移地址加10,即跳過(guò)10個(gè)字節(jié)空間MASM中,符號(hào)“$”表示當(dāng)前偏移地址值EVEN ;從偶地址開(kāi)始ALIGNn ;從n的整數(shù)倍地址開(kāi)始定位偽指令定位偽指令控制數(shù)據(jù)的偏移地址58變量和標(biāo)號(hào)的屬性標(biāo)號(hào)和名字一經(jīng)定義便具有以下兩類(lèi)三種屬性:①段值標(biāo)號(hào)和名字對(duì)應(yīng)存儲(chǔ)單元的段地址②偏移值標(biāo)號(hào)和名字對(duì)應(yīng)存儲(chǔ)單元的偏移地址③類(lèi)型標(biāo)號(hào)、子程序名的類(lèi)型可以是NEAR(近)和FAR(遠(yuǎn)),分別表示段內(nèi)或段間變量名的類(lèi)型可以是BYTE(字節(jié))、WORD(字)和DWORD(雙字)等地址屬性類(lèi)型屬性變量和標(biāo)號(hào)的屬性標(biāo)號(hào)和名字一經(jīng)定義便具有以下兩類(lèi)三種屬性:地59地址操作符取得名字或標(biāo)號(hào)的段地址和偏移地址兩個(gè)屬性[]
將括起的表達(dá)式作為存儲(chǔ)器地址$
當(dāng)前偏移地址:
采用指定的段地址寄存器OFFSET名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的偏移地址SEG名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的段地址實(shí)例地址操作符取得名字或標(biāo)號(hào)的段地址和偏移地址兩個(gè)屬性實(shí)例60 org$+10array db45,45h .code movax,segarray movds,ax movbx,offsetarray ;等價(jià)于leabx,array movcl,array+4 ;等效于movcl,array[4] movax,es:[2000h]地址操作符實(shí)例
加4個(gè)字節(jié)單元 org$+10地址操作符實(shí)例加4個(gè)字節(jié)單元61類(lèi)型操作符類(lèi)型操作符對(duì)名字或標(biāo)號(hào)的類(lèi)型屬性進(jìn)行有關(guān)設(shè)置類(lèi)型名PTR名字/標(biāo)號(hào)THIS類(lèi)型名SHORT標(biāo)號(hào)TYPE名字/標(biāo)號(hào)SIZEOF變量名LENGTHOF變量名類(lèi)型操作符類(lèi)型操作符對(duì)名字或標(biāo)號(hào)的類(lèi)型屬性進(jìn)行有關(guān)設(shè)置62類(lèi)型名PTR名字/標(biāo)號(hào)PTR操作符使名字或標(biāo)號(hào)具有指定的類(lèi)型類(lèi)型名可以是BYTE/WORD/DWORD/FWORD/QWORD/TBYTE或者是NEAR/FAR,還可以是由STRUCT、RECORD、UNION以及TYPEDEF定義的類(lèi)型moval,byteptrw_var ;w_var是一個(gè)字變量jmpfarptrn_label ;n_label是一個(gè)標(biāo)號(hào)使用PTR操作符,可以臨時(shí)改變名字或標(biāo)號(hào)的類(lèi)型類(lèi)型名PTR名字/標(biāo)號(hào)PTR操作符使名字或標(biāo)號(hào)具有指定的63THIS類(lèi)型名利用THIS說(shuō)明的操作數(shù)具有匯編時(shí)的當(dāng)前邏輯地址,但具有指定的類(lèi)型b_varequ
THISbyte;按字節(jié)訪問(wèn)變量b_var,但與w_var的地址相同w_vardw10dup(0) ;按字訪問(wèn)變量w_varf_jumpequTHISfar;用f_jump為段間轉(zhuǎn)移(f_jumplabelfar)n_jump:movax,w_var;用n_jump為段內(nèi)近轉(zhuǎn)移,但兩者指向同一條指令LABEL偽指令的功能等同于“EQUTHIS”THIS類(lèi)型名利用THIS說(shuō)明的操作數(shù)具有匯編時(shí)的當(dāng)前邏輯64SHORT標(biāo)名指定標(biāo)號(hào)作為-128~+127字節(jié)范圍內(nèi)的短轉(zhuǎn)移jmpshortn_jump當(dāng)然,如果標(biāo)號(hào)實(shí)際上超出了這個(gè)范圍,則出錯(cuò)。SHORT標(biāo)名指定標(biāo)號(hào)作為-128~+127字節(jié)范圍內(nèi)的短65TYPE名字/標(biāo)名返回表明名字或標(biāo)號(hào)類(lèi)型的一個(gè)字量數(shù)值對(duì)字節(jié)、字和雙字變量依次返回1、2和4;對(duì)短、近和遠(yuǎn)轉(zhuǎn)移依次返回ff01h、ff02h和ff05hmovax,TYPEw_var ;匯編結(jié)果為movax,2movax,TYPEn_jump;匯編結(jié)果為movax,0ff02h(near標(biāo)號(hào))操作符SIZEOF返回整個(gè)變量占用的字節(jié)數(shù)LENGTHOF返回整個(gè)變量的數(shù)據(jù)項(xiàng)數(shù)(即元素?cái)?shù)) SIZEOF=LENGTHOF×TYPETYPE名字/標(biāo)名返回表明名字或標(biāo)號(hào)類(lèi)型的一個(gè)字量數(shù)值66例題:屬性及其應(yīng)用-1/5 .modelsmall .stack .datav_byte equthisbyte;v_byte是字節(jié)類(lèi)型,與變量v_word的地址相同v_word dw3332h,3735h
;v_word是字類(lèi)型的變量target dw5dup(20h)
;分配數(shù)據(jù)空間2×5=10字節(jié)crlf db0dh,0ah,'$'flag db0n_point dwoffsets_label
;取得標(biāo)號(hào)s_label的偏移地址例題:屬性及其應(yīng)用-1/5 .modelsmall67例題:屬性及其應(yīng)用-2/5 .code .startup moval,byteptrv_word;用PTR改變v_word的類(lèi)型,否則類(lèi)型不匹配 decal movv_byte,al;對(duì)v_word的頭一個(gè)字節(jié)操作,原為32H、現(xiàn)為31Hn_label: cmpflag,1 jzs_label ;flag單元為1轉(zhuǎn)移 incflag jmpshortn_label ;進(jìn)行短轉(zhuǎn)移例題:屬性及其應(yīng)用-2/5 .code68例題:屬性及其應(yīng)用-3/5s_label: cmpflag,2 jznext ;flag單元為2轉(zhuǎn)移 incflag
jmpn_point;段內(nèi)的存儲(chǔ)器間接尋址,轉(zhuǎn)移到s_label標(biāo)號(hào)處next: movax,typev_word ;匯編結(jié)果為movax,2 movcx,lengthoftarget ;匯編結(jié)果為movcx,5例題:屬性及其應(yīng)用-3/5s_label: cmpflag69例題:屬性及其應(yīng)用-4/5 movsi,offsettargetw_again: mov[si],ax ;對(duì)字單元操作 incsi ;SI指針加2 incsi loopw_again ;循環(huán) movcx,sizeoftarget
;匯編結(jié)果為movcx,0ah moval,'?' movdi,offsettargetb_again: mov[di],al ;對(duì)字節(jié)單元操作 incdi ;DI指針加1 loopb_again ;循環(huán)例題:屬性及其應(yīng)用-4/5 movsi,offsetta70例題:屬性及其應(yīng)用-5/5 movdx,offsetv_word ;顯示結(jié)果:1357?????????? movah,9 int21h .exit0 end例題:屬性及其應(yīng)用-5/5 movdx,offsetv_71三、程序段的定義和屬性詳述匯編語(yǔ)言程序格式的組成部分首先,簡(jiǎn)單了解DOS支持的exe程序和com程序其次,重點(diǎn)掌握簡(jiǎn)化段定義格式的各條偽指令最后,理解完整段定義格式所包含的各種段屬性三、程序段的定義和屬性詳述匯編語(yǔ)言程序格式的組成部分72exe程序利用程序開(kāi)發(fā)工具,通常將生成EXE結(jié)構(gòu)的可執(zhí)行程序(擴(kuò)展名為.EXE的文件)它可以有獨(dú)立的代碼、數(shù)據(jù)和堆棧段,還可以有多個(gè)代碼段或多個(gè)數(shù)據(jù)段,程序長(zhǎng)度可以超過(guò)64KB,執(zhí)行起始處可以任意指定當(dāng)DOS裝入或執(zhí)行一個(gè)程序時(shí),DOS確定當(dāng)時(shí)主存最低的可用地址作為該程序的裝入起始點(diǎn)。此點(diǎn)以下的區(qū)域稱(chēng)為程序段。在程序段內(nèi)偏移0處,DOS為該程序建立一個(gè)程序段前綴控制塊PSP(ProgramSegmentPrefix),它占256(=100h)個(gè)字節(jié);而在偏移100h處才裝入程序本身內(nèi)存映象exe程序利用程序開(kāi)發(fā)工具,通常將生成EXE結(jié)構(gòu)的可執(zhí)行程序73exe程序的內(nèi)存映象圖exe程序的內(nèi)存映象圖74com程序COM程序是一種將代碼、數(shù)據(jù)和堆棧段合一的結(jié)構(gòu)緊湊的程序,所有代碼、數(shù)據(jù)都在一個(gè)邏輯段內(nèi),不超過(guò)64KB在程序開(kāi)發(fā)時(shí),需要滿足一定要求并采用相應(yīng)參數(shù)才能正確生成COM結(jié)構(gòu)的程序COM文件存儲(chǔ)在磁盤(pán)上是主存的完全影象,不包含重新定位的加載信息,與EXE文件相比其加載速度更快,占用的磁盤(pán)空間也少盡管DOS也為COM程序建立程序段前綴PSP,但由于兩種文件結(jié)構(gòu)不同,所以加載到主存后各段設(shè)置并不完全一樣內(nèi)存映象com程序COM程序是一種將代碼、數(shù)據(jù)和堆棧段合一的結(jié)構(gòu)緊湊75com程序的內(nèi)存映象圖com程序的內(nèi)存映象圖76;SampleA.ASM
.modelsmall
.stack .data
... ;在數(shù)據(jù)段定義數(shù)據(jù)
.code
.startup
... ;在代碼段填入指令序列
.exit0
...
;子程序代碼
end簡(jiǎn)化段定義格式
MASM6.x支持;SampleA.ASM簡(jiǎn)化段定義格式
MASM6.x支77.MODEL存儲(chǔ)模式使用簡(jiǎn)化段定義,必須有存儲(chǔ)模式偽指令.model語(yǔ)句必須位于所有段定義語(yǔ)句之前存儲(chǔ)模式?jīng)Q定一個(gè)程序的規(guī)模,確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問(wèn)的缺省屬性MASM有7種不同的存儲(chǔ)模式:①TINY ②SMALL③COMPACT ④MEDIUM⑤LARGE ⑥HUGE⑦FLAT.MODEL存儲(chǔ)模式使用簡(jiǎn)化段定義,必須有存儲(chǔ)模式偽指令78TINY微型模式微型模式是MASM6.0才引入的用于創(chuàng)建COM類(lèi)型程序用微型模式編寫(xiě)匯編語(yǔ)言程序時(shí),所有的段地址寄存器都被設(shè)置為同一值這意味著代碼段、數(shù)據(jù)段、堆棧段都在同一個(gè)段內(nèi),不大于64KB;訪問(wèn)操作數(shù)或指令都只需要使用16位偏移地址TINY微型模式微型模式是MASM6.0才引入的79SMALL小型模式一般的程序(例如本書(shū)的絕大多數(shù)程序示例和習(xí)題)都可用這種模式在小型模式下,一個(gè)程序至多只能有一個(gè)代碼段和一個(gè)數(shù)據(jù)段,每段不大于64KB這里的數(shù)據(jù)段是指數(shù)據(jù)段、堆棧段和附加段的總和,它們共用同一個(gè)段基址,總長(zhǎng)度不可超過(guò)64KB;因此小模式下程序的最大長(zhǎng)度為128KB訪問(wèn)操作數(shù)或指令都只需要使用16位偏移地址;這意味著諸如指令轉(zhuǎn)移、程序調(diào)用以及數(shù)據(jù)訪問(wèn)等都是近屬性(NEAR),即小型模式下的調(diào)用類(lèi)型和數(shù)據(jù)指針缺省分別為近調(diào)用和近指針SMALL小型模式一般的程序(例如本書(shū)的絕大多數(shù)程序示例和習(xí)80COMPACT緊湊模式適合于數(shù)據(jù)量大但代碼量小的程序緊湊模式下,代碼段被限制在一個(gè)不大于64KB的段內(nèi);而數(shù)據(jù)段則可以有多個(gè),超過(guò)64KB這種模式下的調(diào)用類(lèi)型缺省仍為近調(diào)用;而數(shù)據(jù)指針缺省為遠(yuǎn)(FAR)指針,因?yàn)楸仨氂枚蔚刂穪?lái)區(qū)別多個(gè)數(shù)據(jù)段COMPACT緊湊模式適合于數(shù)據(jù)量大但代碼量小的程序81MEDIUM中型模式中型模式是與緊湊模式互補(bǔ)的模式適合于數(shù)據(jù)量小但代碼量大的程序中型模式的代碼段可以超過(guò)64KB,有多個(gè);但數(shù)據(jù)段只能有一個(gè)不大于64KB的段這種模式下的數(shù)據(jù)指針缺省為近指針;但調(diào)用類(lèi)型缺省是遠(yuǎn)(FAR)調(diào)用,因?yàn)橐枚蔚刂穮^(qū)別多個(gè)代碼段MEDIUM中型模式中型模式是與緊湊模式互補(bǔ)的模式82LARGE大型模式較大型程序通常采用的存儲(chǔ)模式大型模式允許的代碼段和數(shù)據(jù)段都有多個(gè),都可以超過(guò)64KB;但全部的靜態(tài)數(shù)據(jù)(不能改變的數(shù)據(jù))仍限制在64K字節(jié)內(nèi)大型模式下的調(diào)用類(lèi)型和數(shù)據(jù)指針缺省分別為遠(yuǎn)調(diào)用和遠(yuǎn)指針HUGE(巨型模式)與大型模式基本相同,只是靜態(tài)數(shù)據(jù)不再被限制在64K字節(jié)之內(nèi)LARGE大型模式較大型程序通常采用的存儲(chǔ)模式83FLAT平展模式平展模式用于創(chuàng)建一個(gè)32位的程序,它只能運(yùn)行在32位x86CPU上。DOS下不能使用FLAT模式,而編寫(xiě)32位Windows9.x或Windows-NT的程序時(shí),必須采用FLAT模式。DOS下編程可選擇前六種模式,一般可以選用SMALL模式TINY模式產(chǎn)生COM程序,其他模式產(chǎn)生EXE程序,F(xiàn)LAT模式只能用于32位程序FLAT平展模式平展模式用于創(chuàng)建一個(gè)32位的程序,84簡(jiǎn)化段定義偽指令.STACK[大小] ;堆棧段開(kāi)始.DATA ;數(shù)據(jù)段開(kāi)始.CODE[段名] ;代碼段開(kāi)始簡(jiǎn)化段定義偽指令指明一個(gè)邏輯段的開(kāi)始,同時(shí)自動(dòng)結(jié)束前面的一個(gè)段采用簡(jiǎn)化段定義偽指令前,需有.model語(yǔ)句使用簡(jiǎn)化段定義,各段名稱(chēng)和其他用戶所需的信息可以使用MASM預(yù)定義符號(hào),例如:@data表示由.data等定義的數(shù)據(jù)段的段名簡(jiǎn)化段定義偽指令.STACK[大小] ;堆棧段開(kāi)始簡(jiǎn)化段定85堆棧段偽指令.STACK[大小]堆棧段偽指令.STACK創(chuàng)建一個(gè)堆棧段,段名是:stack它的參數(shù)指定堆棧段所占存儲(chǔ)區(qū)的字節(jié)數(shù),默認(rèn)是1KB(=1024=400h字節(jié))堆棧段偽指令.STACK[大小]86數(shù)據(jù)段偽指令.DATA數(shù)據(jù)段偽指令.data創(chuàng)建一個(gè)數(shù)據(jù)段,段名是:_DATA。它用于定義具有初值的變量,當(dāng)然也允許定義無(wú)初值的變量無(wú)初值變量可以安排在另一個(gè)段中,它用.data?偽指令創(chuàng)建,數(shù)據(jù)段名是:_BSS.const偽指令用于建立只讀的常量數(shù)據(jù)段(段名:CONST)數(shù)據(jù)段偽指令.DATA87代碼段偽指令.CODE[段名]代碼段偽指令.code創(chuàng)建一個(gè)代碼段,它的參數(shù)指定該代碼段的段名如果沒(méi)有給出段名,則采用默認(rèn)段名:在TINY、SMALL、COMPACT和FLAT模式下,默認(rèn)的代碼段名是:_TEXT在MEDIUM、LARGE和HUGE模式下,默認(rèn)的代碼段名是:模塊名_TEXT代碼段偽指令.CODE[段名]88程序開(kāi)始偽指令.STARTUP按照CPU類(lèi)型、存儲(chǔ)模式、操作系統(tǒng)和堆棧類(lèi)型,產(chǎn)生程序開(kāi)始執(zhí)行的代碼;同時(shí)還指定程序開(kāi)始執(zhí)行的起始點(diǎn)在DOS下,還將設(shè)置DS值,調(diào)整SS和SP值movdx,dgroupmovds,dx ;設(shè)置DSmovbx,sssubbx,dxshlbx,1shlbx,1shlbx,1shlbx,1cli ;關(guān)中斷movss,dx ;調(diào)整SS和SPaddsp,bxsti ;開(kāi)中斷movdx,@datamovds,dx 程序開(kāi)始偽指令.STARTUP按照CPU類(lèi)型、存儲(chǔ)模式、操作89程序終止偽指令.EXIT[返回參數(shù)]產(chǎn)生終止程序執(zhí)行返回操作系統(tǒng)的指令代碼它的可選參數(shù)是一個(gè)返回的數(shù)碼,通常用0表示沒(méi)有錯(cuò)誤。例如.exit0對(duì)應(yīng)的代碼是:movax,4c00hint21hDOS功能調(diào)用的4ch子功能(返回DOS):入口參數(shù):AH=4ch,AL=返回?cái)?shù)碼程序終止偽指令.EXIT[返回參數(shù)]產(chǎn)生終止程序執(zhí)行返回操90匯編結(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值采用了.startup偽指令就不需要再用“end標(biāo)號(hào)”指明開(kāi)始執(zhí)行點(diǎn),但還要有end偽指令
————千萬(wàn)注意————程序終止和匯編結(jié)束是兩碼事匯編結(jié)束偽指令END[標(biāo)號(hào)]指示匯編程序MASM到此結(jié)束匯91com程序的編寫(xiě)利用MASM6.x的簡(jiǎn)化段定義格式,可以非常容易地創(chuàng)建一個(gè)COM程序遵循的規(guī)則:采用TINY模式源程序只設(shè)置代碼段,無(wú)數(shù)據(jù)、堆棧等段程序必須從偏移地址100h處開(kāi)始執(zhí)行數(shù)據(jù)只能安排在代碼段中,注意不能與可執(zhí)行代碼相沖突,通常在程序最后實(shí)例com程序的編寫(xiě)利用MASM6.x的簡(jiǎn)化段定義格式,可以非92 .modeltiny ;微型存儲(chǔ)模式 .code ;只有代碼段 .startup ;程序起始點(diǎn),=ORG100H movdx,offsetstring movah,9 ;顯示信息 int21h
movah,01h ;等待按鍵 int21h movah,02h ;響鈴 movdl,07h int21h .exit0 ;程序結(jié)束點(diǎn),返回DOSstring db‘Pressanykeytocontinue!$’
;數(shù)據(jù)安排在此 end ;匯編結(jié)束例4:com程序抽象 .modeltiny ;微型存儲(chǔ)模式例4:com程序抽象93完整段定義偽指令段名 segment 定位組合段字'類(lèi)別' ... ;語(yǔ)句序列段名 ends完整段定義由SEGMENT和ENDS這一對(duì)偽指令實(shí)現(xiàn),SEGMENT偽指令定義一個(gè)邏輯段的開(kāi)始,ENDS偽指令表示一個(gè)段的結(jié)束段定義指令后的4個(gè)關(guān)鍵字用于確定段的各種屬性,堆棧段要采用stack組合類(lèi)型,代碼段應(yīng)具有‘code’類(lèi)別,其他為可選屬性參數(shù)如果不指定,則采用默認(rèn)參數(shù);但如果指定,注意要按照上列次序完整段定義偽指令段名 segment 定位組合段字94教學(xué)重點(diǎn)學(xué)習(xí)了8086硬指令,接著介紹MASM基本的偽指令。重點(diǎn)掌握:程序的格式、開(kāi)發(fā)方法參數(shù)的表達(dá)、變量的定義變量和標(biāo)號(hào)的屬性教學(xué)重點(diǎn)學(xué)習(xí)了8086硬指令,接著介紹MASM基本的偽指令。95硬指令和偽指令硬指令——使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的語(yǔ)句,就是我們剛剛學(xué)習(xí)的處理器指令偽指令(Directive)——不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說(shuō)明性語(yǔ)句,例如,數(shù)據(jù)說(shuō)明、變量定義等等偽指令與具體的處理器類(lèi)型無(wú)關(guān),但與匯編程序的版本有關(guān)
本課程采用微軟宏匯編程序MASM6.11硬指令和偽指令硬指令——使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處96匯編語(yǔ)言程序的開(kāi)發(fā)本節(jié)從匯編語(yǔ)言程序的語(yǔ)句格式出發(fā),給出第一個(gè)示范性的匯編語(yǔ)言源程序,并演示匯編語(yǔ)言程序的過(guò)程:編輯匯編連接調(diào)試即匯編語(yǔ)言程序的開(kāi)發(fā)方法匯編語(yǔ)言程序的開(kāi)發(fā)本節(jié)從匯編語(yǔ)言程序的語(yǔ)句格式出發(fā),給出第一97語(yǔ)句格式⑴執(zhí)行性語(yǔ)句——由硬指令構(gòu)成的語(yǔ)句,它通常對(duì)應(yīng)一條機(jī)器指令,出現(xiàn)在程序的代碼段中:標(biāo)號(hào):硬指令助記符操作數(shù),操作數(shù) ;注釋⑵說(shuō)明性語(yǔ)句——由偽指令構(gòu)成的語(yǔ)句,它通常指示匯編程序如何匯編源程序:名字偽指令助記符參數(shù),參數(shù),… ;注釋語(yǔ)句格式⑴執(zhí)行性語(yǔ)句——由硬指令構(gòu)成的語(yǔ)句,它通常對(duì)應(yīng)一條98 MOVCX,0 ;傳送指令,具有2個(gè)操作數(shù)DELAY: NOP ;空操作指令,沒(méi)有操作數(shù),帶有標(biāo)號(hào) LOOPDELAY ;循環(huán)指令,標(biāo)號(hào)DELAY說(shuō)明轉(zhuǎn)移位置BUFFER DB1,2,3,4,5,6,7
;數(shù)據(jù)定義偽指令,在主存中開(kāi)辟7個(gè)連續(xù)的字節(jié)單元,初值依次為1~7,BUFFER表示首地址匯編語(yǔ)言語(yǔ)句實(shí)例 MOVCX,0 ;傳送指令,具有2個(gè)操作數(shù)匯編語(yǔ)言語(yǔ)句實(shí)99標(biāo)號(hào)、名字與標(biāo)識(shí)符標(biāo)號(hào)是反映硬指令位置(邏輯地址)的標(biāo)識(shí)符,后跟一個(gè)冒號(hào)分隔名字是反映偽指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟空格或制表符分隔,沒(méi)有一個(gè)冒號(hào)標(biāo)識(shí)符(Identifier)一般最多由31個(gè)字母、數(shù)字及規(guī)定的特殊符號(hào)(如_、$、?、@)組成,不能以數(shù)字開(kāi)頭。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識(shí)符中的字母大小寫(xiě)一個(gè)程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,還不能是匯編語(yǔ)言采用的保留字標(biāo)號(hào)、名字與標(biāo)識(shí)符標(biāo)號(hào)是反映硬指令位置(邏輯地址)的標(biāo)識(shí)符,100保留字保留字(ReservedWord)是匯編程序已經(jīng)利用的標(biāo)識(shí)符,主要有:硬指令助記符——例如:MOV、ADD偽指令助記符——例如:DB、EQU操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS預(yù)定義符號(hào)——例如:@data保留字保留字(ReservedWord)是匯編程序已經(jīng)利用101助記符硬指令助記符可以是任何一條處理器指令,也可以是一條宏指令偽指令助記符將在本節(jié)學(xué)習(xí)定義字節(jié)數(shù)據(jù)和字符串的DB就是偽指令助記符硬指令助記符可以是任何一條處理器指令,也可以是一條宏指102操作數(shù)與參數(shù)處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲(chǔ)單元偽指令的參數(shù)可以是常數(shù)、變量名、表達(dá)式等,可以有多個(gè),參數(shù)之間用逗號(hào)分隔操作數(shù)與參數(shù)處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲(chǔ)單元103注釋語(yǔ)句中由分號(hào)“;”開(kāi)始的部分為注釋內(nèi)容,用以增加源程序的可讀性必要時(shí),一個(gè)語(yǔ)句行也可以由分號(hào)開(kāi)始作為階段性注釋匯編程序在翻譯源程序時(shí)將跳過(guò)該部分,不對(duì)它們做任何處理注釋語(yǔ)句中由分號(hào)“;”開(kāi)始的部分為注釋內(nèi)容,用以增加源程序的104分隔符語(yǔ)句的4個(gè)組成部分要用分隔符分開(kāi)標(biāo)號(hào)后用冒號(hào),注釋前用分號(hào)操作數(shù)之間和參數(shù)之間使用逗號(hào)分隔其他部分通常采用空格或制表符多個(gè)空格和制表符的作用與一個(gè)相同MASM支持續(xù)行符“\”分隔符語(yǔ)句的4個(gè)組成部分要用分隔符分開(kāi)105匯編語(yǔ)言源程序的組成原則完整的匯編語(yǔ)言源程序由段組成一個(gè)匯編語(yǔ)言源程序可以包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列需獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段,并指示程序執(zhí)行的起始點(diǎn),一個(gè)程序只有一個(gè)起始點(diǎn)所有的可執(zhí)行性語(yǔ)句必須位于某一個(gè)代碼段內(nèi),說(shuō)明性語(yǔ)句可根據(jù)需要位于任一段內(nèi)通常,程序還需要一個(gè)堆棧段匯編語(yǔ)言源程序的組成原則完整的匯編語(yǔ)言源程序由段組成106匯編語(yǔ)言源程序源程序分別用兩種格式書(shū)寫(xiě)第一種格式從MASM5.0開(kāi)始支持簡(jiǎn)化段定義格式第二種格式MASM5.0以前就具有完整段定義格式Hello,Everybody!程序功能匯編語(yǔ)言源程序源程序分別用兩種格式書(shū)寫(xiě)Hello,Ever107;test1.asm(文件名) .modelsmall ;定義程序的存儲(chǔ)模式 .stack ;定義堆棧段 .data ;定義數(shù)據(jù)段string db’Hello,Everybody!’,0dh,0ah,’$’
;在數(shù)據(jù)段定義要顯示的字符串 .code ;定義代碼段 .startup ;程序起始點(diǎn),建立DS、SS
movdx,offsetstring
;指定字符串
movah,9 int21h
;利用功能調(diào)用顯示信息 .exit0 ;程序結(jié)束點(diǎn),返回DOS end ;匯編結(jié)束例1a:簡(jiǎn)化段定義格式抽象;test1.asm(文件名)例1a:簡(jiǎn)化段定義格式抽象108;SampleA.ASM .modelsmall .stack .data
... ;在數(shù)據(jù)段定義數(shù)據(jù) .code .startup ;(注1)
... ;在代碼段填入指令序列 .exit0 ;(注2)
...
;子程序代碼 end ;(注3)簡(jiǎn)化段定義格式
MASM6.x支持;SampleA.ASM簡(jiǎn)化段定義格式
MASM6.x支109;test2.asm(文件名)stack segmentstack ;定義堆棧段 dw512dup(?) ;堆棧段有512字(1024字節(jié))空間stack ends ;堆棧段結(jié)束data segment ;定義數(shù)據(jù)段string db’Hello,Everybody!’,0dh,0ah,’$’data endscode segment’code’ ;定義代碼段 assumecs:code,ds:data,ss:stackstart: movax,data ;建立DS段地址 movds,ax例1b:完整段定義格式;test2.asm(文件名)例1b:完整段定義格式110 movdx,offsetstring movah,9 int21h movax,4c00h int21h ;利用功能調(diào)用返回DOScode ends ;代碼段結(jié)束 endstart ;匯編結(jié)束,同時(shí)指明程序起始點(diǎn)例1b:完整段定義格式抽象 movdx,offsetstring例1b:完整段定義111匯編語(yǔ)言程序的開(kāi)發(fā)過(guò)程編輯文本編輯器,如EDIT.COM源程序:文件名.asm匯編匯編程序,如ML.EXE目標(biāo)模塊:文件名.obj連接連接程序,如LINK.EXE可執(zhí)行文件:文件名.exe調(diào)試調(diào)試程序,如DEBUG.EXE應(yīng)用程序錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤匯編語(yǔ)言程序的開(kāi)發(fā)過(guò)程編輯文本編輯器,如EDIT.COM源112開(kāi)發(fā)過(guò)程1:源程序的編輯源程序文件要以ASM為擴(kuò)展名源程序文件的形成(編輯)可以通過(guò)任何一個(gè)文本編輯器實(shí)現(xiàn):DOS中的全屏幕文本編輯器EDIT其他程序開(kāi)發(fā)工具中的編輯環(huán)境MASM程序員工作平臺(tái)PWB中的編輯環(huán)境EDITtest1.asm開(kāi)發(fā)過(guò)程1:源程序的編輯源程序文件要以ASM為擴(kuò)展名113開(kāi)發(fā)過(guò)程2:源程序的匯編匯編是將源程序翻譯成由機(jī)器代碼組成的目標(biāo)模塊文件的過(guò)程MASM6.x提供的匯編程序是ML.EXE:ML/ctest1.asm如果源程序中沒(méi)有語(yǔ)法錯(cuò)誤,MASM將自動(dòng)生成一個(gè)目標(biāo)模塊文件(TEST1.obj);否則MASM將給出相應(yīng)的錯(cuò)誤信息這時(shí)應(yīng)根據(jù)錯(cuò)誤信息,重新編輯修改源程序后,再進(jìn)行匯編開(kāi)發(fā)過(guò)程2:源程序的匯編匯編是將源程序翻譯成由機(jī)器代碼組成的114開(kāi)發(fā)過(guò)程3:目標(biāo)模塊的連接連接程序能把一個(gè)或多個(gè)目標(biāo)文件和庫(kù)文件合成一個(gè)可執(zhí)行程序(.EXE、.COM文件):LINKtest1.obj如果沒(méi)有嚴(yán)重錯(cuò)誤,LINK將生成一個(gè)可執(zhí)行文件(test1.exe);否則將提示相應(yīng)的錯(cuò)誤信息這時(shí)需要根據(jù)錯(cuò)誤信息重新修改源程序后再匯編、鏈接,直到生成可執(zhí)行文件開(kāi)發(fā)過(guò)程3:目標(biāo)模塊的連接連接程序能把一個(gè)或多個(gè)目標(biāo)文件和庫(kù)115匯編和連接的依次自動(dòng)實(shí)現(xiàn)ML匯編程序可自動(dòng)調(diào)用LINK連接程序,實(shí)現(xiàn)匯編和連接的依次進(jìn)行MLtest1.asm匯編程序ML.EXE可帶其他參數(shù),常用ML/Fl/Sgtest1.asm該命令除產(chǎn)生模塊文件test1.obj和可執(zhí)行文件test1.exe外,還將生成列表文件test1.lst列表文件是一種文本文件,含有源程序和目標(biāo)代碼,對(duì)我們學(xué)習(xí)匯編語(yǔ)言程序設(shè)計(jì)和發(fā)現(xiàn)錯(cuò)誤很有用。采用/Sg選項(xiàng),將在列表文件中得到有些偽指令相應(yīng)的硬指令匯編和連接的依次自動(dòng)實(shí)現(xiàn)ML匯編程序可自動(dòng)調(diào)用LINK連接程116開(kāi)發(fā)過(guò)程4:可執(zhí)行程序的調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運(yùn)行:test1操作系統(tǒng)裝載該文件進(jìn)入主存,并開(kāi)始運(yùn)行如果出現(xiàn)運(yùn)行錯(cuò)誤,可以從源程序開(kāi)始排錯(cuò),也可以利用調(diào)試程序幫助發(fā)現(xiàn)錯(cuò)誤采用DEBUG.EXE調(diào)試程序:
DEBUGtest1.exe開(kāi)發(fā)過(guò)程4:可執(zhí)行程序的調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程序在操1172.3.1參數(shù)、變量和標(biāo)號(hào)詳細(xì)討論匯編語(yǔ)言程序語(yǔ)句主要部分參數(shù)變量名標(biāo)號(hào)并引出相關(guān)的偽指令和操作符本節(jié)重點(diǎn)掌握:常數(shù)的表達(dá)、變量定義偽指令DB/DW/DD、地址操作符和類(lèi)型操作符2.3.1參數(shù)、變量和標(biāo)號(hào)詳細(xì)討論匯編語(yǔ)言程序語(yǔ)句主要部118一、數(shù)值型參數(shù)在源程序語(yǔ)句格式的4個(gè)組成部分中,參數(shù)是指令的操作對(duì)象(在學(xué)習(xí)硬指令時(shí)被稱(chēng)為操作數(shù)),參數(shù)之間用逗號(hào)分隔參數(shù)根據(jù)指令不同可以沒(méi)有,可以有1個(gè)、2個(gè)或多個(gè)匯編語(yǔ)言程序中,指令參數(shù)有數(shù)值型,它的主要形式是常數(shù)和數(shù)值表達(dá)式;硬指令的操作數(shù)有立即數(shù);立即數(shù)就要用數(shù)值型參數(shù)表達(dá)一、數(shù)值型參數(shù)在源程序語(yǔ)句格式的4個(gè)組成部分中,參數(shù)是指令的1191、常數(shù)常數(shù)(常量)表示一個(gè)固定的數(shù)值它又分成多種形式:(1)十進(jìn)制常數(shù)(2)十六進(jìn)制常數(shù)(3)二進(jìn)制常數(shù)(4)八進(jìn)制常數(shù)(5)字符串常數(shù)(6)符號(hào)常數(shù)1、常數(shù)常數(shù)(常量)表示一個(gè)固定的數(shù)值120十進(jìn)制常數(shù)由0~9數(shù)字組成,以字母D或d結(jié)尾缺省情況下,后綴D或d可以省略匯編語(yǔ)言大小寫(xiě)不敏感,D和d通用例如:100、255D十進(jìn)制常數(shù)由0~9數(shù)字組成,以字母D或d結(jié)尾121十六進(jìn)制常數(shù)由0~9、A~F組成,以字母H或h結(jié)尾以字母A~F開(kāi)頭的十六進(jìn)制數(shù),前面要用0表達(dá),以避免與其他符號(hào)混淆匯編語(yǔ)言大小寫(xiě)不敏感,H和h通用例如:64H、0FFh、0B800H十六進(jìn)制常數(shù)由0~9、A~F組成,以字母H或h結(jié)尾122二進(jìn)制常數(shù)由0或1兩個(gè)數(shù)字組成,以字母B或b結(jié)尾匯編語(yǔ)言大小寫(xiě)不敏感,B和b通用例如:01101100B二進(jìn)制常數(shù)由0或1兩個(gè)數(shù)字組成,以字母B或b結(jié)尾123八進(jìn)制常數(shù)由0~7數(shù)字組成,以字母Q或q結(jié)尾匯編語(yǔ)言大小寫(xiě)不敏感,Q和q通用例如:144Q各種進(jìn)制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù)MASM提供基數(shù)控制.RADIX偽指令可以改變默認(rèn)進(jìn)制,其格式是: .RADIXn八進(jìn)制常數(shù)由0~7數(shù)字組成,以字母Q或q結(jié)尾124字符串常數(shù)用單引號(hào)或雙引號(hào)括起來(lái)的單個(gè)字符或多個(gè)字符,其數(shù)值是每個(gè)字符對(duì)應(yīng)的ASCII碼的值例如:'d'=64H'AB'=4142H'Hello,Everybody!'字符串常數(shù)用單引號(hào)或雙引號(hào)括起來(lái)的單個(gè)字符或多個(gè)字符,其數(shù)值125符號(hào)常數(shù)利用一個(gè)標(biāo)識(shí)符表達(dá)的一個(gè)數(shù)值MASM提供等價(jià)機(jī)制,用于常量定義符號(hào)定義偽指令:等價(jià)EQU偽指令符號(hào)名EQU數(shù)值表達(dá)式符號(hào)名EQU<字符串>等號(hào)=偽指令符號(hào)名=數(shù)值表達(dá)式常數(shù)若使用有意義的符號(hào)名來(lái)表示,可以提高程序的可讀性,同時(shí)更具有通用性實(shí)例符號(hào)常數(shù)利用一個(gè)標(biāo)識(shí)符表達(dá)的一個(gè)數(shù)值實(shí)例1262、數(shù)值表達(dá)式數(shù)值表達(dá)式一般是指由運(yùn)算符連接的各種常數(shù)所構(gòu)成的表達(dá)式匯編程序在匯編過(guò)程中計(jì)算表達(dá)式,最終得到一個(gè)數(shù)值程序運(yùn)行之前,就已經(jīng)計(jì)算出了表達(dá)式;所以,程序運(yùn)行速度沒(méi)有變慢,但增強(qiáng)程序的可讀性MASM對(duì)除偽指令外各種匯編時(shí)處理的指令統(tǒng)稱(chēng)為操作符(Operator)2、數(shù)值表達(dá)式數(shù)值表達(dá)式一般是指由運(yùn)算符連接的各種常數(shù)所構(gòu)成127運(yùn)算符算術(shù)運(yùn)算符+
-
*
/MOD邏輯運(yùn)算符ANDORXORNOT移位運(yùn)算符SHLSHR關(guān)系運(yùn)算符EQNEGTLTGELE高低分離符HIGHLOWHIGHWORDLOWWORD運(yùn)算符算術(shù)運(yùn)算符128算術(shù)運(yùn)算符實(shí)現(xiàn)加、減、乘、除、取余的算術(shù)運(yùn)算movax,3*4+5 ;等價(jià)于movax,17其中MOD也稱(chēng)為取模,它產(chǎn)生除法之后的余數(shù),如19mod7=5加+和減-運(yùn)算符還可以用于地址表達(dá)式除加、減外,其他運(yùn)算符的參數(shù)必須是整數(shù)算術(shù)運(yùn)算符實(shí)現(xiàn)加、減、乘、除、取余的算術(shù)運(yùn)算129邏輯運(yùn)算符實(shí)現(xiàn)按位相與、相或、異或、求反的邏輯運(yùn)算oral,03hAND45h;等價(jià)于oral,01h邏輯運(yùn)算符實(shí)現(xiàn)按位相與、相或、異或、求反的邏輯運(yùn)算130移位運(yùn)算符實(shí)現(xiàn)對(duì)數(shù)值的左移、右移的邏輯操作;移入低位或高位的是0格式為:數(shù)值表達(dá)式SHL/SHR移位次數(shù)moval,0101bSHL(2*2);等價(jià)于moval,01010000b移位運(yùn)算符實(shí)現(xiàn)對(duì)數(shù)值的左移、右移的邏輯操作;移入低位或高位的131關(guān)系運(yùn)算符用于比較和測(cè)試符號(hào)數(shù)值MASM用0FFFFH(補(bǔ)碼-1)表示條件為真MASM用0000H表示條件為假movbx,((PORTLT5)AND20)OR((PORTGE5)AND30);當(dāng)PORT<5時(shí),匯編結(jié)果為movbx,20;否則,匯編結(jié)果為movbx,30關(guān)系運(yùn)算符用于比較和測(cè)試符號(hào)數(shù)值132高低分離符取數(shù)值的高半部分或低半部分HIGH、LOW從一個(gè)字?jǐn)?shù)值或符號(hào)常量中得到高、低字節(jié)movah,HIGH8765h ;等價(jià)于movah,87h從MASM6.0引入的HIGHWORD、LOWWORD取一個(gè)符號(hào)常量(不能是其他常數(shù))的高字或低字部分dd_valueequ0ffff1234h ;定義一個(gè)符號(hào)常量movax,LOWWORDdd_value ;等價(jià)于movax,1234h高低分離符取數(shù)值的高半部分或低半部分133操作符的優(yōu)先級(jí)1 ()<>[]·LENGTHSIZEWIDTHMASK2 PTROFFSETSEGTPYETHIS:3 HIGELOW4 */MODSHLSHR5 +-6 EQNEGTLTGELE7 NOT8 AND9 ORXOR10 SHORT
建議采用圓括號(hào)“()”顯式表達(dá),它可以極大地提高程序的可閱讀性操作符的優(yōu)先級(jí)1 ()<>[]·LENGT134地址型參數(shù)匯編語(yǔ)言程序中,指令參數(shù)還有地址型,它的主要形式是標(biāo)號(hào)和名字(變量名、段名、過(guò)程名等)硬指令的操作數(shù)有存儲(chǔ)單元;存儲(chǔ)單元就應(yīng)該用地址型參數(shù)(存儲(chǔ)器操作數(shù))表達(dá)地址型參數(shù)匯編語(yǔ)言程序中,指令參數(shù)還有地址型,它的主要形式是135二、變量定義偽指令變量定義(Define)偽指令為變量申請(qǐng)固定長(zhǎng)度的存儲(chǔ)空間,并可同時(shí)將相應(yīng)的存儲(chǔ)單元初始化變量名偽指令助記符初值表
變量定義偽指令最常使用二、變量定義偽指令變量定義(Define)偽指令為變量申請(qǐng)固136變量名變量名為用戶自定義標(biāo)識(shí)符,表示初值表首元素的邏輯地址;用這個(gè)符號(hào)表示地址,常稱(chēng)為符號(hào)地址變量名可以沒(méi)有。這種情況,匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g,無(wú)符號(hào)地址設(shè)置變量名是為了方便存取它指示的存儲(chǔ)單元變量名變量名為用戶自定義標(biāo)識(shí)符,表示初值表首元素的邏輯地址;137初值表初值表是用逗號(hào)分隔的參數(shù)主要由數(shù)值常數(shù)、表達(dá)式或?、DUP組成?——表示初值不確定,即未賦初值;DUP——表示重復(fù)初值DUP的格式為:重復(fù)次數(shù)DUP(重復(fù)參數(shù))初值表初值表是用逗號(hào)分隔的參數(shù)138變量定義偽指令助記符變量定義偽指令根據(jù)申請(qǐng)的主存空間單位分類(lèi)DB——定義字節(jié)偽指令DW——定義字偽指令DD——定義雙字偽指令DF——定義3字偽指令DQ——定義4字偽指令DT——定義10字節(jié)偽指令還有定位偽指令變量定義偽指令助記符變量定義偽指令根據(jù)申請(qǐng)的主存空間單位分類(lèi)139定義字節(jié)單元偽指令DBDB偽指令用于分配一個(gè)或多個(gè)字節(jié)單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)一定是字節(jié)量(Byte),存放一個(gè)8位數(shù)據(jù):可以是0~255的無(wú)符號(hào)數(shù)或是-128~+127帶符號(hào)數(shù)也可以是字符串常數(shù)實(shí)例定義字節(jié)單元偽指令DBDB偽指令用于分配一個(gè)或多個(gè)字節(jié)單元,140data segment ;數(shù)據(jù)段X db'a',-5 db2dup(100),?Y db'ABC'data ends字節(jié)單元定義實(shí)例應(yīng)用data segment ;數(shù)據(jù)段字節(jié)單元定義實(shí)例應(yīng)用141moval,X;此處X表示它的第1個(gè)數(shù)據(jù),故AL←'a'decX+1;對(duì)X為始的第2個(gè)數(shù)據(jù)減1,故成為-6movY,al;現(xiàn)在Y這個(gè)字符串成為'aBC'字節(jié)變量的應(yīng)用moval,X字節(jié)變量的應(yīng)用142定義字單元偽指令DWDW偽指令用于分配一個(gè)或多個(gè)字單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)一定是字量(Word),一個(gè)字單元可用于存放任何16位數(shù)據(jù):一個(gè)段地址一個(gè)偏移地址兩個(gè)字符0~65535之間的無(wú)符號(hào)數(shù)-32768~+32767之間的帶符號(hào)數(shù)實(shí)例定義字單元偽指令DWDW偽指令用于分配一個(gè)或多個(gè)字單元,并可143data segment ;數(shù)據(jù)段count dw8000h,?,'AB'maxint equ64hnumber dwmaxintarray dwmaxintdup(0)data ends字單元定義實(shí)例data segment ;數(shù)據(jù)段字單元定義實(shí)例144字變量和字常量的定義:WNUM EQU5678H ;定義WNUM為常量COUNT DW20H;定義COUNT變量,假設(shè)在數(shù)據(jù)段的偏移地址為10H字變量和字常量的應(yīng)用:MOVAX,[BX+SI+WNUM] ;MOVAX,[BX+SI+5678H]MOVAX,COUNT ;MOVAX,[0010H]MOVAX,[SI+COUNT] ;MOVAX,COUNT[SI] ;MOVAX,[SI+10H]LEABX,COUNT ;LEABX,[0010H]MOVBX,OFFSETCOUNT ;MOVBX,0010H字變量和字常量字變量和字常量的定義:字變量和字常量145定義雙字單元偽指令DDDD偽指令用于分配一個(gè)或多個(gè)雙字單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)是一個(gè)32位的雙字量(DoubleWord):可以是有符號(hào)或無(wú)符號(hào)的32位整數(shù)也可以用來(lái)表達(dá)16位段地址(高位字)和16位的偏移地址(低位字)的遠(yuǎn)指針vardd DD0,?,12345678hfarpoint DD00400078h定義雙字單元偽指令DDDD偽指令用于分配一個(gè)或多個(gè)雙字單元,146其他數(shù)據(jù)單元定義偽指令定義3字偽指令DF——用于為一個(gè)或多個(gè)6字節(jié)變量分配空間及初始化6字節(jié)常用在32位CPU中表示一個(gè)48位遠(yuǎn)指針(16位段選擇器:32位偏移地址)定義4字偽指令DQ——用于為一個(gè)或多個(gè)8字節(jié)變量分配空間及初始化8字節(jié)變量可以表達(dá)一個(gè)64位整數(shù)定義10字節(jié)偽指令DT——用于為一個(gè)或多個(gè)10字節(jié)變量分配空間及初始化10字節(jié)變量可以表達(dá)擴(kuò)展精度浮點(diǎn)數(shù)其他數(shù)據(jù)單元定義偽指令定義3字偽指令DF——用于為一個(gè)或多個(gè)147例2:數(shù)據(jù)定義綜合應(yīng)用-1/2 .modelsmall .stack .databvar DB16wvar DW4*3dvar DD4294967295 ;=232-1qvar DQ?
DB1,2,3,4,5tvar DT2345 ;定義了BCD碼2345Habc DB'a','b','c'msg DB'Hello',13,10,'$'bbuf DB12DUP('month')dbuf DD25DUP(?)CALLDOS EQU<int21h>例2:數(shù)據(jù)定義綜合應(yīng)用-1/2 .modelsmall148例2:數(shù)據(jù)定義綜合應(yīng)用-2/2 .code .startup movbl,bvar movax,wordptrdvar[0] movdx,wordptrdvar[2] ;取雙字到DX.AX movdx,offsetmsg movah,09h CALLDOS .exit0 end例2:數(shù)據(jù)定義綜合應(yīng)用-2/2 .code149例3:數(shù)據(jù)復(fù)制和顯示-1/2 .modelsmall .stack .datasourcedb33h,34h,35h,36h ;定義4個(gè)字符數(shù)據(jù)targetdb80dup(?) ;分配數(shù)據(jù)空間4×20=80 .code .startup movax,ds moves,ax ;data也作為附加段 cld movsi,offsetsource movdi,offsettarget movcx,80例3:數(shù)據(jù)復(fù)制和顯示-1/2 .modelsmall150例3:數(shù)據(jù)復(fù)制和顯示-2/2
repmovsb
;串傳送 movsi,0 ;顯示 movbx,offsettargetagain: movdl,[bx+si] movah,2 int21h incsi cmpsi,80 jbagain .exit0 end例3:數(shù)據(jù)復(fù)制和顯示-2/2 repmovsb ;串傳送151定位偽指令定位偽指令控制數(shù)據(jù)的偏移地址
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中等教育的學(xué)生心理與社交技能考核試卷
- 地鐵施工技術(shù)施工重難點(diǎn)及采取的方案措施考核試卷
- 化學(xué)纖維制造中的綠色生產(chǎn)與循環(huán)經(jīng)濟(jì)策略考核試卷
- 林木育種中的抗鹽堿性育種考核試卷
- 水利工程在城市防澇系統(tǒng)中的意義考核試卷
- 南京信息工程大學(xué)《外國(guó)文學(xué)史Ⅰ(2)》2022-2023學(xué)年第一學(xué)期期末試卷
- 家用紡織品的生產(chǎn)工藝與質(zhì)量控制考核試卷
- 南京信息工程大學(xué)《數(shù)字圖像處理與安全》2023-2024學(xué)年期末試卷
- 合成材料在塑料包裝制品制造中的應(yīng)用與發(fā)展考核試卷
- 發(fā)動(dòng)機(jī)廢氣處理與凈化技術(shù)考核試卷
- 【管理】朗誦《我驕傲-我是中國(guó)人》匯編課件
- 點(diǎn)估計(jì)的評(píng)價(jià)標(biāo)準(zhǔn)
- 全國(guó)導(dǎo)游基礎(chǔ)知識(shí)-中國(guó)四大宗教-佛教
- 內(nèi)部控制案例第07章案例20 華為內(nèi)控
- 深化設(shè)計(jì)方案(完整版)
- 廈門(mén)大學(xué)《細(xì)胞生物學(xué)》期末試題及答案
- 假天獅傳銷(xiāo)課程
- 膽管癌的CT診斷與鑒別診斷知識(shí)ppt
- SJG 77-2020 房屋建筑工程造價(jià)文件分部分項(xiàng)和措施項(xiàng)目劃分標(biāo)準(zhǔn)-高清現(xiàn)行
- 水平四(九年級(jí))體育《耐力跑》教學(xué)設(shè)計(jì)及教案
- 《化學(xué)反應(yīng)工程》課件第二章 氣-固相催化反應(yīng)本征及宏觀動(dòng)力學(xué)(簡(jiǎn)明)
評(píng)論
0/150
提交評(píng)論