複製鏈接
請複製以下鏈接發送給好友

COM格式

鎖定
COM格式文件是一種簡單的可執行文件。在迪吉多公司於20世紀70年代推出的操作系統中,.COM被用做包含操作系統支持命令的文本文件的拓展名(類似於Windows系統的.cmd文件)。隨着引進CP/M的引進(微型計算機的操作系統),COM擴展相的文件改變為的可執行文件。該格式後來被結轉到MS-DOS。雖然MS-DOS中已有更常見的.exe文件格式的,緊湊的COM文件仍然保持活力,並在MS-DOS頻繁使用。
COM文件中沒有附帶任何支持性數據,僅包含可執行代碼。文件頭即為第一句執行指令。沒有重定位的信息,這樣代碼中不能有跨內存段(segment)操作數據的指令,因此代碼與數據只能限制在同一個64KB的內存段中。
中文名
COM格式
外文名
COM format
類    型
一種計算機文件擴展名
提出時間
20世紀70年代

COM格式MS-DOS二進制格式

COM格式是在CP/M和MS-DOS中使用的原始二進制可執行格式。它很簡單因為 它沒有標題(除CP/M 3文件外),並且不包含標準元數據,僅包含代碼和數據。 這種簡單性是一個代價:二進制文件的最大大小為65,280(FF00h)字節(256字節短於64 KB),並將其所有代碼和數據存儲在一個段中。
由於它沒有重定位信息,它被操作系統裝載到一個預置地址,在PSP後面的偏移量0100h,它被執行(因此限制了可執行文件的大小):入口點固定為0100h。 這在8位機器上不是問題,因為它們可以最大地處理64k的內存,但是16位機器具有更大的地址空間,這就是為什麼格式不再使用的原因。
在Intel 8080 CPU架構中,只能尋址65,536字節的內存(地址範圍為0000h至FFFFh)。 在CP/M下,該存儲器的前256字節(從0000h到00FFh)被保留供系統零頁使用,並且任何用户程序都必須在0100h加載才能執行。 COM文件完全適合這個模型。 在引入MP / M和並行CP / M之前,一次不可能運行多個程序或命令:在0100h加載的程序運行,沒有其他運行。
雖然MS-DOS和CP/M中的文件格式相同,但兩個操作系統的.COM文件不兼容; MS-DOS COM文件包含x86指令和可能的MS-DOS系統調用,而CP/M COM文件包含8080指令(限於某些機器的程序也可能包含8085或Z80的附加指令)和CP/M系統調用。
DOS中的.COM文件將所有x86段寄存器設置為相同的值,並將SP(堆棧指針)寄存器設置為FFFEh,因此堆棧從內存段的最頂端開始並從那裏開始工作。
原來的DOS 1.x API是CP / M API的衍生產品,通過調用INT 20h(終止程序)函數或INT 21h函數0來執行程序終止.COM文件,他們起着同樣的作用,程序員還必須確保程序終止時代碼和數據段寄存器包含相同的值,以避免潛在的系統崩潰。 雖然這可以在任何DOS版本中使用,但是Microsoft建議使用INT 21h函數4Ch來從DOS 2.x以後的程序終止,它不需要將數據和代碼段設置為相同的值。
可以在兩個操作系統下運行.COM文件。 在指令級沒有真正的兼容性; 入口點的指令被選擇為在功能上相同但在兩個操作系統中不同,並且使程序執行跳轉到正在使用的操作系統的部分。 它基本上是兩個不同的程序,在單個文件中具有相同的功能,之前是代碼選擇要使用的程序。
在CP/M 3下,如果COM文件的第一個字節是C9h,則有一個256字節的標題; 由於C9h對應於8080指令RET,這意味着如果在不支持該擴展的早期版本的CP/M上運行,COM文件將立即終止。(因為8085和Z80的指令集是8080指令集的超集,所以這三個處理器都可以工作。)C9h是8088/8086上的一個無效操作碼,它會在v86模式下引發INT 6異常,因為386.由於C9h是自80188/80186以來的LEAVE操作碼,因此不被用作有效程序中的第一條指令,因此某些版本的DOS中的可執行加載程序拒絕以C9h開頭的COM文件,從而避免崩潰。
文件的名稱可能以.COM結尾,但不能採用上述簡單格式。 這由文件開頭的幻數表示。 例如,DR DOS 6.0中的COMMAND.COM文件實際上是DOS可執行格式,前兩個字節表示為MZ(4Dh 5Ah),即Mark Zbikowski的縮寫。 [1] 
在MS-DOS和兼容DOS中,加載器或執行環境沒有為COM文件提供內存管理。所有內存都可用於COM文件。執行後,操作系統命令外殼COMMAND.COM將重新加載。這留下了COM文件可能非常簡單,使用單個段或任意複雜的可能性,從而提供自己的內存管理系統。一個複雜程序的例子是COMMAND.COM,MS-DOS shell,它提供了一個加載器來加載其他COM或EXE程序。在.COM系統中,可以加載和運行較大的程序(最大可用內存大小),但系統加載程序假定所有代碼和數據都在第一段中,並且由.COM程序提供任何代碼和數據。進一步組織。如果必要的代碼包含在.COM程序中,則可通過動態鏈接處理大於可用內存或大型數據段的程序。使用.COM而不是.EXE格式的優點是二進制圖像通常更小,更容易使用匯編程序進行編程。一旦有足夠功率的編譯器和鏈接器可用,將.COM格式用於複雜程序就不再有利。
.COM文件在IBM PC早期之後通常不用於商業軟件可執行文件,格式主要用於命令行應用程序。

COM格式支持平台

該格式在許多現代基於Windows NT的平台上仍然可執行,但它在MS-DOS仿真子系統NTVDM中運行,並不存在於64位變體中。 COM文件也可以在DOS模擬器(如DOSBox)上執行,在這些模擬器支持的任何平台上。

COM格式兼容性

基於Windows NT的操作系統使用.com擴展名來處理從MS-DOS時間傳輸的少量命令,儘管它們實際上當前實現為.exe文件。 操作系統將識別.exe文件頭並正確執行它們,儘管它們在技術上不正確的.com擴展名。 (事實上,任何.exe文件都可以重命名.com並且仍然可以正確執行。)對這些命令使用原始.com擴展可確保與舊的MS-DOS批處理文件兼容,這些文件可能使用完整的原始文件名引用它們。 這些命令是chcp.com,discomp.com,diskcopy.com,format.com,mode.com,more.com和tree.com。

COM格式執行效果

在MS-DOS中,如果一個目錄同時包含一個COM文件和一個具有相同名稱的EXE文件,那麼當沒有指定擴展名時,將優先選擇COM文件進行執行。 例如,如果系統路徑中的某個目錄包含兩個名為foo.com和foo.exe的文件,則以下命令將執行foo.com:
C:\>foo
運行foo.exe的用户可以顯式使用完整的文件名:
C:\>foo.exe
利用這種默認行為,病毒編寫者和其他惡意程序員使用notepad.com這樣的名字來創建它們,希望如果將它放在與相應的EXE文件相同的目錄中,命令或批處理文件可能會意外觸發它們的程序 而不是文本編輯器notepad.exe。 再次,這些.com文件實際上可能包含一個.exe格式的可執行文件。
在Windows NT及衍生產品(Windows 2000,Windows XP,Windows Vista和Windows 7)上,PATHEXT變量用於覆蓋調用文件的首選項(以及可接受的擴展名)的順序,而無需在命令行中指定擴展名。 默認值仍然在.exe文件之前放置.com文件。 這與以前在JP Software的擴展命令行處理器4DOS,4OS2和4NT系列中發現的功能非常相似。

COM格式惡意使用.com

一些計算機病毒作者希望利用現代計算機用户可能缺乏對.com文件擴展名和相關二進制格式的知識,以及他們更可能熟悉.com互聯網域名。 電子郵件已發送附件名稱類似於“www.example.com”。 不小心的微軟Windows用户點擊這樣的附件可能會開始瀏覽一個名為http://www.example.com/的網站,而是運行附件的二進制命令文件www.example,並給予它完全的權限 無論其作者想到的是什麼機器。
注意COM文件格式本身沒有任何惡意; 這是對.com命令文件和.com商業網站之間巧合名稱衝突的利用。
參考資料
  • 1.    楊志祥. 基於.COM文件格式的一種動態加載機制的研究[D]. 重慶大學, 2007.