劉俊
摘要:為了幫助學生更好學習掌握80×86匯編語言,必須解決在Windows環(huán)境下如何運行匯編程序。該文以實現軟中斷、中斷實現磁盤讀寫為例,分析了在Windows操作系統(tǒng)上如何仿真PC/XT計算機的邏輯過程,揭示了PC/XT計算機工作機理。
關鍵字:80×86;Windows操作系統(tǒng);PC/XT仿真;DOS中斷
中圖分類號:G642 文獻標識碼:A 文章編號:1009-3044(2016)02-0109-02
Abstract: To help students to learn 80×86 assembly language better, measure must be considered about how to run assembly program in windows operating system. The paper analyses logic process of PC/XT computer based on windows system by realizing computer soft interruption and disk reading and writing. It reveals working mechanism of PC/XT computer.
Key words: 80×86; windows operating system; PC/XT simulation; DOS interrupt
目前,《微型計算機原理與接口技術》是高等院校開設的主干基礎課程之一,多數教材中的內容圍繞8086/8088芯片的指令系統(tǒng)來闡述計算機的工作原理。開設的匯編語言程序設計實驗也是對該指令集中指令應用的實驗。然而,隨著計算機技術的迅猛發(fā)展,計算機的硬件系統(tǒng)和軟件系統(tǒng)都發(fā)生了巨大變化,現代任何一臺計算機都不是當初8086為CPU的IBM PC/XT,不僅CPU內的環(huán)境發(fā)生了巨大變化,CPU外的硬件也發(fā)生了巨大變化,但是,8086/8088指令組成的匯編程序一樣能在現代計算機中執(zhí)行,且匯編程序通過DOS中斷、BIOS中斷仍能實現人機交互、磁盤讀寫等功能。這給教、學兩方面都帶來諸多疑問,屢清Windows環(huán)境下8086匯編程序在現代計算機中的執(zhí)行邏輯,無疑是教學中必須面對的問題。
安裝Windows系統(tǒng)的現代計算機,它對計算機的軟、硬件進行管理,對每個加載的作業(yè),通過進程來感知、管理、調度,使各運行的作業(yè)并發(fā)執(zhí)行,系統(tǒng)對進駐內存的各作業(yè)通過段、頁方式分配內存,各作業(yè)都處于用戶態(tài),系統(tǒng)通過接受事件來觸發(fā)事件的處理過程。
1 Windows系統(tǒng)對8086計算機的模擬
在安裝了匯編語言開發(fā)環(huán)境的Windows系統(tǒng)中,8086指令組成的源程序通過編譯、連接后生成*.exe可執(zhí)行文件。這些可執(zhí)行文件,無論是運行還是調試都與在一臺8086為CPU芯片的計算機上運行一樣,調試時看到的物理地址和教材中講解的PC/XT計算機工作時完全相同。眾所周知,以8086為芯片的PC/XT計算機工作在實地址方式,在PC/XT計算機上調試運行的8086匯編程序,在調試界面中看到的物理地址,就是指令、數據存放的內存編址的實際位置。而Windows操作系統(tǒng)對內存的管理是段、頁式管理,即動態(tài)分配內存,調試中,界面顯示的“物理地址”不是計算機內存編址的實際位置,給換句話來說,在Windows系統(tǒng)中,模擬仿真了8086計算機的工作情況。經測試分析,發(fā)現Windows系統(tǒng)對8086的仿真是通過Windows系統(tǒng)自帶的附件程序完成的。在Windows系統(tǒng)安裝完成后,系統(tǒng)附件界面有一些程序,其中包含名稱為 “命令提示符”的軟件,其路經為“Windows的開始菜單→程序→附件→命令提示符”,該軟件又稱CMD方式。在測試中發(fā)現:在執(zhí)行或調試匯編程序時,任務管理器的進程標簽頁自動打開cmd.exe進程(如圖1所示),而通過點擊Windows的開始菜單→程序→附件→命令提示符,同樣打開cmd.exe進程。
在匯編語言開發(fā)環(huán)境中編寫的8086指令集的匯編源程序,在執(zhí)行或調試時,首先打開cmd.exe進程,Windows系統(tǒng)對cmd.exe進程設置好執(zhí)行環(huán)境,這個執(zhí)行環(huán)境就是Windows系統(tǒng)對8086的模擬環(huán)境,編譯、連接好的可執(zhí)行代碼作為該環(huán)境的程序數據。也可以說,當前計算機的CPU不直接執(zhí)*.exe的可執(zhí)行代碼,CPU執(zhí)行的是cmd.exe進程提供的程序數據,即cmd.exe進程是匯編程序生成的可執(zhí)行代碼的“代理”,實現Windows環(huán)境下對匯編程序生成的可執(zhí)行文件的執(zhí)行,同時,該平臺又將CPU輸出的結果,轉化為8086方式顯示。
2 匯編語言開發(fā)環(huán)境中的中斷調用
2.1 PC/XT計算機中斷的功能及調用過程
在教材中,為了匯編語言設計的程序能夠有交互界面與磁盤讀寫功能,都加入了中斷調用的功能,常用的DOS中斷調用INT 21H,提供了設置不同的功能號,實現鍵盤輸入、顯示器輸出、磁盤讀寫及文件、目錄的建立和刪除等和輸入、輸出相關的功能。在匯編程序開發(fā)環(huán)境中,實現程序的交互界面與磁盤讀寫功能,是通過中斷指令,完成對中斷的子程序調用來實現的。DOS中斷調用的原理是:根據中斷類型號找到中斷向量表的偏移地址,取出中斷程序入口地址放入CS:IP,使CPU轉入中斷子程序執(zhí)行。完成這一調用功能的前提是需設置好中斷向量表、中斷類型號與中斷向量表偏移的關系及中斷子程序。在早期的PC/XT計算機中,啟動計算機成功,意味著磁盤操作系統(tǒng)(DOS)加載入內存完成,所以編程時,軟中斷調用能夠實現是基于啟動時已將中斷向量表、中斷子程序加注內存并設置好。其中BIOS中斷是系統(tǒng)引導時,就一并進入內存。
2.2 Windows環(huán)境下的中斷問題分析
在安裝Windows系統(tǒng)的現代計算機中,安裝面向8086/8088指令集的編程開發(fā)環(huán)境,編程中對中斷的調用也是直接用中斷指令完成,那么,中斷程序是何時加載的?中斷向量表存放何處?
顯然,匯編語言開發(fā)環(huán)境顯然不承擔要完成中斷功能的前期任務,因為它的工作由四部分組成:編輯是實現源碼的錄入、編輯、保存等功能;編譯完成偽指令的轉換、指令助字符到機器碼的轉換;連接將目標代碼連接成可執(zhí)行程序;執(zhí)行和調試是將可執(zhí)行代碼作為作業(yè)提交給Windows操作系統(tǒng),調試是將執(zhí)行中間結果顯示給用戶,便于用戶診斷。
Windows操作系統(tǒng)啟動時也加載了DOS模塊這些內容?這樣的推論不正確,原因很簡單:Windows操作系統(tǒng),對內存的管理分為核心態(tài)和用戶態(tài),既然是虛擬8086的工作環(huán)境,系統(tǒng)是將8086工作環(huán)境作為用戶態(tài)來管理的,用戶態(tài)的進程僅在加載時將PID裝入內存,也就不存在系統(tǒng)啟動時加載DOS模塊的可能。
2.3 開發(fā)環(huán)境中的中斷調用對硬盤的影響
其外,DOS軟中斷INT 26H 功能是對絕對磁盤寫,通過該中斷調用能否在寫入時,將原盤號:扇區(qū)中的數據覆蓋?如果能,則編寫程序破壞操作系統(tǒng)存放在磁盤上的數據,就能起到破壞系統(tǒng)的功能。顯然是不能的!為什么?
3 Windows系統(tǒng)對8086物理地址和中斷的仿真過程
Windows系統(tǒng)對“命令提示符”軟件是作為用戶程序管理的,Windows系統(tǒng)用進程名“cmd.exe”標識該軟件的加載,核心態(tài)空間存放軟件的程序控制塊(PCB),用戶態(tài)是動態(tài)分配的內存空間,每次加載在內存的位置都是不一樣的。用戶編寫的匯編程序占用空間大小不同,申請的cmd.exe進程上下文所需空間也不一樣(進程標簽中顯示的內存空間一般指申請的進程用戶空間)。Windows系統(tǒng)將cmd.exe進程分配的內存空間按8086方式顯示給用戶,讓用戶感覺程序的執(zhí)行似8086方式;當有中斷調用時,由cmd.exe進程將硬盤中的DOS模塊加載到申請的空間中,并設置好,這樣就能滿足中斷調用的要求。
4 中斷程序設計的啟示
PC/XT中,中斷程序設計的一般步驟:(1)確定要使用的中斷類型號;(2)保存原中斷向量;(3)設置自己的中斷向量;(4)設置中斷屏蔽字;(5)CPU開中斷;(6)恢復原中斷向量。我們設想在一個程序中設好中斷類型 60H,利用INT 35H將原中斷向量保存;再利用INT 25H將寫好的中斷子程序設到中斷類型號60H對應的中斷向量表中,保持該中斷處于加載狀態(tài),再編寫另一個匯編程序調用INT 60H,在該程序中無法調用對應60H中斷類型號的用戶編寫的中斷程序。原因是我們開啟了兩個cmd.exe進程,每個cmd.exe進程對8086的模擬是獨立的。就像不能通過一臺PC/XT訪問另一臺PC/XT的中斷一樣。
同樣,在匯編程序開發(fā)環(huán)境中,通過DOS的INT 26H調用,實現對磁盤的寫功能是在cmd.exe進程能夠完成權限范圍內,由于cmd.exe進程是個用戶進程,對磁盤操作要通過系統(tǒng)進程完成,我們看到的磁盤讀、寫是cmd.exe進程從硬盤中申請的一塊空間,模擬了盤號、扇區(qū)的狀態(tài)。因此,不會造成破壞磁盤中隨意讀、寫數據的功能。
5 總結
總之,如果安裝的操作系統(tǒng)不包含“命令提示符”的軟件,是不能進行8086計算機的仿真,目前流行的Windows操作系統(tǒng)中都包含該軟件,使利用8086指令集編寫的匯編程序在Windows系統(tǒng)中得以仿真執(zhí)行,掌握Windows系統(tǒng)對8086的仿真過程,屢清了程序的執(zhí)行邏輯,解答了諸多疑問。
參考文獻:
[1] 馮博琴,吳寧.微型計算機原理與接口技術》[M].清華大學出版社,2011.
[2] 孫鐘秀.操作系統(tǒng)教程》,高等教育出版社[M].2008年
[3] 李華貴,李鵬. 微機原理與接口技術[M]. 北京:電子工業(yè)出版社,2010.
[4] 錢曉捷. 微機原理與接口技術[M]. 北京:機械工業(yè)出版社,2008.
[5] 馬興錄,等. 32位微機原理與接口技術[M]. 北京:化學工業(yè)出版社,2009.