- Vị trí cụa con trỏ f ile.
CHƯƠNG 1 6: CÁC FILE CHƯƠNG TRÌNH CỤA DOS.
Khi thực hieơn các chương trình, heơ đieău hành náp các file chương trình vào boơ nhớ và chuyeơn quyeăn cho chúng. Moêi heơ đieău hành sẽ quy định moơt sô dáng thức rieđng (format) veă cách mođ tạ và toơ chức beđn trong cụa file chương trình. Heơ đieău hành DOS có hai dáng thức cho file chương trình là COM và EXE.
16.1FILE DÁNG COM
Khi DOS thực hieơn moơt file chương trình dáng COM, nó sẽ qua các bước sau: Thiêt laơp moơt environment segment.
Táo moơt PSP.
Đĩc toàn boơ file chương trình vào ngay sau PSP (offset 100h) Gán các thanh ghi segment baỉng với địa chư cụa PSP.
Cho SP=offset cuôi cụa segment SS roăi push 0 thực hieơn leơnh JMP PSP:0100h Như vaơy file chương trình dáng COM có các đaịc đieơm sau :
Kích thước file phại nhỏ hơn 65536 - 100h - 2 Baĩt đaău tái offset 0100h
Tât cạ chương trình trong moơt segment
File chương trình và chương trình khi thực hieơn hoàn toàn giông nhau Các chương trình dáng COM thođng thường kêt thúc baỉng Int 020h
16.2FILE DÁNG EXE
Khác với file dáng COM, các file dáng EXE có moơt câu trúc đaău file (Exe header) dùng đeơ lưu giữ các mođ tạ veă cách saĩp xêp, vị trí baĩt đaău cụa chương trình ...
Câu trúc cụa moơt Exe header: Offs Size Contents
==== ====
================================================================== +0 2 |4Dh 5aH| Dâu hieơu nhaơn dieơn EXE file (‘MZ’ hoaịc ‘ZM’)
|---
+2 2 |PartPag| kích thước thực cụa load module ở trang cuôi
|---
+4 2 |PageCnt| sô trang 512 bytes chứa load module và header
|---
+6 2 |ReloCnt| sô phaăn tử trong relocation table
|---
+8 2 |HdrSize| kích thước header tính baỉng paragraph (16 bytes)
|---
+0aH 2 |MinMemKích thước boơ nhớ tôi thieơu sau load module (paragraphs)
|---
+0cH 2 |MaxMemKích thước boơ nhớ tôi đa sau load module (paragraphs)
|---
+0eH 2 |ReloSSVị trí tương đôi cụa stack segment SS (paragraphs)
|---
+10H 2 |ExeSPGiá trị khởi đaău cụa SP
|---
+12H 2 |ChkSumtoơng tât cạ các word trong file nhađn với -1
+14H 2 |ExeIPGiá trị khởi đaău cụa IP
|---
+16H 2 |ReloCSVị trí tương đôi cụa code segment CS (paragraphs)
|---
+18H 2 |TablOff| Vị trí cụa relocation table trong EXE file
|---
+1aH 2 |Overlay| sô phaăn tử overlay ---
1cH đieơm kêt thúc cụa câu trúc EXE header --- - - |---
? 4*?|offset segment| |offset segment| Relocation table. --- - - Ĩ---
?? đieăn các giá trị 0 cho đaăy paragraph cuôi.
?? đieơm kêt thúc cụa EXE header
Khi thực hieơn moơt file chương trình dáng EXE, DOS sẽ qua các bước sau: Đĩc 1Ch bytes từ Exe Header ( offset 0 cụa EXE file )
Xác định kích thước boơ nhớ caăn thiêt cho Exe file
LoadSize = PageCnt*512 - HdrSize*16 - PartPag
LoadSize + MinMem + 100h <= ExeMem <= LoadSize + MaxMem + 100h ( 100h = kích thước cụa PSP )
ExeMem được xác định tùy theo sô lượng boơ nhớ còn lái cụa heơ thông. ExeMem sẽ lây giá trị lớn nhât có theơ được trong khoạng đã neđu. Thiêt laơp moơt environment segment.
Xin câp phát moơt vùng nhớ với kích thước ExeMem. Táo moơt PSP.
Xác định Start—seg. (Thođng thường Start—seg = PSP+10h). Đĩc load module vào boơ nhớ (baĩt đaău từ Start—seg:0000)
Load module baĩt đaău từ offset HdrSize*16 trong EXE file
Load module có kích thước baỉng : PageCnt*512 - HdrSize*16 - PartPag
Thực hieơn định vị lái các giá trị segment trong load module ( Xem thí dú ) Gán các giá trị khởi đaău cho các thanh ghi