WIKI使用導(dǎo)航
站長百科導(dǎo)航
站長專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計算
- 微博營銷
- 虛擬主機(jī)管理系統(tǒng)
- 開放平臺
- WIKI程序與應(yīng)用
- 美國十大主機(jī)
可執(zhí)行程序
來自站長百科
可執(zhí)行程序(EXE File)
- 一種可在操作系統(tǒng)存儲空間中浮動定位的可執(zhí)行程序。MS-DOS和MS-WINDOWS下,此類文件擴(kuò)展名為.exe
- WINDOWS操作系統(tǒng)中的二進(jìn)制可執(zhí)行文件,可執(zhí)行文件分兩種一種是后輟名為.COM另一種就是.EXE
定義[ ]
- .COM一般用于DOS,在WINDOWS系統(tǒng)中的執(zhí)行文件一般都是.EXE文件。在 MS-DOS 中,用以標(biāo)識可執(zhí)行文件的文件擴(kuò)展名。用戶在提示行輸入不帶 .exe 擴(kuò)展名的文件名后按 Enter 鍵就能運(yùn)行可執(zhí)行程序
文件結(jié)構(gòu)[ ]
- EXE 文件比較復(fù)雜,每個EXE文件都有一個文件頭,結(jié)構(gòu)如下:
- EXE文件頭的信息
偏移量 | 意義 |
---|---|
00h-01h | MZ'EXE文件標(biāo)記 |
02h-03h | 最后一頁的字節(jié)數(shù)(每頁512B) |
04h-05h | 文件長度(字節(jié)數(shù))除以512的商+1 |
06h-07h | 重定位項的個數(shù) |
08h-09h | 文件頭除16的商 |
0ah-0bh | 程序運(yùn)行所需最小段數(shù) |
0ch-0dh | ....大.... |
oeh-0fh | 堆棧段的段值 (SS) |
10h-11h | ........sp |
12h-13h | 文件校驗和 |
14h-15h | IP |
16h-17h | CS |
18h-19h | ............ |
1ah-1bh | ............ |
1ch | ............ |
- .EXE文件包含一個文件頭和一個可重定位程序映象。文件頭包含MS-DOS用于加載程序的信息,例如程序的大小和寄存器的初始值。文件頭還指向一個重定位表,該表包含指向程序映象中可重定位段地址的指針鏈表。文件頭的形式與EXEHEADER結(jié)構(gòu)對應(yīng):
- EXEHEADER STRUC
- exSignature dw 5A4Dh ;.EXE標(biāo)志
- exExraBytes dw ;最后(部分)頁中的字節(jié)數(shù)
- exPages dw ;文件中的全部和部分頁數(shù)
- exRelocItems dw ;重定位表中的指針數(shù)
- exHeaderSize dw ;以字節(jié)為單位的文件頭大小
- exMinAlloc dw ;最小分配大小
- exMaxAlloc dw ;最大分配大小
- exInitSS dw ;初始SS值
- exInitSP dw ;初始SP值
- exChechSum dw ;補(bǔ)碼校驗值
- exInitIP dw ;初始IP值
- exInitCS dw ;初始CS值
- exRelocTable dw ;重定位表的字節(jié)偏移量
- exOverlay dw ;覆蓋號
- EXEHEADER ENDS程序映象
- 包含處理器代碼和程序的初始數(shù)據(jù),緊接在文件頭之后。它的大小以字節(jié)為單位,等于EXE文件的大小減去文件頭的大小,也等于exHeaderSize的域的值乘以16。MS-DOS通過把該映象直接從文件拷貝到內(nèi)存加載.EXE程序然后調(diào)整定位表中說明的可重定位段地址。
- 定位表是一個重定位指針數(shù)組,每個指向程序映象中的可重定位段地址。文件頭中的exRelocItems域說明了數(shù)組中指針的個數(shù),exRelocTable域說明了分配表的起始文件偏移量。每個重定位指針由兩個16位值組成:偏移量和段值。 為加載.EXE程序,MS-DOS首先讀文件頭以確定.EXE標(biāo)志并計算程序映象的大小。然后它試圖申請內(nèi)存。首先,它計算程序映象文件的大小加上PSP的大小再加上EXEHEADER結(jié)構(gòu)中的exMinAlloc域說明的內(nèi)存大小這三者之和,如果總和超過最大可用內(nèi)存塊的大小。則MS-DOS停止加載程序并返回一個出錯值。如果總和沒超過最大可用內(nèi)存塊的大小,它便計算程序映象的大小加上PSP的大小再加上EXEHEADER結(jié)構(gòu)中exMaxAlloc域說明的內(nèi)存大小之和,如果第二個總和小于最大可用內(nèi)存塊的大小,則MS-DOS 分配計算得到的內(nèi)存量。否則,它分配最大可用內(nèi)存塊。分配完內(nèi)存后,MS-DOS確定段地址,也稱為起始段地址,MS-DOS從此處加載程序映象。如果exMinAlloc域和exMaxAlloc域中的值都為零,則MS-DOS把映象盡可能地加載到內(nèi)存最高端。否則,它把映象加載到緊挨著PSP域之上。接下來,MS-DOS讀取重定位表中的項目調(diào)整所有由可重定位指針說明的段地址。對于重定位表中的每個指針,MS-DOS尋找程序映象中相應(yīng)的可重定位段地址,并把起始段地址加到它之上。一旦調(diào)整完畢,段地址便指向了內(nèi)存中被加載程序的代碼和數(shù)據(jù)段。 MS-DOS在所分配內(nèi)存的最低部分建造256字節(jié)的PSP,把AL和AH設(shè)置為加載 .COM程序時所設(shè)置的值。MS-DOS使用文件頭中的值設(shè)置SP與SS,調(diào)整SS初始值,把起始地址加到它之上。MS-DOS還把ES和DS設(shè)置為PSP的段地址.最后,MS-DOS從程序文件頭讀取CS和IP的初始值,把起始段地址加到CS之 上,把控制轉(zhuǎn)移到位于調(diào)整后地址處的程序。