COM格式

簡單的可執行文件

COM格式文件是一種簡單的可執行文件。在迪吉多公司於20世紀70年代推出的操作系統中,.COM被用做包含操作系統支持命令的文本文件的拓展名(類似於Windows系統的.cmd文件)。隨著引進CP/M的引進(微型計算機的操作系統),COM擴展相的文件改變為的可執行文件。該格式後來被結轉到MS-DOS。雖然MS-DOS中已有更常見的.exe文件格式的,緊湊的COM文件仍然保持活力,並在MS-DOS頻繁使用。

COM文件中沒有附帶任何支持性數據,僅包含可執行代碼。文件頭即為第一句執行指令。沒有重定位的信息,這樣代碼中不能有跨內存段(segment)操作數據的指令,因此代碼與數據只能限制在同一個64KB的內存段中。

二進位格式


-
式/-始二制執式。簡單 標題(除/ 件),且包含標準元據,僅包含碼據。簡單價:二制件,()節(節短 ),碼據存儲段。
息,操系統裝載預置址,偏移量,執(限制執件):固。器題,存,器具址空,式。
在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的縮寫。
在MS-DOS和兼容DOS中,載入器或執行環境沒有為COM文件提供內存管理。所有內存都可用於COM文件。執行后,操作系統命令外殼COMMAND.COM將重新載入。這留下了COM文件可能非常簡單,使用單個段或任意複雜的可能性,從而提供自己的內存管理系統。一個複雜程序的例子是COMMAND.COM,MS-DOS shell,它提供了一個載入器來載入其他COM或EXE程序。在.COM系統中,可以載入和運行較大的程序(最大可用內存大小),但系統載入程序假定所有代碼和數據都在第一段中,並且由.COM程序提供任何代碼和數據。進一步組織。如果必要的代碼包含在.COM程序中,則可通過動態鏈接處理大於可用內存或大型數據段的程序。使用.COM而不是.EXE格式的優點是二進位圖像通常更小,更容易使用彙編程序進行編程。一旦有足夠功率的編譯器和鏈接器可用,將.COM格式用於複雜程序就不再有利。
.COM文件在IBM PC早期之後通常不用於商業軟體可執行文件,格式主要用於命令行應用程序。

支持平台


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

兼容性


基於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。

執行效果


在MS-DOS中,如果一個目錄同時包含一個COM文件和一個具有相同名稱的EXE文件,那麼當沒有指定擴展名時,將優先選擇COM文件進行執行。例如,如果系統路徑中的某個目錄包含兩個名為foo.com和foo.exe的文件,則以下命令將執行foo.com:
運行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網際網路域名。電子郵件已發送附件名稱類似於“www.example.com”。不小心的微軟Windows用戶點擊這樣的附件可能會開始瀏覽一個名為http://www.example.com/的網站,而是運行附件的二進位命令文件www.example,並給予它完全的許可權 無論其作者想到的是什麼機器。
注意COM文件格式本身沒有任何惡意; 這是對.com命令文件和.com商業網站之間巧合名稱衝突的利用。