微型計算機技術(shù):第4章 匯編語言程序設(shè)計_第1頁
微型計算機技術(shù):第4章 匯編語言程序設(shè)計_第2頁
微型計算機技術(shù):第4章 匯編語言程序設(shè)計_第3頁
微型計算機技術(shù):第4章 匯編語言程序設(shè)計_第4頁
微型計算機技術(shù):第4章 匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1

微型計算機技術(shù)

第4章匯編語言程序設(shè)計2第一節(jié)匯編語言上機過程第二節(jié)匯編語言程序結(jié)構(gòu)第三節(jié)指示性語句第四節(jié)匯編語言程序舉例第五節(jié)匯編語言程序設(shè)計3上機環(huán)境硬件系統(tǒng)軟件

應(yīng)用軟件

操作系統(tǒng):DOS系統(tǒng)編輯器:

EDIT.exe匯編編譯程序:MASM.exe連接程序:LINK.exe調(diào)試程序:DEBUG.exe用戶開發(fā)的程序:ABC.exe等CPU、存儲器(ROM、RAM)、I/O接口、輸入、輸出設(shè)備4第一節(jié)匯編語言上機過程D:>EDITABC.asmD:>MASMABC;

有語法錯,回EDIT下改該程序D:>LINKABC;

有錯,回在EDIT下改程序D:>ABC

運行結(jié)果錯,回EDIT下改程序或在DEBUG下調(diào)試,找原因。D:>DEBUGABC.exe編輯源程序

EDITABC.ASM匯編源程序

MASM

ABC.ASM形成目標程序ABC.OBJ連接目標程序

LINKABC.OBJ有連接錯誤信息?形成可執(zhí)行程序

ABC.EXE裝入可執(zhí)行程序到內(nèi)存,并執(zhí)行D:\>sub>ABC下一程序用DEBUG調(diào)試可執(zhí)行程序D:\>sub>DEBUG

ABC.EXE找到原因YNYNNYN有匯編錯誤信息?Y運行結(jié)果正確?用DEBUG調(diào)試程序查錯?5第二節(jié)匯編語言程序結(jié)構(gòu)一、程序結(jié)構(gòu)二、語句結(jié)構(gòu)6一、程序結(jié)構(gòu)程序由數(shù)條語句構(gòu)成,每條語句占一行。指令性語句(指令語句)

指示性語句(偽指令語句)

分段結(jié)構(gòu)程序按段編寫,與8088內(nèi)存分段編址相對應(yīng)。每段由偽操作SEGMENT開始、由ENDS結(jié)束。程序最后為END結(jié)束語句,后跟一啟動地址。啟動地址指示程序開始執(zhí)行的第一條語句。程序中設(shè)有返回DOS的功能。使程序執(zhí)行完后返回DOS系統(tǒng)的命令接受狀態(tài)。

程序中用到內(nèi)存操作數(shù)時,

應(yīng)按操作數(shù)的尋址方式,給相應(yīng)的段寄存器賦值;匯編語言程序結(jié)構(gòu)例一movs.asm;實現(xiàn)數(shù)據(jù)傳送功能aaSEGMENT

;數(shù)據(jù)段1str1DB'Hello!’aaENDSbbSEGMENT

;數(shù)據(jù)段2str2DB6dup(?)bbENDSccSEGMENT

;代碼段

ASSUMECS:cc,DS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,SEGstr2MOVES,AXMOVDI,OFFSETstr2MOVCX,6REPMOVSB

MOVAH,4CHINT21H

;返回DOSccENDS

ENDstart;指示程序結(jié)束程序可由多個段構(gòu)成,至少有一個代碼段!7二、語句結(jié)構(gòu)

dataSEGMENT;數(shù)據(jù)段varDB?dataENDScodeSEGMENT;代碼段

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDS

ENDstart例:81.名字項

據(jù)語句功能的不同,

名字項可用來表示段名、變量名、標號、過程名以及常量名等。dataSEGMENT;數(shù)據(jù)段varDB?dataENDScodeSEGMENT;代碼段

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDS

ENDstart9

名字項用一個符號表示。

對符號的規(guī)定:①

由字符A~Z,a~z,0~9及符號@、$、下劃線_等組成,最長31個字符,超出部分忽略。②不能用數(shù)字打頭,以免與十六進制數(shù)相混。③不使用匯編程序中的保留字。(如指令的助記符等)④

對定義的符號不區(qū)分大小寫。102.助記符項助記符可以是指令、偽操作中的助記符。對于指令,匯編程序?qū)⑵浞g成機器語言指令。

MOVAX,100→B80001對于偽操作,匯編程序根據(jù)其要求的功能進行處理。

dataSEGMENT

→data與一段值對應(yīng)

stringDB‘Tsinghua’→string與一內(nèi)存地址對應(yīng)113.操作數(shù)項操作數(shù)給出參與操作的數(shù)或數(shù)所在的地方。操作數(shù)多于一個時,用逗號分開。操作數(shù)可以是常數(shù)、寄存器、存儲器操作數(shù)、標號名、過程名或表達式等。12常數(shù)給出具體的數(shù)據(jù)。可以是數(shù)字常量或字符常量。◢◢

數(shù)字默認十進制,也可加D表示十進制數(shù)。如

1234D,1234◢

數(shù)字后加B表示二進制數(shù)。如

1010B◢

數(shù)字后加H表示十六進制數(shù)。如1234H◢

字符常量,用單引號表示。如‘1234’

匯編時,用字符對應(yīng)的ASCII表示。如

31H,32H,33H,34H例

data1DB12,34,56;十進制

data2DB12H,34H,56H;十六進制

MOVAL,‘G’;字符

stringDB‘1234’;字符串13A、B、C、D、E、F開頭的十六進制數(shù)前面加0,與H結(jié)尾的標識符區(qū)別。如寄存器名AH、BH、CH、

DH

變量名abcdH等例

movAL,0AHmovAL,AHmovBX,0abcdH144.注釋項由分號引出,用來說明語句或程序的功能。匯編程序?qū)Ψ痔柡蟮膬?nèi)容不做處理。作用:①注釋程序,增強程序可讀性。

②可放在語句最前,暫時注釋某語句,調(diào)試程序用。例

、、、

;MOVAH,2;顯示提示信息

;MOVDL,’A’

;INT21H

、、、15第三節(jié)指示性語句一、程序開始和結(jié)束二、段定義三、變量定義四、ASSUME語句五、表達式及表達式中的操作符六、過程定義七、等值定義16指示性語句與指令性語句:指令性語句是用指令系統(tǒng)中的指令構(gòu)成的語句。

MOVAX,BX指示性語句是指示匯編程序進行匯編的操作。

MOVAX,4+8中的+codeSEGMENT中的SEGMENTMOVBX,OFFSETstring中的OFFSET17指示性語句與指令性語句區(qū)別一個程序經(jīng)匯編,連接和裝入內(nèi)存后,在執(zhí)行程序之前:

◢指示性語句的功能已經(jīng)完成,故又稱偽操作。

◢而指令性語句的功能尚未完成,需控制CPU去執(zhí)行,才能完成。18常用偽操作介紹一、程序開始和結(jié)束二、段定義三、變量定義四、ASSUME語句五、表達式中的操作符六、過程定義七、等值定義19一、模塊定義和程序結(jié)束偽操作1.NAME和TITLE偽操作

格式

NAME

模塊名

格式

TITLE

模塊名在源程序開始可用NAME或TITLE為模塊命名,

模塊名的作用是指示給連接程序進行連接用。源程序中可無模塊定義,此時源文件名作為模塊名。

202.END偽操作

格式

END啟動地址作用是指示源程序到此結(jié)束。匯編程序?qū)ND之后的語句不進行處理。程序中所有有效語句應(yīng)放在END語句之前。源程序中必須有END結(jié)束語句。匯編程序?qū)oEND語句的源程序不進行處理,

只給出無END語句錯誤信息。21假設(shè)TEST.asm是一個無END語句的匯編語言源程序。其匯編結(jié)果如下:D:\MASMTEST;↙Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.EndoffileencounteredoninputfileEndoffileencounteredoninputfile49968+421181Bytessymbolspacefree

0WarningErrors

0SevereErrorsD:\由于沒有END語句,匯編程序根本沒對源程序進行匯編,此時顯示警告性錯誤總數(shù)為0,嚴重性錯誤總數(shù)為0,用戶不要被此值誤導。22啟動地址可是一個標號或過程名,指示程序的入口。程序裝入內(nèi)存后,系統(tǒng)跳轉(zhuǎn)到入口處,開始執(zhí)行程序。aaSEGMENT;數(shù)據(jù)段1

str1DB'Hello!’aaENDSbbSEGMENT;數(shù)據(jù)段2

str2DB6dup(?)bbENDSccSEGMENT;代碼段

ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aa

MOVDS,AXLEASI,str1

MOVAX,SEGstr2

MOVES,AXMOVDI,OFFSETstr2

MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstartD:\masm>DEBUGhello.exe-U:查看代碼段129F:0000FCCLD129F:0001B89D12MOVAX,129D129F:00048ED8MOVDS,AX129F:00068D360000LEASI,[0000]129F:000AB89E12MOVAX,129E129F:000D8EC0MOVES,AX129F:000FBF0000MOVDI,0000129F:0012B90600MOVCX,0006129F:0015F3REPZ129F:0016A4MOVSB129F:0017B44CMOVAH,4C129F:0019CD21INT21、、、-D129d:0l10;查看數(shù)據(jù)段1的內(nèi)容129D:000048656C6C6F210000-0000000000000000Hello!..........-D129e:0l10;查看數(shù)據(jù)段2的內(nèi)容129E:00000000000000000000-0000000000000000................-23二、段定義偽操作

格式

段名SEGMENT

、、、、、、段名ENDS

段定義由偽操作SEGMENT開始、ENDS結(jié)束。其中:SEGMENT和ENDS必須成對出現(xiàn),且語句前必須有段名,段名必須相同。

SEGMENT和ENDS語句之間可以有指令和其他偽操作,

表示存放在該段內(nèi)存的變量、指令或其他偽操作對該段內(nèi)存的處理程序中可以定義多個段。程序經(jīng)匯編、連接及裝入內(nèi)存后,段名為一具體的段值。24三、變量定義偽操作

格式

變量名類型助記符操作數(shù)[,操作數(shù),...]

用來定義程序中所用的內(nèi)存操作數(shù)。其中變量名指示內(nèi)存操作數(shù)的地址(符號地址)

類型助記符指示內(nèi)存操作數(shù)的類型(字節(jié)、字、雙字等)

操作數(shù)指示內(nèi)存操作數(shù)的內(nèi)容匯編程序?qū)⒍x的操作數(shù),按其類型分配內(nèi)存單元數(shù),

順序存入變量名指向的內(nèi)存單元中。常用的類型助記符有:DB

指示其后的操作數(shù)為字節(jié)類型DW

指示其后的操作數(shù)為字類型DD

指示其后的操作數(shù)為雙字類型25例1:定義賦初值的變量

dataSEGMENT

xxDB1,-1,0fcH

yyDW1,-1,0fcH

zzDD1,-1,0fcHdataENDS26例2:定義字符串變量(只能用DB定義)dataSEGMENT

str1DB'TsingHua'

str2DB'INPUT:',0dH,0aH,'$'dataENDS注意:3個及其以上的字符,只能用DB定義str1DW‘a(chǎn)bcd’str2DD‘a(chǎn)bcd’str1str25473696e67487561494e5055543a0d0a24‘T’‘s’‘i’‘n’‘g’‘H’‘u’‘a(chǎn)’‘I’‘N’‘P’‘U’‘T’‘:’0dH0aH‘$’27操作數(shù)可以是用常量、表達式和?表示。常量和表達式表示內(nèi)存操作數(shù)的初始值,

其值應(yīng)在其定義的類型范圍內(nèi),否則匯編出錯。例

aaDB270bbDW80000

用?

表示不置初始值的內(nèi)存操作數(shù)。

ccDB?

可用DUP復制操作符定義相同的操作數(shù),其格式為

重復次數(shù)DUP(操作數(shù))

eeDB3DUP(4)

等價于eeDB4,4,428dataSEGMENTxxDB1,-1,0FCHyyDW1,-1,0FCHzzDD1,-1,0FCHstrDB'TsingHua'bufDB4,?,4DUP(?)DB‘dataend’dataENDScodeSEGMENTASSUMECS:codeASSUMEDS:datastart:MOVAX,dataMOVDS,AXLEABX,xxLEASI,yyLEADI,zzMOVAH,4CHINT21HcodeENDSENDstart例4:

在DEBUG下查看變量存放情況。29四、ASSUME偽操作

格式

ASSUME段寄存器:段名[,段寄存器:段名,…]

其中段寄存器為CS、DS、ES、SS中的一個

段名為用偽操作SEGMENT定義過的段名例

ASSUMECS:cc,DS:aaASSUME偽操作的作用指示匯編程序指令中用到的標號、過程及變量所在的段。其中對標號、過程必須用CS段寄存器指示

對變量可用CS、DS、ES、SS段寄存器指示30

若未用ASSUME語句指示指令中用到的標號、過程和變量所在的段,匯編程序?qū)⒔o出錯誤信息。

ASSUME語句只起指示作用,并無實際的操作。在程序中引用定義的變量做內(nèi)存操作數(shù)時,需按尋址方式用傳送指令(如MOV)給相應(yīng)的段寄存器賦值。31例

用程序?qū)崿F(xiàn)1234H+5678H

dataSEGMENTvalueDW1234H,5678HresultDW?

dataENDS

codeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;給DS賦值

MOVDS,AXMOVAX,value;取數(shù)

ADDAX,value+2;兩數(shù)相加

MOVresult,AX;保存結(jié)果

MOVAH,4CH;返回DOSINT21H

codeENDSENDstart32注釋掉ASSUME語句,其匯編結(jié)果:

dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENT;ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVAX,value

ADDAX,value+2

MOVresult,AXMOVAH,4CHINT

21HcodeENDSENDstartD:\MASM>MASMassume;Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.assume.ASM(8):MissingorunreachableCSassume.ASM(10):Cannotaddresswithsegmentregisterassume.ASM(11):Cannotaddresswithsegmentregisterassume.ASM(12):Cannotaddresswithsegmentregister49872+421341Bytessymbolspacefree0WarningErrors

4SevereErrorsD:\MASM>33結(jié)論:1.ASSUME語句只起指示作用,沒有賦值作用2.

程序中用到內(nèi)存操作數(shù)時,應(yīng)按操作數(shù)的尋址方式,給相應(yīng)的段寄存器賦值。34第四節(jié)匯編語言程序舉例匯編語言程序舉例一35例將BL寄存器的內(nèi)容按二進制形式顯示出來(BL)

MOVCX,8;顯示字符個數(shù)為8next:SHLBL,1;將顯示位移至CF中

JCone;CF=1?

MOVDL,30H

;CF=0,將0的ASCII放在DL中

JMPexitone:MOVDL,31H

;CF=1,將1的ASCII放在DL中exit:MOVAH,2INT21H;調(diào)用DOS功能顯示

DECCX;循環(huán)次數(shù)減1

JNZnext;判斷是否結(jié)束、、、313031303031313036codeSEGMENTASSUMECS:codestart:

............codeENDS

ENDstartMOVCX,8;顯示字符個數(shù)為8next:SHLBL,1;將顯示位移至CF中

JCone;CF=1?

MOVDL,30H

;CF=0,將0的ASCII放在DL中

JMPexitone:MOVDL,31H

;CF=1,將1的ASCII放在DL中exit:MOVAH,2INT21H;調(diào)用DOS功能顯示

DECCX;循環(huán)次數(shù)減1

JNZnext;判斷是否結(jié)束37data1SEGMENT;數(shù)據(jù)段1,(可據(jù)需要設(shè)定,也可無)……;變量定義data1ENDSdata2SEGMENT;數(shù)據(jù)段2(可據(jù)需要設(shè)定,也可無)……data2ENDScodeSEGMENT;程序段

ASSUMECS:code,DS:data1,ES:data2start:

、、、;程序主體部分、、、、、、、、、

MOVAH,4CH

;返回DOS

INT21HcodeENDS

ENDstart完整匯編語言程序框架:38五、表達式及表達式中的操作符

表達式由常量、標號、變量和一些操作符構(gòu)成。匯編程序?qū)Ρ磉_式進行運算后,得到一個確定的數(shù)值,再把這個數(shù)值匯編到指令中。據(jù)表達式所表示的內(nèi)容,分數(shù)字表達式、地址表達式。表達式是指令或偽操作的操作數(shù);

表達式中的操作符由匯編程序完成例

MOVAX,12-4;MOVAX,8;數(shù)字表達式

LEABX,[string+4];地址表達式

39表達式中的操作符有以下幾類:1.算術(shù)運算符(+、-、*、/、MOD)2.邏輯運算符(AND、OR、NOT、XOR)3.關(guān)系運算符(EQ、NE、GT、GE、LT、LE)

真:FFFFH;假:04.分析運算符(SEG、OFFSET)5.組合運算符(PTR)40例:

1.算術(shù)運算符(+、-、*、/、MOD(取余數(shù)))MOVAX,6*8←MOVAX,482.邏輯運算符(AND、OR、NOT、XOR)MOVAX,80hOR70h←MOVAX,0F0h3.關(guān)系運算符(EQ、NE、GT、GE、LT、LE)

真:FFFFH;假:0MOVAX,1GE2←MOVAX,041

4.分析運算符(SEG、OFFSET)SEG取符號地址的段地址例MOVAX,SEGyyOFFSET取符號地址的偏移地址例MOVBX,OFFSETyybb SEGMENT

yy DB6dup(?)bb ENDScc SEGMENT ASSUMECS:cc,DS:aa,ES:bbstart

: CLD MOVAX,SEGyy MOVES,AX MOVDI,OFFSETyy

MOVCX,6 …….

cc ENDS

ENDstart42aa SEGMENTxx DB'Hello!’aa ENDSbb SEGMENT

yy DB6dup(?)bb ENDScc SEGMENT ASSUMECS:cc,DS:aa,ES:bbstart

: CLD MOVAX,aa MOVDS,AX LEASI,xx MOVAX,SEGyy MOVES,AX MOVDI,OFFSETyy

MOVCX,6 REPMOVSB MOVAH,4CH INT21H

cc ENDS

ENDstartD:\>DEBUGhello1.exe-U

;查看程序代碼

129F:0000FCCLD129F:0001B89D12MOVAX,129D129F:00048ED8MOVDS,AX129F:00068D360000LEASI,[0000]129F:000AB89E12MOVAX,129E129F:000D8EC0MOVES,AX129F:000FBF0000MOVDI,0000129F:0012B90600MOVCX,0006129F:0015F3REPZ129F:0016A4MOVSB129F:0017B44CMOVAH,4C129F:0019CD21INT21、、、、、、MOVAX,bbLEADI,yy43注意:SEG、OFFSET只能對符號地址操作MOVAX,SEG[BX]MOVBX,OFFSET[SI]44匯編語言程序舉例二

編寫完整匯編語言程序,完成內(nèi)存數(shù)據(jù)塊傳送功能。將某段中的字符串“Hello!”傳送到另一段中。45例一編寫完整匯編語言程序,完成內(nèi)存數(shù)據(jù)塊傳送功能。將某段中的字符串“Hello!”傳送到另一段中。利用變量定義字符串和緩沖區(qū)46aa SEGMENT;數(shù)據(jù)段1xx DB'Hello!’;定義源串a(chǎn)a ENDSbb SEGMENT;數(shù)據(jù)段2yy DB6dup(?);定義目的緩沖區(qū)bb ENDScc SEGMENT;代碼段

ASSUMECS:cc,DS:aa,ES:bb;指示指令中標號,變量所在段start

: CLD;設(shè)置傳送方向

MOVAX,aa;DS:SI←

源串首地址

MOVDS,AX

LEASI,xx

MOVAX,SEGyy;ES:DI←

目的首地址

MOVES,AX MOVDI,OFFSETyy

MOVCX,6;CX←

串的長度

REPMOVSB;串傳送

MOVAH,4CH;調(diào)用4CH系統(tǒng)功能,返回DOS INT21Hcc ENDS

ENDstart

;指示程序結(jié)束和程序入口47D:\>EDIThello.asm;編寫源程序D:\>MASMhello;;匯編源程序

Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.49860+421241Bytessymbolspacefree0WarningErrors0SevereErrorsD:\>LINKhello;;連接程序Microsoft(R)OverlayLinkerVersion3.61Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.LINK:warningL4021:nostacksegmentD:\>hello;執(zhí)行程序

D:\>48D:\>DEBUGhello.exe

;利用DEBUG查看結(jié)果-U

;查看程序代碼

129F:0000FCCLD129F:0001B89D12MOVAX,129D129F:00048ED8MOVDS,AX129F:00068D360000LEASI,[0000]129F:000AB89E12MOVAX,129E129F:000D8EC0MOVES,AX129F:000FBF0000MOVDI,0000129F:0012B90600MOVCX,0006129F:0015F3REPZ129F:0016A4MOVSB129F:0017B44CMOVAH,4C129F:0019CD21INT21、、、、、、-D129D:0L20

;執(zhí)行程序前,查看源串內(nèi)容129D:000048656C6C6F210000-0000000000000000Hello!..........129D:00100000000000000000-0000000000000000................-D129E:0L20

;執(zhí)行程序前,查看目的串129E:00000000000000000000-0000000000000000................129E:0010FCB89D128ED88D36-0000B89E128EC0BF.......6........-CLDMOVAX,aaMOVDS,AXLEASI,xx

MOVAX,SEGyyMOVES,AXMOVDI,OFFSETyy

MOVCX,6REPMOVSBMOVAH,4CHINT21H49-G

;執(zhí)行程序Programterminatednormally-D129E:0L20

;查看目的串129E:000048656C6C6F210000-0000000000000000Hello!..........129E:0010FCB89D128ED88D36-0000B89E128EC0BF.......6........-D

129D:0L20

;從源串重新查看

129D:000048656C6C6F210000-0000000000000000

Hello!..........129D:00100000000000000000-0000000000000000

.................129D:0020FCB89D128ED88D36-0000B89E128EC0BF.......6........129D:00300000B90600F3A4B4-4CCD2109E8080003........L.!.....50-U

;查看程序代碼

129F:0000FCCLD129F:0001B89D12MOVAX,129D129F:00048ED8MOVDS,AX129F:00068D360000LEASI,[0000]129F:000AB89E12MOVAX,129E129F:000D8EC0MOVES,AX129F:000FBF0000MOVDI,0000129F:0012B90600MOVCX,0006129F:0015F3REPZ129F:0016A4MOVSB129F:0017B44CMOVAH,4C129F:0019CD21INT21、、、、、、aa SEGMENTxx DB'Hello!’aa ENDSbb SEGMENT

yy DB6dup(?)bb ENDScc SEGMENTASSUMECS:cc,DS:aa,ES:bbstart

: CLD MOVAX,aa MOVDS,AX LEASI,xx MOVAX,SEGyy MOVES,AX MOVDI,OFFSETyy

MOVCX,6 REPMOVSB MOVAH,4CH INT21H

cc ENDS

ENDstart51data1SEGMENT;數(shù)據(jù)段1,(可據(jù)需要設(shè)定,也可無)……;變量定義data1ENDSdata2SEGMENT;數(shù)據(jù)段2(可據(jù)需要設(shè)定,也可無)……data2ENDScodeSEGMENT;程序段

ASSUMECS:code,DS:data1,ES:data2start:

、、、;程序主體部分、、、、、、、、、

MOVAH,4CH

;返回DOS

INT21HcodeENDS

ENDstart完整匯編語言程序框架:52六、過程定義偽操作

格式

過程名PROC類型、、、過程名ENDP

過程定義由偽操作PROC開始、ENDP結(jié)束。其中:PROC和ENDP必須成對出現(xiàn),

且語句前必須有過程名,過程名必須相同。

PROC和ENDP語句之間為子程的指令序列。程序中可以定義多個過程。程序經(jīng)匯編、連接及裝入內(nèi)存后,

過程名為一具體的內(nèi)存地址,指示子程入口。53過程名常用作CALL調(diào)用指令的操作數(shù),

子程的最后安排RET返回指令,使執(zhí)行完子程后能返回調(diào)用處。過程有兩種類型:NEAR和FAR

無類型項時,默認為NEAR類型。當過程與調(diào)用指令不在同一段時,應(yīng)將過程定義為FAR類型。過程類型決定子程中RET的返回類型54例1displayPROC

、、、、C3H

、、

RET;NEAR屬性的過程對應(yīng)段內(nèi)返回

displayENDP例2displayPROCFAR

、、、、CBH

、、

RET;FAR屬性的過程對應(yīng)段間返回

displayENDP55七、等值定義偽操作

格式

符號名EQU需等值的表達式作用是用符號名等值指定的表達式其中表達式可以是任何有效的操作數(shù)匯編時用語句中的表達式代替程序中符號所在的地方。應(yīng)用:1.定義符號常量,方便修改程序。2.某表達式多次出現(xiàn)時,用等值偽操作可以方便編程。56八、其他分析運算符:TYPE,LENGTH,SIZE把一些特征或存貯器地址的一部分作為數(shù)值回送?!YPE格式:TYPEvariable變量則回送該變量的以字節(jié)數(shù)表示的類型(DB為1,DW為2,DD為4,DQ為8,DT為10)或label標號回送標號類型數(shù)值(NEAR為-1,F(xiàn)AR為-2)例:ARRAYDW1,2,3ADDSI,TYPEARRAY匯編程序其形式:

ADDSI,257·LENGTH格式:LENGTHvariable

對于變量中使用DUP匯編回送分配給變量單元數(shù),其他情況回送1。例:FESSDW100DUP(0) 對于MOVCX,LENGTHFEES

匯編程序?qū)⑵湫问剑篗OVCX,100

其他情況例:ARRAYDW1,2,3

對于指令MOVCX,LENGTHARRAY

匯編程序?qū)⑹蛊湫问綖椋篗OVCX,1例:TABLEDB‘ABCD’

對于指令MOVCX,LENGTHTABLE匯編程序使其形式為:MOVCX,158·SIZE格式:SIZEvariable

回送分配給該變量的字節(jié)數(shù)LENGTH*TYPE例:FEESDW100DUP(0)

MOVCX,SIZEFEES

將形成:MOVCX,200例:TABLEDB‘ABCD’

MOVCX,SIZETABLE

將形成MOVCX,1例:ARRAYDW1,2,3

MOVCX,SIZEARRAY

形式MOVCX,2 LENGTH*TYPE=259總結(jié):

TYPE變量的返回值是類型的字節(jié)數(shù): DB為1,DW為2,DD為4,DQ為8,DT為10

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論