如果
psp中的第乙個
fcb含有乙個有效驅動器識別符號,則置al為
00h,否則為
0ffh
。ms-dos
還置ah
為00h
或0ffh
,這依賴於第二個
fcb是否含有乙個有效驅動器識別符號。 建造
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
;可設定返回碼
end2.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檔案頭 段表
資源表駐留名錶
模組引用表
引入名字表
入口表非駐留名錶
**段和資料段
程式區重定位表
Windows可執行檔案簡述(一)
作業系統中的檔案是一種抽象的機制,提供了一種在磁碟上儲存資訊而且方便以後讀取的方法。在 windows 作業系統中,乙個使用者可以最直接體會到的檔案的形式就是以 exe dll 等為副檔名的可執行檔案。伴隨著 windows 作業系統的不斷進步,其可執行檔案的格式也發生了巨大變化。這期間主要有 4個...
Windows可執行檔案簡述(三)
4 le 格式在windows3.x 的時代,從 dos啟動 windows windows 在把機器轉到保護模式之前需要在實模式下做一些初始化。實模式的 16位 必須和 32位 一起放在可執行檔案中。舊的 dos下的可執行檔案和 ne格式的可執行檔案無法滿足這個要求,於是從 win 3.x 起到w...
linux 執行可執行檔案
1 首先,需要了解一下a.out這個目標檔案。a.out在linux下是elf executable linkable format 檔案格式,該目標檔案由乙個檔案頭 段 資料段 已初始化 從定位資訊區 符號表及符號名字字串構成,如下左圖所示,經過鏈結後生成執行檔案如下右圖所示,需要說明的是1 bs...