版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- AI輔助下的大學(xué)英語寫作教學(xué)的探索-基于輸入輸出理論
- 多模態(tài)核素治療
- 基于大數(shù)據(jù)的故障分析
- 沖調(diào)產(chǎn)品知識課件
- 2025年職業(yè)道德與衛(wèi)生法律法規(guī)高頻考題及答案(共280題)
- 福建生物二模試卷及答案
- 單招語文大綱試卷及答案
- 綠化改造合同范本
- 遼寧高考全科試卷及答案
- 2025年八省聯(lián)考湖南試卷及答案
- 醫(yī)學(xué)一等獎(jiǎng)《白血病》課件
- JCT587-2012 玻璃纖維纏繞增強(qiáng)熱固性樹脂耐腐蝕立式貯罐
- 金屬制品廠電泳生產(chǎn)線安全風(fēng)險(xiǎn)分級清單
- 醫(yī)療器械臨床評價(jià)報(bào)告模板
- 污染場地調(diào)查評價(jià)與修復(fù)
- 生物計(jì)算機(jī)課件
- 浙江省優(yōu)秀安裝質(zhì)量獎(jiǎng)創(chuàng)優(yōu)計(jì)劃申報(bào)表實(shí)例
- 新時(shí)代背景下企業(yè)人力資源管理的數(shù)字化轉(zhuǎn)型探研共3篇
- 奧的斯電梯toec-40調(diào)試方法
- 化工原理(下)第4章液液萃取
- 重點(diǎn)監(jiān)管的危險(xiǎn)化學(xué)品名錄(完整版)
評論
0/150
提交評論