第4章 程序加載并執(zhí)行.ppt_第1頁
第4章 程序加載并執(zhí)行.ppt_第2頁
第4章 程序加載并執(zhí)行.ppt_第3頁
第4章 程序加載并執(zhí)行.ppt_第4頁
第4章 程序加載并執(zhí)行.ppt_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第4章 程序加載與執(zhí)行,本章重點(diǎn):本章主要介紹了操作系統(tǒng)概念、BIOS啟動程序及系統(tǒng)加載程序;要求熟悉DEBUG調(diào)試程序的應(yīng)用環(huán)境,掌握DEBUG命令的基本格式及其使用方法;匯編語言源程序的編輯、匯編、連接的方法。,課程介紹,4.1 操作系統(tǒng)的組成 4.2 BIOS 啟動程序 4.3 系統(tǒng)加載程序 4.4 調(diào)試程序DEBUG應(yīng)用舉例 4.5 匯編語言程序的運(yùn)行,4.1 操作系統(tǒng)的組成,操作系統(tǒng)OS(Operating System)是計(jì)算機(jī)管理和控制計(jì)算機(jī)系統(tǒng)中的硬件及軟件資源、合理地組織計(jì)算機(jī)工作流程,以便有效利用這個(gè)資源為用戶提供一個(gè)功能強(qiáng)大、使用方便和可擴(kuò)充的工作環(huán)境,從而在計(jì)算機(jī)與用戶

2、之間起到接口作用。具有處理機(jī)管理、存儲管理、設(shè)備管理、文件管理、用戶接口等功能。構(gòu)成微型計(jì)算機(jī)操作系統(tǒng)的組件包括以下項(xiàng)目:,處理機(jī)管理組件,處理機(jī)對其運(yùn)行進(jìn)程有效控制和管理。在多道程序環(huán)境下,處理機(jī)的分配和運(yùn)行都是以進(jìn)程為基本單位。執(zhí)行進(jìn)程控制、進(jìn)程同步、進(jìn)程通信、進(jìn)程調(diào)度等操作。當(dāng)系統(tǒng)運(yùn)行應(yīng)用程序時(shí),處理機(jī)管理組件必須先為它創(chuàng)建一個(gè)或幾個(gè)進(jìn)程,并給它分配必要的資源。進(jìn)程結(jié)束的時(shí)候要立即撤消這個(gè)進(jìn)程,以便收回該進(jìn)程所占用的各類資源,進(jìn)程控制的主要任務(wù)就是為作業(yè)創(chuàng)建進(jìn)程,撤銷已結(jié)束的進(jìn)程以及控制進(jìn)程在運(yùn)行中的狀態(tài)轉(zhuǎn)換。,進(jìn)程同步的主要任務(wù)是對諸進(jìn)程的運(yùn)行進(jìn)行協(xié)調(diào)。進(jìn)程調(diào)度從進(jìn)程的就緒隊(duì)列中,按照

3、一定的算法選出一個(gè)進(jìn)程,把處理機(jī)分配給它。 內(nèi)存管理組件 當(dāng)程序從磁盤載入相應(yīng)的內(nèi)存空間時(shí),內(nèi)存管理組件配置一塊足夠程序運(yùn)行的內(nèi)存空間給該程序,包括指令、數(shù)據(jù)及堆??臻g。內(nèi)存分配為每道程序分配內(nèi)存空間,減少不可用的內(nèi)存空間。內(nèi)存保護(hù)為確保每道用戶程序都在自己的內(nèi)存空間中運(yùn)行,互不干擾。內(nèi)存擴(kuò)充是借助于虛擬存儲技術(shù),從邏輯上去擴(kuò)充內(nèi)存容量。,若內(nèi)存中已沒有足夠的空間來裝入調(diào)入程序的時(shí)候,系統(tǒng)能將內(nèi)存中的一部分暫時(shí)不用的程序和數(shù)據(jù)調(diào)到磁盤上,以騰出更多的內(nèi)存空間. 設(shè)備管理組件 設(shè)備管理組件用來完成用戶提出的I/O請求,為用戶分配I/O設(shè)備,提高CPU和I/O設(shè)備的利用率。具體包括:緩沖管理是管理

4、好各類型的緩沖區(qū),以緩和CPU和I/O設(shè)備速度不匹配的矛盾。設(shè)備分配是根據(jù)用戶的I/O請求,為之分配其所需的設(shè)備。設(shè)備處理的基本任務(wù)是實(shí)現(xiàn)CPU和設(shè)備之間的通信。虛擬設(shè)備把每次只允許一個(gè)進(jìn)程使用的物理設(shè)備變換為多個(gè)對應(yīng)的,邏輯設(shè)備,提高了設(shè)備的利用率,使每個(gè)用戶感覺自己在獨(dú)占該設(shè)備。 輸入輸出組件 對用戶文件和系統(tǒng)文件進(jìn)行管理,方便用戶的使用。程序需要從系統(tǒng)輸入數(shù)據(jù)或?qū)?shù)據(jù)輸出,這要靠中斷來處理,使得程序設(shè)計(jì)者免于自己設(shè)計(jì)低級的輸入輸出程序。,文件管理組件 操作系統(tǒng)維護(hù)存儲在系統(tǒng)磁盤的文件(file)及目錄(directory),對用戶文件和系統(tǒng)文件進(jìn)行管理,方便用戶的使用。程序可建立(cre

5、ate)及更新(update)文件數(shù)據(jù),但操作系統(tǒng)負(fù)責(zé)處理數(shù)據(jù)存放在磁盤的位置。 中斷處理組件 操作系統(tǒng)提供中斷處理機(jī)制,讓您可以輕松地訪問存儲于外部設(shè)備的數(shù)據(jù)。,4.2 BIOS 啟動程序,當(dāng)我們打開計(jì)算機(jī)的電源開關(guān)時(shí),處理器進(jìn)入復(fù)位(Reset)狀態(tài),將所有內(nèi)存清零,并執(zhí)行內(nèi)存同位測試,將段寄存器CS的內(nèi)容設(shè)為FFFFH,其他寄存器都清零,IP=0000H。因此第一個(gè)要執(zhí)行的指令是位于CS:IP中的指令,它的物理地址為0FFFF0H,所以將存儲器的高地址分配給ROM BIOS,作為BIOS的入口地址。,隨后BIOS啟動一個(gè)程序,進(jìn)行主機(jī)自檢,主機(jī)自檢的主要工作是確保系統(tǒng)的每一個(gè)部分都得到了

6、電源支持,內(nèi)存儲器、主板上的其它芯片、鍵盤、鼠標(biāo)、磁盤控制器及一些I/O端口正常可用,此后,自檢程序?qū)⒖刂茩?quán)還給BIOS。接下來BIOS讀取BIOS設(shè)置,得到引導(dǎo)驅(qū)動器的順序,依次檢查。BIOS將所檢查磁盤的第一個(gè)扇區(qū)(512B)載入內(nèi)存,放在0 x0000:0 x7c00處,如果這個(gè)扇區(qū)的最后兩個(gè)字節(jié)是“55AAH”,那么這就是一個(gè)引導(dǎo)扇區(qū),磁盤也就是一塊可引導(dǎo)盤,調(diào)用該驅(qū)動器上磁盤的引導(dǎo)扇區(qū)進(jìn)行引導(dǎo)。,BIOS在ROM中提供一組例行程序支持的用于在設(shè)備上的數(shù)據(jù)的訪問。BIOS的例行程序位于FFFF00H,它檢查各個(gè)輸入輸出I/O端口,然后對于存在的設(shè)備進(jìn)行初始化,接著BIOS建立兩個(gè)數(shù)據(jù)區(qū)

7、: 1中斷向量表 中斷向量表是中斷類型號與對應(yīng)的中斷處理程序之間的連接表,他提供了各種中斷類型號對應(yīng)的中斷服務(wù)程序的入口地址。中斷向量表占用主存儲器至少1KB的地址空間,地址范圍是00000H003FFH。表內(nèi)內(nèi)容分256項(xiàng),分別對應(yīng)256個(gè)中斷類型號0255。,每個(gè)中斷類型號對應(yīng)4字節(jié)長的存儲單元,存放中斷處理程序首地址(為32位),其邏輯地址格式為: 段地址:偏移地址 ;(如0 x000000 x003FF共1024單元為中斷向量表存儲區(qū)域) 當(dāng)中斷發(fā)生時(shí),BIOS及操作系統(tǒng)使用中斷向量表來執(zhí)行該中斷例行程序。 2BIOS 數(shù)據(jù)區(qū) BIOS駐留在系統(tǒng)板上ROM中,其物理地址是FE000HF

8、FFFFH,共8KB字節(jié)。BIOS除駐留在ROM中外,還使用了RAM數(shù)據(jù)區(qū),BIOS 數(shù)據(jù)區(qū)的起始地址為00400H,其大小依設(shè)備的多少而定。,BIOS程序是靠近硬件例行程序,直接對外部設(shè)備進(jìn)行輸入/輸出操作,用戶通過中斷方式進(jìn)行功能調(diào)用。BIOS程序由許多功能模塊組成,每個(gè)功能模塊的入口地址都在中斷矢量表中。 接著BIOS檢查系統(tǒng)磁盤是否存在,并從系統(tǒng)磁盤載入啟動程序,啟動程序隨后從系統(tǒng)磁盤加載系統(tǒng)文件至內(nèi)存,并將控制權(quán)交給操作系統(tǒng)。 操作系統(tǒng)的一個(gè)主要任務(wù)是與BIOS產(chǎn)生互動。當(dāng)需要BIOS提供服務(wù)時(shí)操作系統(tǒng)會調(diào)用BIOS的相關(guān)例行程序。,4.3 系統(tǒng)加載程序,一旦BIOS將控制權(quán)交給操作

9、系統(tǒng)之后,就可以向操作系統(tǒng)申請運(yùn)行程序了。可執(zhí)行的程序有兩種:*.com程序及*.exe程序。程序在內(nèi)存的配置情況如圖4-1所示。 一個(gè)*.com的程序只包含一個(gè)段,段內(nèi)包括指令、數(shù)據(jù)及堆棧,這種程序小而精,適合用于小的應(yīng)用程序或常駐程序。匯編語言絕大部分的程序均使用*.exe的格式。 這里*.com程序被加載運(yùn)行時(shí)有下列的特點(diǎn):,.一個(gè)*.com程序占用一個(gè)段(64KB)的運(yùn)行空間,PSP(Program Segment Prefix)、指令、數(shù)據(jù)及堆棧都安排在這個(gè)段內(nèi)。段寄存器CS、DS、ES及SS均指到這一段的起始地址。 段內(nèi)安排以程序段前綴PSP在前,指令及數(shù)據(jù)居中,堆棧則安排在段的高

10、地址部分。PSP占用256個(gè)字節(jié)的空間,因此第一個(gè)指令的偏移地址必須從0100H開始,IP寄存器的初值即是0100H。 PSP及堆棧都由系統(tǒng)配置,系統(tǒng)會在堆棧頂端存入兩個(gè)字節(jié),其內(nèi)容為零值,SP就指到這個(gè)零值的數(shù)據(jù)項(xiàng),這時(shí)SP的內(nèi)容為0FFFEH。,具體的*.com的程序編寫參考第5章的5.5.2節(jié)匯編語言程序的可執(zhí)行文件。,圖4-1 PC-DOS的內(nèi)存配置(a為DOS啟動后,b為用戶程序裝入后), EXE可執(zhí)行文件有以下特點(diǎn): 在實(shí)體模式下,一個(gè)*.exe格式的程序分別包含指令段、數(shù)據(jù)段及堆棧段,這種程序是較為嚴(yán)謹(jǐn)?shù)囊环N,適合用于大型的應(yīng)用程序,或結(jié)合多種目標(biāo)程序(object progra

11、m)的大型程序。 通常*.exe程序被加載運(yùn)行時(shí)運(yùn)行下列步驟: 從磁盤取得*.exe程序。 在內(nèi)存里為該程序建立一個(gè)占256字節(jié)的程序段前綴PSP區(qū)域,存放所要執(zhí)行程序的有關(guān)信息。再將*.exe程序放在PSP后端,并為程序定位。內(nèi)存分配見圖4-3-1, 將PSP地址存入DS及ES寄存器中。 將指令段的地址存入CS段寄存器中,同時(shí)將CS內(nèi)第一個(gè)要執(zhí)行的指令的偏移地址存入IP寄存器中。 棧地址存入SS段寄存器中,同時(shí)將SP的值設(shè)定為堆棧長度。 將控制權(quán)交給*.exe程序,執(zhí)行第一個(gè)指令,開始執(zhí)行程序。 從上面的步驟可以看出系統(tǒng)加載程序幫我們設(shè)定了CS:IP地址,也設(shè)定了SS:SP地址,但卻將PSP

12、地址存入DS及ES,因此如果我們想讓DS及ES指到自己的數(shù)據(jù)段,必須通過自己設(shè)定 。,4.4 調(diào)試程序DEBUG應(yīng)用舉例,DEBUG.EXE程序是專門為分析、研制和開發(fā)匯編語言程序而設(shè)計(jì)的一種調(diào)試工具,具有跟蹤程序執(zhí)行、觀察中間運(yùn)行結(jié)果、顯示和修改寄存器或存儲單元內(nèi)容等多種功能。它能使程序設(shè)計(jì)人員或用戶觸及到機(jī)器內(nèi)部,因此可以說它是80X86CPU的心靈窗口,也是我們學(xué)習(xí)匯編語言必須掌握的調(diào)試工具,必須熟練掌握其一些的命令的使用。,4.4.1 DEBUG程序的啟動和退出 1直接啟動 DEBUG.EXE是DOS環(huán)境下的可執(zhí)行程序。在DOS提示符下鍵入命令: 如:C: DEBUG 在調(diào)用DEBUG

13、程序后,出現(xiàn)“一”提示符,等待使用DEBUG命令。 2啟動DEBUG并裝入需要調(diào)試的用戶程序 命令格式: C: DEBUG 盤符:路徑文件名.EXE參數(shù)1參數(shù)2,這時(shí)屏幕上出現(xiàn)DEBUG的提示符“-”,表示系統(tǒng)在DEBUG管理之下,此時(shí)可以用DEBUG進(jìn)行程序調(diào)試。若所有選項(xiàng)省略,僅把DEBUG裝入內(nèi)存,可對當(dāng)前內(nèi)存中的內(nèi)容進(jìn)行調(diào)試,或者再用N和L命令,從指定盤上裝入要調(diào)試的程序;若命令行中有文件名,則DOS把DEBUG程序調(diào)入內(nèi)存后,再由DEBUG將指定的文件名裝入內(nèi)存。 如C:DEBUG EXAMPLE.EXE 其中EXAMPLE是文件名,擴(kuò)展名是EXE,例如我們在此前已編譯好了一個(gè)文件,

14、它的名字為:EXAMPLE.exe要對它進(jìn)行調(diào)試時(shí)就在 DOS提示符下打:DEBUG djx.exe 回車,便可見到DEBUG 提示符-,如無任何提示說明正確,可進(jìn)行調(diào)試。,DOS在調(diào)用DEBUG程序后,再由DEBUG把被調(diào)試文件裝入內(nèi)存。當(dāng)被調(diào)試文件的擴(kuò)展名為COM時(shí),裝入偏移量為01OOH的位置:當(dāng)擴(kuò)展名為EXE時(shí),裝入偏移量為0000H的位置,并建立程序段前綴(PSP),為CPU寄存器設(shè)置初始值。 4.4.2 DEBUG程序的常用命令 啟動C:DEBUG ;出現(xiàn)提示符“”時(shí),就可以使用DEBUG的所有命令。,1DEBUG下匯編語言的語法規(guī)則 所有數(shù)值全為十六進(jìn)制數(shù),且不需要加后綴H; 只

15、能使用DB或DW,直接把字節(jié)、字的數(shù)值或字符串的ASC碼送入相應(yīng)單元中; 不允許使用變量和標(biāo)號,但變量和標(biāo)號可用直接地址代替,且直接地址加方括號; 短、近和遠(yuǎn)轉(zhuǎn)移或調(diào)用的目標(biāo)地址,取決于到目標(biāo)地址的字節(jié)位移量。遠(yuǎn)返回的助記符為RETF。 修改存儲單元字節(jié)操作數(shù)類型,用BY(BYTE PTR),修改存儲單元字操作數(shù)類型,用WO(即WORD PTR)。段超越助記符為CS:、DS:、ES:和SS:,2DEBUG的常用命令 (1)匯編命令 A 格式:A 地址 功能:從指定地址單元開始存放輸入?yún)R編語言的指令語句。若缺省起始地址,則從當(dāng)前CS:100地址開始存放。每當(dāng)輸入一行語句后,按Enter鍵,輸入的

16、語句有效。若輸入的語句中有錯(cuò),DEBUG會顯示“Error”,并需要重新輸入。用A命令輸入程序語句完畢后,最后一行不要輸入并直接按Enter鍵(或Ctrl+C),退出A命令。A命令按行匯編,主要是用于小段程序的匯編或?qū)δ繕?biāo)程序的修改。如圖4-2所示。,說明:所有輸入的數(shù)據(jù)均默認(rèn)為十六進(jìn)制且不用H字符(省略H) 支持偽指令DB,DW等 對于需要轉(zhuǎn)移的指令應(yīng)該直接給出具體的偏移地址(具體的數(shù)值) (2)反匯編命令 U 格式1:U起始地址 格式2:U起始地址結(jié)束地址|字節(jié)數(shù) 功能:格式1從指定起始地址處開始將32個(gè)字節(jié)的目標(biāo)代碼轉(zhuǎn)換成匯編指令形式。缺省起始地址,則從當(dāng)前地址CS:IP開始。格式2將指

17、定范圍的內(nèi)存單元中的目標(biāo)代碼轉(zhuǎn)換成匯編指令。起始和結(jié)束地址范圍是可選項(xiàng),無此項(xiàng)則從當(dāng)前的地址單元開始反匯編32個(gè)字節(jié)。 如:U 0100 ;從地址0100H處對指令語句進(jìn)行反匯編,(3)跟蹤命令 T 格式:T=起始地址正整數(shù) 功能:從指定地址開始執(zhí)行正整數(shù)條指令,若缺省正整數(shù),表示執(zhí)行一條指令,若兩項(xiàng)都缺省,表示從當(dāng)前CS:IP指示地址開始執(zhí)行一條指令。如圖4-3所示。, 程序在執(zhí)行該地址處的指令后停下來,且顯示CPU當(dāng)前所有寄存器及標(biāo)志寄存器的內(nèi)容。并顯示下一條指令的地址和內(nèi)容。 若無地址就從起始地址處單步執(zhí)行一條指令。,(4)顯示、修改寄存器命令 R 格式:R寄存器名 功能:若給出寄存器名

18、,則顯示該寄存器的內(nèi)容并可進(jìn)行修改。缺省寄存器名,則按以下格式顯示所有寄存器的內(nèi)容及當(dāng)前值(不能修改)。 如:R ;顯示所有寄存器的內(nèi)容及當(dāng)前值(不能修改) AX=0000 BX=0004 CX=0020 DX=0000 SP=0080 BP=0000 SI=0000 DI=0000 DS=3000 ES=23A0 CS=138E IP=0000 NV UP DI PL NZ NA PO NC 138E:0000 MOV AX,1234 ;第三行顯示CS:IP的當(dāng)前值,指向下一條即將執(zhí)行的指令。, 鍵入R寄存器名命令后,顯示寄存器名及其內(nèi)容,輸入修改內(nèi)容后,按Enter鍵有效。若無須修改原內(nèi)容

19、,可直接鍵入回車符。 如:R AX ;顯示寄存器AX的內(nèi)容并進(jìn)行修改 AX 1234 ;顯示AX的原有內(nèi)容 :5000 ;將AX修改為5000H,若不修改則直接按Enter鍵。,(5)顯示存儲單元命令 D 格式1:D起始地址 格式2:D起始地址結(jié)束地址|字節(jié)數(shù) 功能:格式1從起始地址開始按十六進(jìn)制顯示80H個(gè)字節(jié)單元的內(nèi)容,每行16個(gè)單元,共8行,每行右邊顯示16個(gè)單元的ASC碼,不可顯示的ASC碼則顯示“”。格式2顯示指定范圍內(nèi)存儲單元的內(nèi)容,其他顯示方式與格式1一樣。如果缺省起始地址或地址范圍,則從當(dāng)前的地址開始按格式1顯示。如圖4-4所示。,(6)修改存儲單元命令 E 格式1:E起始地址

20、 內(nèi)容表 格式2:E地址 功能:格式1按內(nèi)容表的內(nèi)容修改從起始地址開始的多個(gè)存儲單元內(nèi)容,即用內(nèi)容表指定的內(nèi)容來代替存儲單元當(dāng)前內(nèi)容。如圖4-5所示。 例如:E DS:0100 VAR,12,34 表示從DS:0100 為起始單元的連續(xù)五個(gè)字節(jié)單元內(nèi)容依次被修改為V、A、R、12H、34H。,格式2是逐個(gè)修改指定地址單元的當(dāng)前內(nèi)容。如圖4-6所示。,如:E DS:00301371:0030 00.11 其中1371:0030單元原來的值是00H,11H為輸入的修改值。若只修改一個(gè)單元的內(nèi)容,這時(shí)按回車鍵即可;若還想繼續(xù)修改下一個(gè)單元內(nèi)容,此時(shí)應(yīng)按空格鍵,就顯示下一個(gè)單元的內(nèi)容,需修改就鍵入新的

21、內(nèi)容,不修改再按空格跳過,如此重復(fù)直到修改完畢,按回車鍵返回DEBUG“”提示符。如果在修改過程中,將空格鍵換成按“”鍵,則表示可以修改前一個(gè)單元的內(nèi)容。 如:E DS:0120 4D 12 6F ABC ;修改指定內(nèi)存范圍(DS:0120H0125H)的6個(gè)存儲單元的內(nèi)容。也可以逐個(gè)單元相繼修改。,(7)運(yùn)行命令 G 格式:G=起始地址第一斷點(diǎn)地址第二斷點(diǎn)地址 功能:CPU從指定起始地址開始執(zhí)行,依次在第一、第二等斷點(diǎn)處中斷。若缺省起始地址,則從當(dāng)前CS:IP指示地址開始執(zhí)行一條指令。最多可設(shè)置10個(gè)斷點(diǎn)。 (8)指定文件命令 N 格式:N 圖4-6 Debug的E命令 功能:指定即將調(diào)入內(nèi)

22、存或從內(nèi)存寫入磁盤的文件名。該命令應(yīng)該用在L命令和W命令之前。,(9)裝入命令 L 格式1:L起始地址盤符號扇區(qū)號扇區(qū)數(shù) 格式2:L起始地址 功能:格式1根據(jù)盤符號,將指定扇區(qū)的內(nèi)容裝入到指定起始地址的存儲區(qū)中。 格式2將N命令指出的文件裝入到指定起始地址的存儲區(qū)中,若省略起始地址,則裝入到CS:100處或按原來文件定位約定裝入到相應(yīng)位置。,(10)寫磁盤命令 W 格式1:W驅(qū)動器號 格式2:W起始地址 功能:格式1把指定地址開始的內(nèi)容數(shù)據(jù)寫到磁盤上指定的扇區(qū)中。 格式2將起始地址的BX10000HCX個(gè)字節(jié)內(nèi)容存放到由N命令指定的文件中。在格式2的W命令之前,除用N命令指定存盤的文件名外,還

23、必須將要寫的字節(jié)數(shù)用R命令送入BX和CX中。,(11)退出命令 Q 格式:Q 功能:退出DEBUG,返回到操作系統(tǒng)。 以上介紹的是DEBUG常用命令,其他命令請參考有關(guān)書籍。 4.5 匯編語言程序的運(yùn)行 匯編語言程序的上機(jī)過程包括編輯、匯編、連接和執(zhí)行。建立和編輯匯編語言源程序可以使用EDIT、記事本、寫字板等,也可以使用TC等來輸入源程序,但擴(kuò)展名必須是ASM,而不能用他們默認(rèn)的擴(kuò)展名。下面我們用記事本輸入一個(gè)字符串比較程序例子程序。,4.5.1 8086匯編語言程序的一個(gè)例子 例1:字符串比較程序 編寫一個(gè)匯編語言源程序:比較兩個(gè)字符串String1和String2所包含的所有字符是否一致

24、,若相同就顯示Match,否則,顯示No match.。我們可以用串比較指令完成上述功能,參考程序如下: DATA SEGMENT ;定義數(shù)據(jù)段 String1 DB move the cursor backworad.,13,10,$ String2 DB move the cursor backworad.,13,10,$ Mess1 DB Match,13,10,$ Mess2 DB No match,13,10,$ DATA ENDS,CODE SEGMENT ;定義代碼段 ASSUME CS:CODE, DS:DATA, ES:DATA ; BEGIN:PUSH DS ;設(shè)置堆棧返回

25、 SUB AX,AX PUSH AX MOV AX,DATA ; MOV DS,AX ;數(shù)據(jù)段寄存器賦初值 MOV ES,AX ;附加段寄存器賦初值 LEA SI,STRING1 LEA DI,STRING2 CLD MOV CX,25 ;設(shè)置比較次數(shù) REPZ CMPSB,JZ NEXT ;相等則轉(zhuǎn)NEXT LEA DX,MESS2 JMP SHORT DISP NEXT:LEA DX,MESS1 DISP:MOV AH,09H ;顯示比較結(jié)果 INT 21H LEA DX,STRING1 ;顯示字符串STRING1 MOV AH,09H INT 21H LEA DX,STRING2 ;顯示

26、字符串STRING2 MOV AH,09H INT 21H RET MOV AX,4C00H ; INT 21H ; CODE ENDS ;代碼段結(jié)束 END BEGIN ;程序結(jié)束,說明:匯編語言的源程序是由多條語句構(gòu)成。語句說明了段和段寄存器之間的對應(yīng)關(guān)系。和實(shí)現(xiàn)對段寄存器DS和ES賦初值。ASSUME說明語句只起說明作用,它不會對段寄存器賦值,所以,必須對有關(guān)段寄存器賦初值。在以后的其它源程序中也都是用此方法來實(shí)現(xiàn)對數(shù)據(jù)段寄存器賦值的。語句和是調(diào)用中斷21H的4CH號功能來結(jié)束本程序的執(zhí)行,程序的返回代碼由寄存器AX來確定。結(jié)束本程序執(zhí)行的指令是所有主模塊必須書寫的語句。,從上述例子可以

27、看出,源程序的結(jié)構(gòu)特點(diǎn)如下: 匯編語言源程序由若干個(gè)段構(gòu)成,相當(dāng)于一篇文章由若干個(gè)段構(gòu)成。 段的個(gè)數(shù)可任意,段的順序也可隨意。 每個(gè)段由若干個(gè)語句構(gòu)成的,語句由單詞構(gòu)成,單詞之間由一個(gè)或若干個(gè)空格分開。 必須明確指出整個(gè)源程序的結(jié)束。 匯編語言不區(qū)分大小寫。 內(nèi)存分段,故程序也分段,程序的段裝入內(nèi)存的段中。,4.5.2 匯編語言程序的編輯、匯編、連接和調(diào)試 1、編輯源程序 匯編語言源程序:用匯編語句編寫的解決應(yīng)用問題的程序。 匯編程序:將匯編語言源程序翻譯成機(jī)器語言程序的系統(tǒng)。 匯編:將匯編語言程序翻譯成機(jī)器語言程序的過程。在編輯匯編語言源程序時(shí),對計(jì)算機(jī)硬件工作環(huán)境無特殊要求,對軟件工作環(huán)境

28、要求也很簡單,只需用建立ASC碼文本文件的軟件即可。編輯軟件有:EDIT.COM、TC、WORD、TEXT、CodeView 等。當(dāng)輸入、建立和修改源程序時(shí),可任選一種編輯軟件,不要用格式控制符,要求編輯完成的文件擴(kuò)展名必須是.ASM文件,否則不能匯編。,編輯過程:在DOS狀態(tài)下,調(diào)用CodeView編輯程序建立文件名為ex1.ASM的匯編源程序,如圖4-7所示。,2、 匯編源程序 源程序文件建立完畢后,調(diào)用宏匯編程序MASM對ex1.ASM進(jìn)行匯編,才能產(chǎn)生EX1.OBJ文件。為此,需鍵入: 格式1 C: MASM 如ex1.asm 格式2 C: MASM 按格式1鍵入,屏幕上顯示: Mic

29、rosoft(R) Macro assemble Version 5.00 Copyright(C) Microsoft Corp 1981-1985,1987 ALL rights reserved OBJ filename.obj: Source listingnul.lst: Cross-referencenul.crf:,以上信息中方括號中為該項(xiàng)提示的缺省回答值,冒號后面等待用戶輸入信息,若不改變?nèi)笔≈祫t直接按Enter鍵。匯編后生成以下幾個(gè)文件: (1)ex1.OBJ文件 ex1.OBJ文件是必須生成的一個(gè)目標(biāo)代碼文件,當(dāng)源程序中無語法錯(cuò)誤時(shí),則在當(dāng)前工作盤上自動存入一個(gè)ex1.OB

30、J文件,供下一步連接用。目標(biāo)文件(OBJ):是一個(gè)純二進(jìn)制代碼文件,不能直接在屏幕上顯示。若源程序有語法錯(cuò)誤時(shí),會出現(xiàn)錯(cuò)誤信息提示: 源程序文件行錯(cuò)誤信息代碼錯(cuò)誤說明信息 信息提示:, Warning errors (警告錯(cuò)誤) Severe errors (嚴(yán)重錯(cuò)誤) 若嚴(yán)重錯(cuò)誤總數(shù)不為0,則ex1.OBJ文件沒有生成,需回到編輯狀態(tài)下修改源程序直到無錯(cuò)為止。 (2)ex1.LST文件(列表文件) ex1.LST文件對調(diào)試程序有幫助,列表文件包含源程序中各語句及其對應(yīng)的目標(biāo)代碼,各語句所屬段內(nèi)的偏移量,并且列出了源程序中所用標(biāo)號、變量和符號的名字、類型和值。列表文件可以打印出來以供檢查。如果

31、需要,在屏幕顯示的第二個(gè)提問的冒號后輸入文件名即可,如果不需要,直接按回車鍵。,(3)ex1.CRF文件(交叉引用文件) 交叉引用.CRF文件給出了源程序中定義的符號引用情況,按字母順序排列。EX1.CRF文件不可顯示,匯編程序提供的交叉引用文件,對于一般程序不需要建立此文件。 若按格式2輸入,系統(tǒng)會依次出現(xiàn)四個(gè)提示信息,比格式1多了一項(xiàng)源程序文件名的輸入。然后應(yīng)答方式與格式1相同。 屏幕上出現(xiàn)以下提示信息:Microsoft(R) Macro assemble Version 5.00 Copyright(C) Microsoft Corp 1981-1985,1987 ALL rights

32、 reserved Run file .EXE: List File nul.map: Libraries .lib: 連接后,可生成兩種文件:EX1.EXE和EX1.MAP,(1)EX1.EXE文件(可執(zhí)行文件) 若采用方括號中的默認(rèn)值,直接按回車鍵,否則需重新輸入一文件名。 若連接過程中無錯(cuò)誤,則自動在當(dāng)前工作盤生成.EXE文件。若有錯(cuò)誤,則會給出錯(cuò)誤信息提示,這時(shí)必須重新修改源程序,再匯編、連接。 (2)EX1.MAP(連接映像文件) (3)EX1.LIB庫文件 連接程序詢問是否使用某種庫文件,不需使用庫文件直接按回車鍵。,4、 運(yùn)行程序 經(jīng)過匯編、連接后生成的EX1.EXE文件,可在D

33、OS系統(tǒng)直接運(yùn)行,只要鍵入相應(yīng)的文件名即可。如:C: EX1.EXE DOS的COMMAND.COM模塊將該程序裝配到內(nèi)存,并設(shè)置和分配啟動地址。也可在DEBUG調(diào)試程序下運(yùn)行。如何用DEBUG程序來運(yùn)行和調(diào)試程序?qū)⒃贒EBUG調(diào)試程序中詳細(xì)討論。,習(xí)題 4 一、選擇題 1. 下列敘述正確的是( )。 A. 不同類型機(jī)器的指令系統(tǒng)不相同 B. 機(jī)器指令都是8位 C. 16位機(jī)的指令系統(tǒng)完全相同 D. 機(jī)器指令都是16位 2. 上機(jī)操作過程中,LINK命令執(zhí)行后除生成一個(gè)可執(zhí)行文件外,根據(jù)選擇還可生成一個(gè)( )文件。 A. OBJ B. LST C. CRF D. MAP,二、程序填空題 1.

34、利用DEBUG調(diào)試下面的程序段,并完成填空。 (1)用A命令在內(nèi)存100H處鍵入下列指令內(nèi)容: MOV AX,1234 ;AX=_ MOV BX,5678 ;BX=_ XCHG AX,BX ;AX=_,BX=_ MOV AH,35 ;AH=_ MOV AL,48 ;AL=_ MOV DX,75AB ;DX=_ XCHG AX,DX ;AX=_,DX=_ 用U命令檢查鍵入的程序并填寫記錄,特別注意左邊的機(jī)器碼。用T命令逐條運(yùn)行這些指令,每運(yùn)行一行檢查并記錄有關(guān)寄存器及IP的變化情況。并注意標(biāo)志位有無變化。用命令Q退出DEBUG。,(2)內(nèi)存操作數(shù)及各種尋址方式使用 MOV AX,1234 ;AX

35、=_ MOV 1000,AX MOV BX,1002 MOV BYTE PTRBX,20 ;BX=_ MOV DL,39 INC BX ;BX=_ MOV BX,DL DEC DL ;DL =_ MOV SI,3 MOV BX+SI,DL ;BX+SI =_ MOV BX+SI+1,DL ;BX+SI+1 =_ MOV WORD PTRBX+SI+2,2846 ;BX+SI+2 =_,(3)累加和程序 MOV BX,1000 ;BX=_ MOV CX,10 ;CX=_ SUB AX,AX ;AX=_ LOP: ADD AL,BX ;AL=_ ADC AH,0 ;AH=_ INC BX ;BX=

36、_ DZHJ:LOOP LOP ;CX=_ INT 20H 用A命令將程序鍵入到100H開始的內(nèi)存中,在鍵入時(shí)記下標(biāo)號LOP實(shí)際地址_和DZHJ的實(shí)際地址_,在鍵入LOOP指令時(shí)LOP用實(shí)際地址值代替。,2、上機(jī)完成下列程序調(diào)試 將ABC為起始地址的兩位十六進(jìn)制(ASC碼)轉(zhuǎn)換成八位二進(jìn)制數(shù)存入BIN單元。 分析:采用查表法來完成十六進(jìn)制數(shù)到八進(jìn)制數(shù)的轉(zhuǎn)換。首先要定義一張轉(zhuǎn)換表,因?yàn)橐D(zhuǎn)換的十六進(jìn)制數(shù)是用ASC碼表示,例如十六進(jìn)制數(shù)5AH,在ABC單元中存儲形式為35H、41H(5和A的ASC碼),因此,設(shè)置起始地址從1030H開始的30H-39H(0-9)的轉(zhuǎn)換表和從1041H開始的41H和

37、46H(A-F)轉(zhuǎn)換表,這樣只需要分別取十六進(jìn)制數(shù)的高位和低位作為轉(zhuǎn)換表的增量進(jìn)行直接查表即可完成。,參考程序如下: DATA SEGMENT ORG 1000H BIN DB ? ABC DB 5A ORG 1030H DB 00H,01H,02H,03H,,09H ;09對應(yīng)的二進(jìn)制轉(zhuǎn)換表 ORG 1041H DB 0AH,0BH,0CH,0DH,0EH,0FH DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,START: MOV AX,DATA MOV DS,AX ;初始化數(shù)據(jù)段 MOV AL,ABC MOV BX,OFFSET BIN XOR

38、 AH,AH ADD BX,AX ;形成轉(zhuǎn)移地址表 BX1035H MOV DL,BX MOV CL,4 SHL DL,CL MOV AL,ABC+1 MOV BX,OFFSET BIN XOR AH,AH ADD BX,AX MOV AL,BX OR AL,DL MOV BIN,AL HLT CODE ENDS END START,3、上機(jī)練習(xí)。用文本編輯軟件Edit、WINDOWS 中的記事本或其它的文本編輯器(如TC)輸入?yún)R編語言源程序, 注意在最后一行的 END。輸入完后要按一次回車鍵,命名并且保存。注意源文件的擴(kuò)展各一定要是 .ASM (如: Example.ASM) 題目:十六進(jìn)制

39、到BCD轉(zhuǎn)換。(要求將AL中的十六進(jìn)制數(shù)如EFH(239D)分拆為三個(gè)BCD碼,并存入Result開始的3個(gè)單元中)。 參考匯編源程序如下。 DATA SEGMENT ;數(shù)據(jù)段 DAT1 DB 0EFH RESULT DB 3 DUP(?),$ DATA ENDS,STACK SEGMENT STACKSTACK ;堆棧段 STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ;代碼段 ASSUME CS:CODE , DS:DATA , SS:STACK , ES:DATA START: ; 程序開頭必須要有的六條指令 MOV

40、 AX, DATA MOV DS, AX ;送數(shù)據(jù)段地址 MOV AX, STACK MOV SS, AX ;送堆棧段地址 MOV AX, TOP MOV SP, AX ; 程序的中間部分,MOV AX, DAT1 MOV CL, 100 DIV CL ADD AL, 30H MOV RESULT, AL ;除以 100, 得百位數(shù) MOV AL, AH MOV AH, 0 MOV CL, 10 DIV CL ADD AL, 30H ADD AH, 30H MOV RESULT+1, AL ;余數(shù)除以 10, 得十位數(shù) MOV RESULT+2, AH ;余數(shù)為個(gè)位數(shù) MOV AH,09H ;

41、顯示輸出,MOV DX, OFFSET RESULT INT 21H ; 程序結(jié)束必須要有的兩條指令 MOV AX,4C00H ;返回DOS INT 21H CODE ENDS END START ; 最后一行要按回車鍵 D:MASM50MASMDIR EBUG EXE 20,554 05-05-99 22:22 DEBUG.EXE LINK EXE 43,988 04-22-99 22:05 LINK.EXE MASM EXE 85,566 04-22-99 22:05 MASM.EXE EXAMPLE ASM 1,730 02-25-03 21:02 EXAMPLE.ASM,EXAMPLE

42、 OBJ 156 02-25-03 21:03 EXAMPLE.OBJ EXAMPLE EXE 573 02-25-03 21:03 EXAMPLE.EXE 10 file(s) 264,866 bytes 2 dir(s) 1,043,791,872 bytes free 匯編源程序操作: D:MASM50MASMMASM EXAMPLE ; Microsoft (R) Macro Assembler Version 4.00 Copyright (C) Microsoft Corp 1981, 1983, 1984, 1985. All rights reserved. 50860 Byt

43、es symbol space free,0 Warning Errors 0 Severe Errors 連接并生成擴(kuò)展名為 .EXE 可執(zhí)行文件的操作: D:MASM50MASMLINK EXAMPLE ; Microsoft (R) 8086 Object Linker Version 3.05 Copyright (C) Microsoft Corp 1983, 1984, 1985. All rights reserved. D:MASM50MASM D:MASM50MASM EXAMPLE ;運(yùn)行該程序 對可執(zhí)行文件進(jìn)行調(diào)試的操作: D:MASM50MASMDEBUG EXAMPL

44、E.EXE - -U CS:0000 ; 用反匯編命令”U 代碼段地址:起始偏移地址“ 顯示出程序的表示符,129D:0000 B89C12 MOV AX,129C ; 程序的起始地址是 129DH:0000H 129D:0003 8ED8 MOV DS,AX 129D:0014 F6F1 DIV CL 129D:001D B10A MOV CL,0A 129D:001F F6F1 DIV CL - 129D:0008 8ED0 MOV SS,AX 129D:000A B81400 MOV AX,0014 129D:000D 8BE0 MOV SP,AX 129D:001D B10A MOV

45、CL,0A 129D:001F F6F1 DIV CL -U,129D:0021 A20100 MOV 0001,AL 129D:0024 88260200 MOV 0002,AH 129D:0028 B8004C MOV AX,4C00 ; 程序的結(jié)束地址是 129DH:0028H 129D:002B CD21 INT 21 129D:002D 0BA1D65D OR SP,BX+DI+5DD6 29D:0036 83C402 ADD SP,+02 129D:0039 C686FCF3FF MOV BYTE PTR BP+F3FC,FF 129D:003E EBAF JMP FFEF 129

46、D:0040 3D9600 CMP AX,0096 - 執(zhí)行程序前觀察內(nèi)存中的數(shù)據(jù) -D DS:0000 ; 用顯示內(nèi)存中的數(shù)據(jù)命令命令”D 數(shù)據(jù)段地址:存放數(shù)據(jù)的偏移地址“ 顯示內(nèi)存中的數(shù)據(jù),128C:0000 CD 20 00 A0 00 9A F0 FE-1D F0 4F 03 F1 0B 8A 03 . .O. 128C:0010 F1 0B 17 03 F1 0B E0 0B-01 01 01 00 02 FF FF FF . 128C:0040 07 0A 00 00 00 00 00 00-00 00 00 00 00 00 00 00 . 128C:0050 CD 21 CB

47、00 00 00 00 00-00 00 00 00 00 20 20 20 .!. 128C:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20 . 128C:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 . - -G=CS:0000 0028 ; 連續(xù)執(zhí)行程序命令 代碼段地址:指令的起始偏移地址 指令的結(jié)束偏移地址,AX=0302 BX=0000 CX=000A DX=0000 SP=0014 BP=0000 SI=0000 DI=0000 DS=129C ES=128C SS

48、=12A0 CS=129D IP=0028 NV UP EI PL NZ NA PO NC 129D:0028 B8004C MOV AX,4C00 - 執(zhí)行程序后觀察內(nèi)存中的數(shù)據(jù)( 結(jié)果 ) -D DS:0000 ; 用顯示內(nèi)存中的數(shù)據(jù)命令命令”D 數(shù)據(jù)段地址:存放數(shù)據(jù)的偏移地址“ 顯示內(nèi)存中的數(shù)據(jù) 129C:0000 01 02 03 00 00 00 00 00-00 00 00 00 00 00 00 00 . 129C:0010 B8 9C 12 8E D8 B8 A0 12-8E D0 B8 14 00 8B E0 B8 . 129C:0040 5D 48 50 E8 85 0C

49、83 C4-02 C6 14 00 00 00 28 00 HP.(. 129C:0050 9D 12 F1 0B C7 3D 98 00-74 A2 3D 9A 00 74 AE 3D .=.t.=.t.=,129C:0060 A0 00 74 C9 3D A2 00 74-C4 3D B0 00 74 A9 A1 D6 .t.=.t.=.t. 129C:0070 5D 48 50 E8 55 0C 83 C4-02 EB 84 E8 9E 29 E9 D0 HP.U.). - -R IP 修改IP寄存器中的數(shù)據(jù) IP 0028 顯示修改前的數(shù)據(jù) :00 輸入修改的數(shù)據(jù) - -T ;單步執(zhí)行程序命令 (執(zhí)行一條指令) AX=129C BX=0000 CX=003D DX=0000 SP=0014 BP=0000 SI=0000 DI=0000

溫馨提示

  • 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

提交評論