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