第4章 匯編與執(zhí)行一個(gè)程序_第1頁(yè)
第4章 匯編與執(zhí)行一個(gè)程序_第2頁(yè)
第4章 匯編與執(zhí)行一個(gè)程序_第3頁(yè)
第4章 匯編與執(zhí)行一個(gè)程序_第4頁(yè)
第4章 匯編與執(zhí)行一個(gè)程序_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章匯編與執(zhí)行一個(gè)程序4.1匯編與執(zhí)行一個(gè)程序4.2COM文件4.3匯編語(yǔ)言程序的編輯、匯編、鏈接與調(diào)試4.1匯編與執(zhí)行一個(gè)程序當(dāng)你編寫(xiě)好一個(gè)匯編語(yǔ)言源程序后,需要進(jìn)行以下的處理過(guò)程,計(jì)算機(jī)才能執(zhí)行。首先用編輯程序DOSEDIT或其他的編輯程序,將其輸入到計(jì)算機(jī)中。然后,存入磁盤(pán)生成匯編語(yǔ)言源程序文件(ASM文件)。源程序不能被計(jì)算機(jī)直接執(zhí)行,所以要經(jīng)過(guò)匯編程序加以翻譯,這個(gè)翻譯過(guò)程稱為編譯過(guò)程或匯編過(guò)程,就是把源程序文件翻譯成二進(jìn)制代碼所表示的目標(biāo)文件——?OBJ文件。在匯編過(guò)程中,匯編程序?qū)?huì)對(duì)源程序進(jìn)行掃描,若源程序中有語(yǔ)法錯(cuò)誤,則匯編結(jié)束后,匯編程序?qū)⒅赋鲈次募械恼Z(yǔ)法錯(cuò)誤,你可以重新使用編輯程序來(lái)修正源程序中的語(yǔ)法錯(cuò)誤,直至得到無(wú)誤的ASM文件和OBJ文件。

OBJ文件雖然已是二進(jìn)制機(jī)器指令碼的形式,但計(jì)算機(jī)仍不能直接執(zhí)行。還必須用鏈接程序(LINK.EXE),把目標(biāo)文件與庫(kù)文件或其它目標(biāo)文件進(jìn)行鏈接和在內(nèi)存中重新定位,生成可直接執(zhí)行文件(EXE文件)。這時(shí)的EXE文件才可以由DOS裝入內(nèi)存儲(chǔ)器并運(yùn)行。匯編過(guò)程如圖4-1所示。圖4-1匯編語(yǔ)言的匯編過(guò)程4.1.1鍵入與編輯一個(gè)源程序例4.1兩個(gè)十六進(jìn)制數(shù)0123、0025相加,將結(jié)果存入BX寄存器中。源程序清單如下:;filename:L41.ASMSTACKSGSEGMENTPARASTACK‘STACK’DB12DUP(‘STACKSEG’)STACKSGENDS;

—————————————————————CODESGSEGMENTPARA‘CODE’BEGINPROCFARASSUMESS:STACKSG,CS:CODESG,DS:NOTHINGPUSHDSSUBAX,AXPUSHAXMOVAX,0123HADDAX,0025HMOVBX,AXRETBEGINENDPCODESGENDSENDBEGIN(1)程序中有一個(gè)代碼段和一個(gè)堆棧段,因?yàn)椴恍枰獢?shù)據(jù)段和附加段,所以未設(shè)定。(2)用全屏幕編輯程序EDIT.COM建立源程序,文件名取L41.ASM。在DOS狀態(tài)鍵入EDIT即可。如:

C:\>EDITL41.ASM[并按下Enter鍵](3)回車(chē)后,屏幕上出現(xiàn)EDIT的全屏幕窗口,此時(shí)就可以輸入或編輯源程序了。當(dāng)輸入、編輯完源程序后,用EDIT的下拉菜單項(xiàng):“FILE”中的“SAVE”項(xiàng)將源文件L41.ASM存入磁盤(pán),這時(shí)你的磁盤(pán)上就建立了一個(gè)名為L(zhǎng)41.ASM的匯編語(yǔ)言源程序文件。(有關(guān)EDIT.COM的使用和操作,請(qǐng)讀者參考本章4.3節(jié)。)4.1.2匯編一個(gè)程序當(dāng)你把源程序鍵入并以名稱L41.ASM存入磁盤(pán)后,在執(zhí)行它之前還有兩個(gè)重要步驟——匯編和鏈接。1.匯編

L41.ASM源程序文件建立后,用匯編程序?qū)⒃撐募g為二進(jìn)制機(jī)器指令碼,并產(chǎn)生一個(gè)OBJ目標(biāo)文件(L41.OBJ),這個(gè)翻譯過(guò)程稱為匯編。常用的匯編程序是宏匯編MASM.EXE或小匯編ASM.EXE。它的主要功能是:(1)檢測(cè)源程序中的語(yǔ)法錯(cuò)誤,并在屏幕上顯示出錯(cuò)信息。(2)展開(kāi)宏指令(將在第14章中介紹)。(3)產(chǎn)生目標(biāo)文件,并同時(shí)產(chǎn)生列表文件LST和交叉參考表文件CRF。

注意:在DOS狀態(tài)下鍵入MASML41,即可實(shí)現(xiàn)對(duì)L41.ASM的匯編。操作和匯編過(guò)程如圖4-2所示。(1)?C:>MASML41(2)?Microsoft(R)MacroAssemblerVersion5.00Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.(3)?Objectfilename[L41.OBJ]:Sourcelisting[NUL.LST]:L41Cross-reference[NUL.CRF]:L41圖4-2L41.ASM的匯編過(guò)程圖中,(1)是匯編命令輸入;(2)是版本說(shuō)明以及出版時(shí)間;(3)提示你默認(rèn)使用相同的文件名(但你可以改變它),按Enter鍵即可。再提示你默認(rèn)不要匯編后程序的列表文件。若不需要只需按Enter鍵。若要此列表文件,可以鍵入:

L41[按下Enter鍵]最后提示你默認(rèn)不要匯編后程序的交叉參考表文件。若不需要只需按Enter鍵。若要此參考表文件,可以鍵入:

L41[按下Enter鍵]

L41.LST是列表文件,這個(gè)文件可同時(shí)列出源程序和機(jī)器語(yǔ)言程序清單并給出符號(hào)表,幫助你調(diào)試程序。這時(shí)在你的磁盤(pán)上就建立了L41.LST文件,可以在DOS狀態(tài)下,用TYPE命令顯示或打印它的內(nèi)容,如:

C:\>TYPEL41.LST

結(jié)果顯示在屏幕上,如圖4-3所示。若想打印此顯示,按Ctrl+P鍵將打印機(jī)連接即可。1;filenamel41.asm

20000 STACKSGSEGMENTPARASTACK‘STACK’30000000C[DB12DUP(‘STACKSEG’)4 535441434B 5 534547 6 ] 7 80060STACKSGENDS90000CODESG SEGMENTPARA‘CODE’100000BEGIN PROCFAR11 ASSUMESS:STACKSG,CS:CODESG,DS:NOTHING1200001E PUSHDS1300012BC0 SUBAX,AX14000350 PUSHAX150004B80123 MOVAX,0123H160007050025 ADDAX,0025H17000A8BD8 MOVBX,AX18000CCB RET19000D

BEGINENDP20000D

CODESGENDS21 ENDBEGINSegmentsandGroups:NameLengthAlign CombineClassCODESG.............000D PARA NONE ‘CODE’STACKSG............0060 PARA STACK ‘STACK’Symbols:Name Type Value AttrBEGIN............. FPROC0000 CODESGLength=000D圖4-3L41.LST列表文件上述匯編過(guò)程,匯編程序?qū)⒃闯绦蚍g成機(jī)器碼,并把錯(cuò)誤顯示在屏幕上。典型的錯(cuò)誤一般有:違反命名原則的名稱,拼錯(cuò)助記符、運(yùn)算符(例如將MOV拼成MOVE),以及操作數(shù)含有一個(gè)未定義的名稱等。在匯編程序手冊(cè)中,你可以找到這些錯(cuò)誤碼的解釋,大約共有100條錯(cuò)誤信息。注意:你必須再重新鍵入編輯程序,在編輯狀態(tài)下更正源程序,然后再重新匯編,直至產(chǎn)生OBJ文件,才能進(jìn)行下一步。圖4-3是已匯編過(guò)的列表文件,匯編程序以L41.LST名稱將它存入磁盤(pán)。列表的頂端是堆棧段。SEGMENT、PROC、ASSUME以及END偽指令均不產(chǎn)生機(jī)器指令碼。此列表不僅顯示了源程序的符號(hào)指令碼,同時(shí)把匯編后的機(jī)器碼以十六進(jìn)制格式顯示在左邊。最左邊是序號(hào),緊接著是堆棧段或數(shù)據(jù)段定義的數(shù)據(jù)或資料以及指令段指令的十六進(jìn)制偏移地址。堆棧段起始于0000處。當(dāng)裝入內(nèi)存時(shí),它依據(jù)SS寄存器的內(nèi)容作為堆棧的起始地址,并從此位置計(jì)算起,其差距為0個(gè)字節(jié)處的位置。SEGMENT偽指令中的PARA使得堆棧段定位在可以被16整除的地址。SEGMENT偽指令還通知匯編程序這是一個(gè)堆?!划a(chǎn)生機(jī)器指令碼。DB偽指令也是對(duì)齊在地址0000處,含有12份“STACKSEG”字符串,其機(jī)器碼是十六進(jìn)制OC(十進(jìn)制12)和ASCII碼的十六進(jìn)制表示法。稍后你可以利用DEBUG來(lái)觀察存儲(chǔ)器中的結(jié)果。堆棧段于地址Hex0060處結(jié)束,即十進(jìn)制96(12×8)。指令段也起始于地址0000處。當(dāng)裝入內(nèi)存時(shí),它是依據(jù)CS寄存器的內(nèi)容作為地址,并從此地址算起,其差距為0處。由于ASSUME是偽指令,所以第一個(gè)產(chǎn)生實(shí)際機(jī)器碼的指令是PUSHDS,它是一條1字節(jié)長(zhǎng)度的指令(1E),位于差距為0的位置(即偏移地址為0000)。次一條指令是SUBAX,AX,它是一條2個(gè)字節(jié)長(zhǎng)度的指令(2BC0),放在指令段起始差距為0001的地址,即偏移地址為0001。在例4.1中機(jī)器指令的長(zhǎng)度有1個(gè)字節(jié)、2個(gè)字節(jié)和3個(gè)字節(jié)。最后一條指令是END,它含有操作數(shù)BEGIN,與指令段地址0000的PROC名稱有關(guān)。此地址就是裝入程序后,開(kāi)始執(zhí)行程序的地址。2.符號(hào)表緊接在程序列表之后的是符號(hào)表。第一部分是一個(gè)段表,含有在程序中所有定義的段與段組(Groups),以及它們所占的字節(jié)長(zhǎng)度、定位方法和組合形式。第二部分是一個(gè)符號(hào)表——含有數(shù)據(jù)段內(nèi)各數(shù)據(jù)欄的名稱即變量名。例4.1中不存在此項(xiàng)。符號(hào)表中還含有指令段內(nèi)提供給指令使用的符號(hào)名和變量名,例4.1中只有一個(gè)BEGIN過(guò)程名。3.兩次掃描匯編程序?qū)υ闯绦騾R編時(shí)需要經(jīng)過(guò)兩次掃描。其原因之一是向前參考,就是指令可能參考到匯編程序尚未匯編到的標(biāo)號(hào)。在第一次掃描時(shí),匯編程序掃描整個(gè)源程序,并將程序所用到的名稱與標(biāo)號(hào)建立一個(gè)符號(hào)表,亦即數(shù)據(jù)段的變量名與指令段的標(biāo)號(hào)名和過(guò)程名,以及它們?cè)诔绦蛑械南鄬?duì)地址。第一次掃描決定了將要產(chǎn)生的機(jī)器碼長(zhǎng)度,但并不產(chǎn)生目的碼。在第二次掃描時(shí),匯編程序使用第一次掃描所建立的符號(hào)表。目前它已知道每個(gè)數(shù)據(jù)欄的長(zhǎng)度和指令的長(zhǎng)度以及相對(duì)地址。所以,它能確定每一條指令所對(duì)應(yīng)的目的碼。之后,匯編程序可以依據(jù)命令需求而產(chǎn)生OBJ、LST與CRF文件。4.1.3鏈接一個(gè)程序

OBJ文件幾乎是可以執(zhí)行的目標(biāo)文件形式,但還不能直接執(zhí)行。DOS的鏈接程序LINK.EXE就可生成可執(zhí)行文件EXE,鏈接文件做下列工作。(1)對(duì)匯編程序在OBJ文件中留下的空白進(jìn)行定址。你可以在稍后的LST文件所列出的目的碼中看到如-R之類的內(nèi)容,L41.LST文件所列出的目的碼中沒(méi)有此項(xiàng)。(2)若有兩個(gè)以上的匯編過(guò)的OBJ文件,要鏈接起來(lái)而成為一個(gè)可執(zhí)行的文件(EXE)時(shí),就需做結(jié)合的工作。例如,兩個(gè)以上的匯編語(yǔ)言程序或一個(gè)匯編語(yǔ)言程序與一個(gè)用高級(jí)語(yǔ)言編寫(xiě)的程序(C或BASIC)進(jìn)行結(jié)合。(3)利用適當(dāng)?shù)闹噶畛跏蓟疎XE文件,以便以后能正確裝入內(nèi)存并執(zhí)行之。鍵入LINKL41并按下Enter鍵即可執(zhí)行對(duì)L41的鏈接,接著系統(tǒng)會(huì)給出一連串的提示內(nèi)容并等著你回答,如圖4-4所示。C:>LinkL41RunFile[L41.EXE]:ListFile[NUL.MAP]:CONLibraries[.LIB]:圖4-4LINKL41執(zhí)行過(guò)程第一個(gè)提示要求你輸入可執(zhí)行文件名(使用與源文件相同的文件名即可)。第二個(gè)提示告訴你,LINK將默認(rèn)為NUL.MAP(即不要MAP文件)。MAP文件含有各段的大小與名稱表,以及LINK所發(fā)現(xiàn)的錯(cuò)誤。一個(gè)典型的錯(cuò)誤是堆棧段沒(méi)有定義成功。CON回答告訴LINK在屏幕上顯示此文件,而不存入磁盤(pán),這樣可以節(jié)省磁盤(pán)空間,并允許你立即查看MAP文件。例4.1中,L41.MAP文件的內(nèi)容如下所示:起始地址結(jié)束地址長(zhǎng)度名稱類型00000H0005FH00060HSTACKSGSTACK00060H0006CH0000DHCODESGCODE

第三個(gè)提示的回答是按下Enter鍵,它告訴LINK其余的選項(xiàng)均采用默認(rèn)值。DOS手冊(cè)中包含了對(duì)這些選項(xiàng)的說(shuō)明。在這個(gè)過(guò)程中,唯一最可能出現(xiàn)的錯(cuò)誤是輸入了錯(cuò)誤的文件名。解決方法是重新啟動(dòng)LINK再作一遍。4.1.4執(zhí)行一個(gè)程序當(dāng)你把OBJ文件(一個(gè)或多個(gè))進(jìn)行鏈接,生成一個(gè)EXE文件后,就可以不限次數(shù)地執(zhí)行這個(gè)EXE文件了。但當(dāng)你需要改變EXE文件時(shí),就必須修改其源程序,然后再重新匯編生成另外一個(gè)OBJ文件,最后再重新鏈接此OBJ文件,重新生成EXE文件。經(jīng)過(guò)匯編、鏈接過(guò)程后,生成可執(zhí)行文件EXE,現(xiàn)在你就可以執(zhí)行這個(gè)程序了。鍵入以下命令以執(zhí)行此程序:

C:\>L41.EXE或C:\>L41

DOS會(huì)將擴(kuò)展名為EXE(或COM)的文件裝入內(nèi)存并執(zhí)行。然而,此程序未編寫(xiě)顯示功能,無(wú)法在屏幕上看到結(jié)果。例4.1程序的執(zhí)行結(jié)果被存入內(nèi)存單元,可以利用DEBUG程序的追蹤命令(T)逐條執(zhí)行指令,觀察每一步驟的結(jié)果。有關(guān)DEBUG的用法請(qǐng)參閱第2章2.4節(jié)。4.2COM文

件程序經(jīng)過(guò)匯編、鏈接都會(huì)產(chǎn)生EXE格式的可執(zhí)行文件。EXE文件在鏈接的過(guò)程中會(huì)自動(dòng)地產(chǎn)生一個(gè)至少占有512個(gè)字節(jié)的文件頭特殊記錄格式,并被安置在磁盤(pán)文件(EXE)的開(kāi)頭位置。但你也可以產(chǎn)生一個(gè)可執(zhí)行的COM文件。例如,COMMAND.COM就是一個(gè)最常用的COM文件。EXE2BIN.COM是一個(gè)DOS系統(tǒng)程序,它可以將EXE文件轉(zhuǎn)換成COM文件。4.2.1EXE文件與COM文件的差異雖然COM文件是利用EXE2BIN程序?qū)XE文件轉(zhuǎn)換而成的,但是它們彼此之間仍存在著很大的差異,主要表現(xiàn)在下列幾點(diǎn)。(1)程序大小。一個(gè)EXE文件可以為任意大小,然而一個(gè)COM文件被限制在一個(gè)段內(nèi),最大為64K字節(jié)。COM文件總是比原來(lái)的EXE文件小,其中一個(gè)原因是512個(gè)字節(jié)的文件頭被放置在EXE文件的開(kāi)始部分,但在COM磁盤(pán)文件中卻沒(méi)有。(2)堆棧段。一個(gè)EXE文件需要自己定義堆棧段,然而系統(tǒng)會(huì)自動(dòng)為COM文件產(chǎn)生堆棧段。因此,當(dāng)你編寫(xiě)一個(gè)將被轉(zhuǎn)換成COM文件的匯編文件時(shí),可以省略定義堆棧段。(3)數(shù)據(jù)段。一個(gè)EXE文件通常會(huì)定義一個(gè)數(shù)據(jù)段(在需要時(shí)),并且將DS寄存器指向數(shù)據(jù)段的起始地址。COM文件只能在代碼段中定義它的資料或數(shù)據(jù)。(4)初始化。EXE文件在剛開(kāi)始時(shí),要求堆棧段沒(méi)有任何內(nèi)容(是空的),并要求設(shè)定DS寄存器的初值。因?yàn)镃OM文件并沒(méi)有堆棧段,也沒(méi)有數(shù)據(jù)段,所以省略了這些步驟。當(dāng)COM文件初始化時(shí),所有的段寄存器都指向程序段的前綴PSP(ProgramSegmentPrefix)的開(kāi)始,PSP是一塊占用256字節(jié)的內(nèi)存區(qū)域。當(dāng)COM與EXE被裝入存儲(chǔ)器時(shí),DOS會(huì)自動(dòng)地將PSP加在程序開(kāi)始處的前面。由于程序真正的開(kāi)始位置是相對(duì)于PSP起始位置的相對(duì)位移100H的地方,因此,在對(duì)代碼段定義之后,COM文件應(yīng)使用一條ORG100H偽指令,設(shè)定程序的起始地址,以便使程序跳過(guò)PSP。接著使用一條JMP指令,跳到程序的真正開(kāi)始處,如例4.2所示。(5)轉(zhuǎn)換。對(duì)于EXE及COM兩種格式的程序,匯編、鏈接程序是沒(méi)有區(qū)別的。匯編產(chǎn)生一個(gè)OBJ文件,然后鏈接該OBJ文件,產(chǎn)生一個(gè)EXE文件。如果原先是以EXE文件格式,所編寫(xiě)的程序現(xiàn)在就可以執(zhí)行。如果原先所編寫(xiě)的程序是COM格式,鏈接程序會(huì)產(chǎn)生一個(gè)提示信息:

Warning:NoSTACKSegment對(duì)于這個(gè)信息,可以忽略,因?yàn)樗羌俣ū仨毝x堆棧段。利用EXE2BIN程序,再將EXE文件轉(zhuǎn)換成COM文件。假如你有一個(gè)源程序是EXE的格式,你可以使用編輯軟件修改一些指令,而使其成為COM文件的格式。4.2.2COM文件范例例4.2

COM文件程序范例。該程序是將兩個(gè)字單元FLDA、FLDB內(nèi)容相加,結(jié)果存入FLDC單元中。這個(gè)程序有以下特點(diǎn):(1)沒(méi)有堆棧段和數(shù)據(jù)段。(2)?ASSUME告訴匯編開(kāi)始的相對(duì)地址,是從代碼段的開(kāi)始算起。CS寄存器包含PSP的開(kāi)始地址。用ORG偽指令跳過(guò)PSP,將程序指針指向指令段地址第100H個(gè)字節(jié)處。(3)?JMP指令轉(zhuǎn)移執(zhí)行程序的控制權(quán),以便跳過(guò)數(shù)據(jù)定義部分。源程序清單如下:;filename:L42.ASMCODESEGMENTASSUMECS:CODE,DS:CODE,SS:CODE,ES:CODE ORG100H;程序起始放在PSP之后BEGIN:JMPMAIN;跳過(guò)數(shù)據(jù)區(qū);—————————————————————

FLDADW250OH ;定義數(shù)據(jù)

FLDBDW125OHFLDCDW?;—————————————————————MAINPROCNEARMOVAX,FLDA ;AX=0250ADDAX,FLDB ;Add0125toaxMOVFLDC,AX ;Storesuminfldc

RET ;ReturntodosMAINENDPCODEENDSENDBEGIN4.2.3COM文件的堆棧對(duì)于COM文件,DOS會(huì)自動(dòng)地定義堆棧段,并且設(shè)定相同的段地址給四個(gè)段寄存器(CS、DS、ES、SS)。若64K的地址范圍足夠存放你的程序,即你的程序長(zhǎng)度比64K小得多,DOS會(huì)將SP寄存器指向此段的結(jié)束位置,將其當(dāng)作堆棧的頂點(diǎn),其地址(即偏移地址)為FFFFH。假設(shè)64K的地址范圍,不足以提供足夠的空間給堆棧使用,DOS將堆棧設(shè)在存儲(chǔ)器結(jié)束的地方。對(duì)于上述兩種情況,DOS都會(huì)將空字符放入堆棧中。若你的程序很大或者受存儲(chǔ)器的限制,在堆棧中壓入字內(nèi)容時(shí),你必須很小心地處理。使用時(shí)應(yīng)當(dāng)利用DIR命令或其他方法,以便了解一個(gè)文件的大小,它將幫助你了解堆棧的可使用空間。4.3匯編語(yǔ)言程序的編輯、匯編、

鏈接與調(diào)試這一節(jié)是對(duì)本章內(nèi)容的練習(xí),通過(guò)對(duì)匯編語(yǔ)言源程序的編輯、匯編與鏈接過(guò)程的練習(xí)與上機(jī)操作,可幫助你加深了解可執(zhí)行文件EXE的初始化需求,掌握使程序正確返回DOS的方法。另外,還要練習(xí)如何將EXE文件轉(zhuǎn)換成為COM文件以及COM文件對(duì)程序格式的需求。練習(xí)中所使用的軟件如下:(MSDOS環(huán)境下)(1)全屏幕編輯軟件Edit。(2)宏匯編MASM。(3)?TASM匯編。練習(xí)內(nèi)容:(1)顯示HELLO字符十次,用RET返回DOS。(2)顯示HELLO字符五次,用INT21H返回DOS。(3)將EXE文件轉(zhuǎn)換為COM文件。4.3.1練習(xí)一:顯示HELLO十次1.程序清單;filenameL43.ASM;

—————————————————————DATASEGMENT;定義數(shù)據(jù)段

MESGDB‘HELLO’,0DH,0AH,‘$’;定義字節(jié)型字符串0DH回車(chē)符、0AH換行符

DATAENDS ;定義數(shù)據(jù)段結(jié)束;

—————————————————————

CODESEGMENT ;定義指令段

ASSUMECS:CODE,DS:DATA ;指明段寄存器所對(duì)應(yīng)的段

MAIN PROCFAR;定義過(guò)程或子程序PUSH DS ;保存返回地址

MOV AX,0 PUSH AX MOV AX,DATA;設(shè)置數(shù)據(jù)段初值MOV DS,AX MOV CX,10;設(shè)置循環(huán)次數(shù)

LAST: MOV AH,09;DOS功能調(diào)用09→AH MOV DX,OFFSETMESG

;返回MESG的偏移地址

INT 21H ;DOS功能調(diào)用

LOOP LAST ;CX-1→CX,CX≠0轉(zhuǎn)LAST

RET;返回DOSMAIN ENDP;定義過(guò)程結(jié)束

CODE ENDS;定義指令段結(jié)束

ENDMAIN

;源程序結(jié)束說(shuō)明:(1)該源程序含有兩個(gè)段,數(shù)據(jù)段DATA與指令段CODE。

(2)數(shù)據(jù)段定義了“HELLO”字符串,0DH回車(chē)符,0AH換行符。(3)?MOVAH,09是將DOS功能調(diào)用號(hào)09送AH。09號(hào)DOS功能調(diào)用的入口參數(shù)要求:09→AH,DS:DX指向字符串首地址,而且字符串必須以“$”結(jié)尾。(4)?ASSUME偽指令,指明各段對(duì)應(yīng)的寄存器;DS對(duì)應(yīng)數(shù)據(jù)段,CS對(duì)應(yīng)指令段。(5)?MAINPROCFAR

START:PUSHDS

MOVAX,0PUSHAX…RETMAINENDPDOS將MAIN視為一個(gè)子程序調(diào)用,并用RET返回。為數(shù)據(jù)段寄存器賦初值

(6)?MOVAX,DATA

?MOVDS,AX

(7)?MOVDX,OFFSETMESG是09號(hào)DOS功能調(diào)用要求的,將MESG的地址返回給DX。

(8)?ENDMAIN:源程序結(jié)束。定義代碼段(9)?CODESEGMENT

…?CODEENDS定義代碼段(10)?LOOP是一條循環(huán)指令,其操作首先執(zhí)行CX-1→CX,然后判斷CX是否等于0,若CX≠0則轉(zhuǎn)到LAST,若CX=0則執(zhí)行LOOP的下一條指令。2.操作步驟第一步:用EDIT編輯匯編語(yǔ)言源程序文件,命名為L(zhǎng)43.ASM。

顯示操作D\>EDIT回車(chē)進(jìn)入EDIT軟件全屏幕編輯狀態(tài),按程序清單逐條輸入源程序。第二步:存盤(pán)。在編輯狀態(tài)下,輸入完源程序之后,按ALT+F鍵下拉菜單出現(xiàn),選擇下拉菜單中的SAVE保存文件。注意,文件名的擴(kuò)展名必須是?.ASM,例如:L43.ASM。

第三步:退出EDIT。

存盤(pán)后按ALT+F鍵,選擇下拉菜單中的EXIT即退出EDIT,返回DOS狀態(tài)。第四步:對(duì)源程序進(jìn)行匯編。顯示操作D\>MASML43;回車(chē)匯編結(jié)束后會(huì)提示錯(cuò)誤信息和出錯(cuò)的行號(hào),請(qǐng)記錄下出錯(cuò)的行號(hào)。從第一步開(kāi)始,重新進(jìn)入編輯狀態(tài),在編輯狀態(tài)下改錯(cuò)。顯示操作D\>EDITL43.ASM回車(chē)調(diào)出源程序修改錯(cuò)誤,直到全部正確。重新存盤(pán)、匯編,匯編正確無(wú)誤后會(huì)產(chǎn)生目標(biāo)文件L43.OBJ;若有錯(cuò)誤,則不會(huì)產(chǎn)生目標(biāo)文件L43.OBJ。第五步:鏈接目標(biāo)文件。顯示操作D\>LINKL43;回車(chē)鏈接成功后會(huì)產(chǎn)生可執(zhí)行文件L43.EXE。鏈接過(guò)程中除了操作時(shí)輸入的命令符有可能出錯(cuò),一般無(wú)錯(cuò)誤。第六步:執(zhí)行可執(zhí)行文件L43.EXE。

顯示操作D\>L43回車(chē)屏幕上顯示十個(gè)HELLO字符串。練習(xí)一完成。4.3.2練習(xí)二:顯示HELLO五次1.程序清單;filename:L44.ASM;—————————————————————DATA SEGMENTMESG DB‘HELLO’,0DH,0AH,‘$’DATA ENDS;—————————————————————CODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVCX,5LAST: MOVAH,09 MOVDX,OFFSETMESG INT21H LOOPLAST

MOV

AH,4CH INT21H MAINENDPCODE ENDS ENDSTART說(shuō)明:(1)練習(xí)一與練習(xí)二相同,均是用DOS功能調(diào)用INT21H(功能號(hào)09)顯示一個(gè)字符串。(2)不同的是練習(xí)二的程序沒(méi)有以子程序的方式編寫(xiě);返回DOS的方法,使用DOS功能調(diào)用INT21H,功能號(hào)為4CH。2.操作步驟第一步:編輯源程序文件。提示:練習(xí)二與練習(xí)一的程序僅返回DOS的方法不同,程序指令部分完全相同,若使用練習(xí)一的源程序文件進(jìn)行修改會(huì)很方便。顯示操作

進(jìn)入編輯狀態(tài),更改文件名L43.ASM為L(zhǎng)44.ASM。操作如下:按ALT+F鍵下拉菜單出現(xiàn),選擇SAVE-AS將L43.ASM重新命名為L(zhǎng)44.ASM。然后,按L44.ASM當(dāng)前源程序修改并存盤(pán)、匯編,鏈接產(chǎn)生可執(zhí)行文件L44.EXE,最后執(zhí)行L44.EXE文件。方法參考練習(xí)一的第一步至第六步。D\>EDITL43.ASM回車(chē)進(jìn)入編輯狀態(tài),更改文件名L43.ASM為L(zhǎng)44.ASM。操作如下:按ALT+F鍵下拉菜單出現(xiàn),選擇SAVE-AS將L43.ASM重新命名為L(zhǎng)44.ASM。然后,按L44.ASM當(dāng)前源程序修改并存盤(pán)、匯編,鏈接產(chǎn)生可執(zhí)行文件L44.EXE,最后執(zhí)行L44.EXE文件。方法參考練習(xí)一的第一步至第六步。3.用DEBUG調(diào)試該程序可執(zhí)行文件L44.EXE可以在DOS下直接執(zhí)行,顯示五個(gè)HELLO字符。也可以用DEBUG逐條追蹤調(diào)試,方法如下。第一步:將L44.EXE裝入內(nèi)存。 顯示操作D\>DEBUGL44.EXE回車(chē)第二步:反匯編L44.EXE。

注意:觀察源程序清單中的各條可執(zhí)行指令在裝入內(nèi)存中是如何表示的,對(duì)照源程序清單逐條閱讀理解。顯示操作-U回車(chē)(或U0000回車(chē))顯示:15A9:0000B8A815 MOV AX,15A815A9:00038ED8 MOV DS,AX15A9:0005B90500 MOV CX,000515A9:0008B409

MOV AH,0915A9:000ABA0000 MOV DX,000015A9:000DCD21 INT

21說(shuō)明:(1)?15A9:0000表示EXE文件存放在指令段偏移地址0000處。(2)第1、2條指令確定數(shù)據(jù)段的段值,其位置在代碼段的前面一小節(jié)位置處。例如:代碼段地址為15A9:0000,而MOVAX,15A8指令中指出DS為15A8,它就是數(shù)據(jù)段的起始地址15A8:0000。(3)?MOVDX,OFFSETMESG會(huì)變?yōu)镸OVDX,0000,符號(hào)地址MESG會(huì)變?yōu)閷?shí)際偏移地址0000。第三步:查看數(shù)據(jù)段內(nèi)容。根據(jù)第一條指令MOVAX,15A8,可以確定數(shù)據(jù)段的起始地址是15A8:0000。(注意:應(yīng)按你所使用的系統(tǒng)顯示來(lái)確定。)顯示操作-D15A8:0000回車(chē)顯示:15A8:000048454C4C4F0D0A24-0000000000000000HELLO..$........可以觀察到數(shù)據(jù)段存儲(chǔ)的字符串“HELLO”與“$”。第四步:?jiǎn)尾阶粉櫝绦颉W⒁猓很浿袛嘀噶領(lǐng)NT21H不能用T命令直接執(zhí)行,當(dāng)執(zhí)行到INT21H時(shí)應(yīng)按下述方法操作,跳過(guò)INT21H。

顯示操作15A9:000DCD21INT21H-G000F回車(chē)這時(shí)屏幕會(huì)顯示HELLO字符,下面仍可繼續(xù)使用T命令執(zhí)行。練習(xí)二完成。4.3.3練習(xí)三:COM文件的生成

COM文件不需要分?jǐn)?shù)據(jù)段、指令段和堆棧段,數(shù)據(jù)、堆棧和指令全在一個(gè)段內(nèi);它們所占有的空間不允許超過(guò)64K。因此,在編制較小的程序時(shí)很方便,裝入速度比EXE文件要快,所占存儲(chǔ)空間比EXE文件小。使用COM文件時(shí),程序架構(gòu)不需要分段,整個(gè)程序的入口地址必須是0100H(256),因?yàn)榍?56字節(jié)為程序段前綴所占用,不必設(shè)置堆棧段。在程序裝入內(nèi)存時(shí),DOS會(huì)將SP寄存器指向此段的結(jié)束位置,當(dāng)作堆棧的頂點(diǎn),其值即偏移地址為FFFFH。1.COM文件源程序架構(gòu);—————————————————————CODESEGMENTASSUMECS:CODE,DS:CODE,SS:CODE(注意:CS、DS和SS均為為CODE)ORG100HBEGIN:JMPSHORTMAIN;—————————————————————數(shù)據(jù)區(qū):DB…DW…;—————————————————————;指令區(qū)——————————————————MAINPROCMEAR…RETMAIN

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論