Windows可執行文件簡述(二)
如果PSP中的第一個FCB含有一個有效驅動器標識符,則置AL爲00h,否則爲0FFh。MS-DOS還置AH爲00h或0FFh,這依賴於第二個FCB是否含有一個有效驅動器標識符。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
建造PSP後,MS-DOS在PSP後立即開始(偏移100h)加載com文件,它置SS、DS和ES爲PSP的段地址,接着創建一個堆棧。爲了創建這個堆棧,MS-DOS置SP爲0000h。如果沒有分配64K內存,則要置寄存器爲比所分配的字節總數大2的值。最後,它把0000h推進棧,這是爲了保證與在早期MS-DOS版本上設計的程序的兼容性。
MS-DOS通過把控制傳遞偏移100h處的指令而啓動程序。程序設計者必須保證com文件的第一條指令是程序的入口點。
注意,因爲程序是在偏移100h處加載,因此所有代碼和數據偏移也必須相對於100h.彙編語言程序設計者可通過置程序的初值爲100h而保證這一點(例如通過在原程序的開始使用語句org 100h)。
下面是一個簡單的com文件Win32 ASM的例子:
MAN STRUCT ;定義一個結構
W dw 1234h ;dw 也可用 word
B db 9 dup(?) ;db 也可用 byte
MAN ENDS
.model tiny ;com格式文件
.data ;對於com格式文件,數據段的內容會自動放到代碼段後
zz MAN <>,<1,"abcd">,<3,"Ldf">
.code ;代碼段
.startup ;可使下面的指令從0100H 開始(com格式文件要求)
mov ax,3031h
mov zz.W,ax ;對結構賦值
mov zz.B,'1'
mov ax,type(MAN) ;取結構所佔字節數
.exit ;可設置返回碼
end
2.MZ格式
com發展下去就是MZ格式的可執行文件,這是DOS所能瞭解的具有重定位功能的可執行文件格式。MZ可執行文件內含16位代碼,在這些代碼之前加了一個文件頭,文件頭中包括各種說明數據,如第一句可執行代碼執行指令時所需要的文件入口點、堆棧的位置、重定位表等,操作系統根據文件頭重的信息將代碼部分裝入內存,讓後根據重定位表修正代碼,最後在設置好堆棧後從文件頭中指定的入口開始執行。所以DOS可以把程序放在任何它想要的地方。下圖是MZ格式的可執行文件的簡單結構示意圖:
MZ標誌 |
MZ文件頭 |
其它信息 | |
重定位表的字節偏移量 | |
重定位表 |
重定位表 |
可重定位程序映像 |
二進制代碼 |
3.NE格式
爲了保持對DOS的兼容性和保證Windows的需要,在Win 3.x中出現的NE格式的可執行文件中保留了MZ格式的頭(具體原因後面會說,這裏就不贅述了),同時NE文件又加了一個自己的頭,之後纔是可執行文件的可執行代碼。Win 3.x中的16位Windows程序或OS/2程序都有可能是NE格式的。NE類型包括了.exe、.dll、.drv和.fon四種類型的文件。NE格式的關鍵特性是:它把程序代碼、數據、資源隔離在不同的可加載區塊中。它也藉由符號輸入和輸出,實現所謂的執行時期動態鏈接。16位的NE格式文件裝載程序(NE Loader)讀取部分磁盤文件,並生成一個完全不同的數據結構,在內存中建立模塊。當代碼或數據需要裝入時,裝載程序必須從全局內存中分配出一塊,查找原始數據在文件的什麼地方,找到位置後再讀取原始的數據,最後再進行一些修整。還有,每一個16位的Module要負責記住現在使用的所有段選擇符,該選擇符表示該段是否已經被拋棄等等。下圖是NE格式的可執行文件的結構示意圖:
MS-DOS頭 |
DOS文件頭 |
保留區域 | |
Windows頭偏移 | |
DOS Stub程序 | |
信息塊 |
NE文件頭 |
段表 | |
資源表 | |
駐留名錶 | |
模塊引用表 | |
引入名字表 | |
入口表 | |
非駐留名錶 | |
代碼段和數據段 |
程序區 |
重定位表 |
=======================================================================
rivershan原創於2004年3月23日 3:38