COM格式

COM格式

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

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的縮寫。

在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檔案擴展名和相關二進制格式的知識,以及他們更可能熟悉.com網際網路域名。 電子郵件已傳送附屬檔案名稱類似於“www.example.com”。 不小心的微軟Windows用戶點擊這樣的附屬檔案可能會開始瀏覽一個名為http://www.example.com/的網站,而是運行附屬檔案的二進制命令檔案www.example,並給予它完全的許可權 無論其作者想到的是什麼機器。

注意COM檔案格式本身沒有任何惡意; 這是對.com命令檔案和.com商業網站之間巧合名稱衝突的利用。

相關詞條

相關搜尋

熱門詞條

聯絡我們