微機(jī)原理chapter4課件_第1頁
微機(jī)原理chapter4課件_第2頁
微機(jī)原理chapter4課件_第3頁
微機(jī)原理chapter4課件_第4頁
微機(jī)原理chapter4課件_第5頁
已閱讀5頁,還剩166頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四章匯編語言程序設(shè)計(jì)§4.1匯編語言程序設(shè)計(jì)§4.2Win32匯編語言程序設(shè)計(jì)§4.1匯編語言程序設(shè)計(jì)一匯編語言上機(jī)過程二匯編語言程序結(jié)構(gòu)三指示性語句四BIOS和DOS功能調(diào)用五匯編語言程序設(shè)計(jì)

應(yīng)用軟件上機(jī)環(huán)境系統(tǒ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è)備二匯編語言程序結(jié)構(gòu)(一)程序結(jié)構(gòu)(二)語句結(jié)構(gòu)(一)程序結(jié)構(gòu)程序由數(shù)條語句構(gòu)成,每條語句占一行。指令性語句(指令語句)

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

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

程序中用到內(nèi)存操作數(shù)時(shí),應(yīng)按操作數(shù)的尋址方式,給相應(yīng)的段寄存器賦值;匯編語言程序結(jié)構(gòu)例一movs.asm;實(shí)現(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è)段構(gòu)成,至少有一個(gè)代碼段;匯編語言程序結(jié)構(gòu)例(子程結(jié)構(gòu))scans.asm;用二進(jìn)制顯示中斷向量表中(0:0~0:3FFH)數(shù)據(jù)D0H的個(gè)數(shù)keyEQU0D0H;用符號表示常量(關(guān)鍵字)codeSEGMENT;代碼段開始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;調(diào)用顯示子程

MOVAH,4CH;返回DOS

INT21H;用二進(jìn)制顯示BX內(nèi)容子程displayPROC

MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP

codeENDS;代碼段結(jié)束ENDbegin;指示程序結(jié)束和;程序入口一個(gè)簡化的源程序文件demosim.asm

.modelsmall

.stack .datastring db’Hello,Assembly!’,0dh,0ah,’$’

.code

start: movax,@data movds,ax movdx,offsetstring movah,9 int21h movax,4c00h int21h

endstart簡化的匯編語言程序框架(適用于masm5.0/6.0版本) .modelsmall ;定義程序的存儲模式(小型模式) .stack ;定義堆棧段(默認(rèn)是1KB空間) .data ;定義數(shù)據(jù)段 …… ;數(shù)據(jù)定義 .code ;定義代碼段start: movax,@data ;程序起始點(diǎn) movds,ax ;設(shè)置DS指向用戶定義的數(shù)據(jù)段 …… ;程序代碼 movax,4c00h int21h ;程序結(jié)束點(diǎn),返回DOS …… ;子程序代碼 endstart ;匯編結(jié)束,同時(shí)指明程序起始點(diǎn)start存儲模式存儲模式特點(diǎn)TINY(微型模式)COM類型程序,只有一個(gè)小于64KB的邏輯段(MASM6.x支持)SMALL(小型模式)小應(yīng)用程序,只有一個(gè)代碼段和一個(gè)數(shù)據(jù)段(含堆棧段),每段不大于64KBCOMPACT(緊湊模式)代碼少、數(shù)據(jù)多的程序,只有一個(gè)代碼段,但有多個(gè)數(shù)據(jù)段MEDIUM(中型模式)代碼多、數(shù)據(jù)少的程序,可有多個(gè)代碼段,只有一個(gè)數(shù)據(jù)段LARGE(大型模式)大應(yīng)用程序,可有多個(gè)代碼段和多個(gè)數(shù)據(jù)段(靜態(tài)數(shù)據(jù)小于64KB)HUGE(巨型模式)更大應(yīng)用程序,可有多個(gè)代碼段和多個(gè)數(shù)據(jù)段(對靜態(tài)數(shù)據(jù)沒有限制)FLAT(平展模式)32位應(yīng)用程序,運(yùn)行在32位80x86CPU和Windows9x或NT環(huán)境可執(zhí)行程序的結(jié)構(gòu)DOS操作系統(tǒng)支持兩種可執(zhí)行程序結(jié)構(gòu)1.EXE程序程序可以有多個(gè)代碼段和多個(gè)數(shù)據(jù)段,程序長度可以超過64KB通常生成EXE結(jié)構(gòu)的可執(zhí)行程序2.COM程序只有一個(gè)邏輯段,程序長度不超過64KB需要滿足一定條件才能生成COM結(jié)構(gòu)的可執(zhí)行程序(MASM6.x需要采用TINY模式)(二)語句結(jié)構(gòu)

dataSEGMENT;數(shù)據(jù)段varDB?dataENDScodeSEGMENT;代碼段ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDSENDstart例:1.名字項(xiàng)

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

名字項(xiàng)可用來表示段名、變量名、標(biāo)號、過程名以及常量名等。dataSEGMENT;數(shù)據(jù)段varDB?dataENDScodeSEGMENT;代碼段ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDSENDstart匯編語言中的保留字保留字(ReservedWord)是匯編程序已經(jīng)利用的標(biāo)識符(也稱為關(guān)鍵字),主要有:指令助記符——例如:MOV、ADD偽指令助記符——例如:DB、DW操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS預(yù)定義符號——例如:@data

匯編語言大小寫不敏感2.助記符項(xiàng)助記符可以是指令、偽操作中的助記符。對于指令,匯編程序?qū)⑵浞g成機(jī)器語言指令。

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

→data與一段值對應(yīng)stringDB‘LiaoDa’→string與一內(nèi)存地址對應(yīng)3.操作數(shù)項(xiàng)操作數(shù)給出參與操作的數(shù)或數(shù)所在的地方。操作數(shù)多于一個(gè)時(shí),用逗號分開。操作數(shù)可以是常數(shù)、寄存器、存儲器操作數(shù)、標(biāo)號名、過程名或表達(dá)式等。

A、B、C、D、E、F開頭的十六進(jìn)制數(shù)前面加0,與H結(jié)尾的標(biāo)識符區(qū)別。如寄存器名AH、BH、CH、

DH

變量名abcdH

等例

movAL,0AH

movAL,AH

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

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

、、、

;MOVAH,2;顯示提示信息

;MOVDL,’A’

;INT21H

、、、三指示性語句 (一)程序開始和結(jié)束

(二)段定義

(三)變量定義

(四)ASSUME語句

(五)表達(dá)式中的操作符

(六)過程定義

(七)等值定義

(八)數(shù)值回送操作符指示性語句與指令性語句指令(Instruction)——使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的指令硬指令就是處理器指令,與具體的處理器有關(guān)、與匯編程序無關(guān)偽指令(Directive)——不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說明性指令偽指令與具體的處理器類型無關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令

指令和偽指令采用易于記憶的符合表達(dá),這就是助記符指示性語句與指令性語句區(qū)別一個(gè)程序經(jīng)匯編,連接和裝入內(nèi)存后,在執(zhí)行程序之前:

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

◢而指令性語句的功能尚未完成,需控制CPU去執(zhí)行,才能完成。aaSEGMENT;數(shù)據(jù)段1

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

str2DB6dup(?)bbENDSccSEGMENT;代碼段

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

MOVDS,AXLEASI,str1MOVAX,bb

MOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstart

D:\masm>DEBUGhello2.exe-U:查看代碼段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,[0000]12A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,[0000]12A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、、、-D129E:0L10;查看數(shù)據(jù)段1的內(nèi)容129E:000048656C6C6F210000-0000000000000000Hello!-D129F:0L10;查看數(shù)據(jù)段2的內(nèi)容129F:00000000000000000000-0000000000000000

-數(shù)據(jù)傳送源程序hello2.asm程序經(jīng)匯編、連接后,裝入內(nèi)存的情況如下:2.END偽操作

格式

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

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

0WarningErrors

0SevereErrorsD:\由于沒有END語句,匯編程序根本沒對源程序進(jìn)行匯編,此時(shí)顯示警告性錯(cuò)誤總數(shù)為0,嚴(yán)重性錯(cuò)誤總數(shù)為0,用戶不要被此值的誤導(dǎo)。啟動(dòng)地址可是一個(gè)標(biāo)號或過程名,指示程序的入口。程序裝入內(nèi)存后,系統(tǒng)跳轉(zhuǎn)到入口處,開始執(zhí)行程序。aaSEGMENT;數(shù)據(jù)段1str1DB'Hello!’aaENDSbbSEGMENT;數(shù)據(jù)段2str2DB6dup(?)bbENDSccSEGMENT;代碼段ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,SEGstr2MOVES,AXMOVDI,OFFSETstr2MOVCX,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-(二)段定義偽操作

格式

段名SEGMENT、、、、、、段名ENDS

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

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

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

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

str2DB6dup(?)bbENDSccSEGMENT;代碼段

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

MOVDS,AXLEASI,str1MOVAX,bb

MOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstart

D:\masm>DEBUGhello2.exe-U:查看代碼段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,[0000]12A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,[0000]12A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、、、-D129E:0L10;查看數(shù)據(jù)段1的內(nèi)容129E:000048656C6C6F210000-0000000000000000Hello!-D129F:0L10;查看數(shù)據(jù)段2的內(nèi)容129F:00000000000000000000-0000000000000000

-數(shù)據(jù)傳送源程序:程序經(jīng)匯編、連接后,裝入內(nèi)存的情況如下:(三)變量定義偽操作

格式

變量名類型助記符操作數(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ù)為雙字類型例:定義賦初值的變量dataSEGMENT

xxDB1,-1,0fcH

yyDW1,-1,0fcH

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

str1DB'Liaochen'

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

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

aaDB270bbDW80000

用?

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

ccDB?

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

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

eeDB3DUP(4)

等價(jià)于eeDB4,4,4dataSEGMENTxxDB1,-1,0FCHyyDW1,-1,0FCHzzDD1,-1,0FCHstrDB'TsingHua'bufDB4,?,4DUP(?)DB‘dataend’dataENDScodeSEGMENTASSUMECS:codeASSUMEDS:datastart:MOVAX,dataMOVDS,AXLEABX,xxLEASI,yyLEADI,zzMOVAH,4CHINT21HcodeENDSENDstart例:在DEBUG下查看變量存放情況。(四)ASSUME偽操作

格式

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

其中段寄存器為CS、DS、ES、SS中的一個(gè)

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

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

對變量可用CS、DS、ES、SS段寄存器指示若未用ASSUME語句指示指令中用到的標(biāo)號、過程和變量所在的段,匯編程序?qū)⒔o出錯(cuò)誤信息。

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

用程序?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

codeENDSENDstart注釋掉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>程序中有ASSUME語句,經(jīng)匯編,連接和裝入內(nèi)存后的情況:dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;給DS賦值MOVDS,AXMOVAX,value;取數(shù)ADDAX,value+2;兩數(shù)相加MOVresult,AX;保存結(jié)果MOVAH,4CH;返回DOSINT21HcodeENDSD:\MASM>DEBUGassume.exe-R;查看程序執(zhí)行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A5-U;查看在內(nèi)存的程序12A6:0000B8A512MOVAX,12A512A6:00038ED8MOVDS,AX12A6:0005A10000MOVAX,[0000]12A6:0ADDAX,[0002]12A6:000CA30400MOV[0004],AX12A6:000FB44CMOVAH,4C12A6:0011CD21INT21、、、、、-注意:

程序裝入內(nèi)存后,執(zhí)行程序前,當(dāng)前的DS值并非程序定義的data段值,1295不等于12A5思考:

如果上例中沒有MOVDS,AX程序執(zhí)行的結(jié)果會怎樣?D:\MASM>DEBUGassume.exe-R;查看程序執(zhí)行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A5-U;查看在內(nèi)存的程序12A6:0000B8A512MOVAX,12A512A6:0003A10000MOVAX,[0000]12A6:0ADDAX,[0002]12A6:000AA30400MOV[0004],AX12A6:000DB44CMOVAH,4C12A6:000FCD21INT21、、、、、dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;給DS賦值

;MOVDS,AXMOVAX,value;取數(shù)ADDAX,value+2;兩數(shù)相加MOVresult,AX;保存結(jié)果MOVAH,4CH;返回DOSINT21HcodeENDS結(jié)論:1.ASSUME語句只起指示作用,沒有賦值作用2.程序中用到內(nèi)存操作數(shù)時(shí),應(yīng)按操作數(shù)的尋址方式,給相應(yīng)的段寄存器賦值。匯編語言程序舉例

了解DOS的返回,裝入功能

例將BL寄存器的內(nèi)容按二進(jìn)制形式顯示出來(BL)

MOVCX,8;顯示字符個(gè)數(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é)束、、、3130313030313130codeSEGMENTASSUMECS:codestart:

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

ENDstartMOVCX,8;顯示字符個(gè)數(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é)束D:\>MASMSBL;

匯編成ShowBL.objMicrosoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.48912+447243Bytessymbolspacefree0WarningErrors0SevereErrorsD:\>LINKSBL;

連接成ShowBL.exeMicrosoft(R)OverlayLinkerVersion3.61Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.LINK:warningL4021:nostacksegmentD:\>SBL

裝載并執(zhí)行ShowBL.exeD:\>DEBUGSBL.exe

;用DEBUG裝入程序-U

0B5E:0000B90800MOVCX,00080B5E:0003D0E3SHLBL,10B5E:00057205JB000C0B5E:0007B230MOVDL,300B5E:0009EB03JMP000E0B5E:000B90NOP0B5E:000CB231MOVDL,310B5E:000EB402MOVAH,020B5E:0010CD21INT210B5E:001249DECCX0B5E:001375EEJNZ00030B5E:001509E8ORAX,BP0B5E:001796XCHGSI,AX0B5E:001800F8ADDAL,BH0B5E:001AB262MOVDL,620B5E:001CFFFF???DI

0B5E:001DEB0AJMP0029-hello.exe用戶程序與用戶程序相連的內(nèi)存內(nèi)容被看作程序時(shí)死機(jī)復(fù)習(xí)DOS系統(tǒng)的啟動(dòng)過程執(zhí)行用戶程序后,若要返回DOS狀態(tài),即在屏幕上出現(xiàn)DOS提示符,等待輸入新的命令,應(yīng)在用戶程序的最后安排完成此功能的程序段。通常采用調(diào)用DOS系統(tǒng)功能完成。調(diào)用DOS系統(tǒng)的4CH功能,返回DOS方法:在要返回DOS處,安排指令:

MOVAH,4CHINT21H執(zhí)行完4CH的功能調(diào)用,即返回DOS。例codeSEGMENTASSUMECS:codestart:、、、;程序主體部分、、、、、、

MOVAH,4CH

;返回DOS

INT21HcodeENDS

ENDstartcodeSEGMENTASSUMECS:codestart:

…;程序主體部分.........MOVAH,4CH

;返回DOS

INT21HcodeENDS

ENDstart一個(gè)完整匯編程序的基本框架:DOS的裝入功能(又稱EXEC系統(tǒng)功能)

可執(zhí)行文件.exe,應(yīng)裝入內(nèi)存方能執(zhí)行。由DOS的裝入功能完成。在DOS的提示符后輸入可執(zhí)行文件的文件名,按回車鍵,DOS系統(tǒng)即調(diào)用裝入功能,

將可執(zhí)行程序裝入內(nèi)存。完成以下操作:

確定內(nèi)存可用部分,以便存放要執(zhí)行的.exe文件。

建立程序段前綴PSP

(ProgramSegmentPrefix)

程序段前綴大小100H,即256個(gè)字節(jié)。

存放進(jìn)程間的控制信息。

PSP最開始的兩個(gè)字節(jié)CD20,是一條INT20H指令。

裝入可執(zhí)行程序.exeDOS的裝入功能修改以下寄存器的值◢

DS、ES設(shè)置為程序段前綴所在內(nèi)存的段值;

(DS)=xxxxH(ES)=xxxxH◢

SS、SP設(shè)置為由連接程序傳過來的值;◢

CS、IP設(shè)置為

程序的入口地址,即偽操作END后跟的符號名對應(yīng)的物理地址;

此時(shí)CS:IP

指向用戶程序,開始執(zhí)行用戶程序。D:\>DEBUGShowBL.exe-R

;查看當(dāng)前寄存器內(nèi)容AX=0000BX=0000CX=001BDX=0000SP=0000BP=0000SI=0000DI=0000DS=0B51ES=0B51SS=0B61CS=0B61IP=0000NVUPEIPLNZNAPONC0B61:0000B353MOVBL,53-U

;查看程序代碼0B61:0000B353MOVBL,530B61:0002B90800MOVCX,0008…...0B61:0017B44CMOVAH,4C0B61:0019CD21INT21-DDS:0L20

;查看此時(shí)數(shù)據(jù)段內(nèi)容(程序段前綴)0B51:0000CD20FF9F009AF0FE-1DF04F035A058A030B51:00105A0517035A054905-0101010002FFFFFF-UDS:0L5

;反匯編當(dāng)前數(shù)據(jù)段內(nèi)容(程序段前綴)

0B51:0000CD20

INT200B51:0002FF9F009ACALLFAR[BX+9A00]-在DEBUG下查看ShowBL.exe的裝入情況:-R

;查看當(dāng)前寄存器內(nèi)容AX=0000BX=0000CX=001BDX=0000SP=0000BP=0000SI=0000DI=0000DS=0B51ES=0B51SS=0B61CS=0B61IP=0000NVUPEIPLNZNAPONCB353MOVBL,53

-UCS:0

;查看程序

0B61:0000B353MOVBL,530B61:0002B90800MOVCX,00080B61:0005D0E3SHLBL,10B61:00077205JB000E…….0B61:0017B44CMOVAH,4C0B61:0019CD21INT21…….-G;執(zhí)行程序Programterminatednormally-注意:不能破壞程序段前綴內(nèi)容,否則無法返回DOS,造成死機(jī)。第二種DOS返回方法,調(diào)用20H類型的中斷程序◢20H中斷程序的功能:處理程序結(jié)束,返回系統(tǒng)。◢調(diào)用20H中斷程序是有條件的:要求當(dāng)前的CS應(yīng)為程序段前綴在內(nèi)存的段值問題:如何保證執(zhí)行到INT20H時(shí),當(dāng)前CS的值為程序段前綴在內(nèi)存的段值?采用下面的程序框架,可保證執(zhí)行INT20H時(shí),當(dāng)前的CS值為程序段前綴在內(nèi)存的段值。codeSEGMENTASSUMECS:codemainPROCFAR

;使RET為遠(yuǎn)返回

start:PUSHDS

;入棧保存地址

MOVAX,0

;程序段前綴的首地址

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

RET

;取程序段前綴首地址mainENDPcodeENDSENDstart注意:1.不可在匯編語言程序的最后用INT20H返回DOS。

原因是20h中斷子程的執(zhí)行是有條件的。采用第二種返回DOS的程序結(jié)構(gòu),才能滿足該條件,否則無法返回。2.不可在程序的最后用INT3返回DOS。

原因是3類型的中斷子程實(shí)現(xiàn)斷點(diǎn)設(shè)置,只在DEBUG下起作用。(五)表達(dá)式及表達(dá)式中的操作符表達(dá)式由常量、標(biāo)號、變量和一些操作符構(gòu)成。匯編程序?qū)Ρ磉_(dá)式進(jìn)行運(yùn)算后,得到一個(gè)確定的數(shù)值,再把這個(gè)數(shù)值匯編到指令中。據(jù)表達(dá)式所表示的內(nèi)容,分?jǐn)?shù)字表達(dá)式、地址表達(dá)式。表達(dá)式是指令或偽操作的操作數(shù);

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

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

LEABX,[string+4];地址表達(dá)式

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

真:FFFFH;假:04.

數(shù)值返回操作符(SEG、OFFSET)5.類型操作(PTR)6.地址記數(shù)器($)例:

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

4.數(shù)值返回操作符(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

ENDstartaa 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,yy注意:SEG、OFFSET只能對符號地址操作MOVAX,SEG[BX]MOVBX,OFFSET[SI]匯編語言程序舉例編寫完整匯編語言程序,完成內(nèi)存數(shù)據(jù)塊傳送功能。將某段中的字符串“Hello!”傳送到另一段中。例編寫完整匯編語言程序,完成內(nèi)存數(shù)據(jù)塊傳送功能。將某段中的字符串“Hello!”傳送到另一段中。利用變量定義字符串和緩沖區(qū)aa 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;指示指令中標(biāo)號,變量所在段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é)束和程序入口D:\>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:\>D:\>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,4C

溫馨提示

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

評論

0/150

提交評論