105 CHƯƠNG 16 : CÁCFILECHƯƠNGTRÌNHCỦA DOS. Khi thực hiện cácchương trình, hệ điều hành nạp cácfilechươngtrình vào bộ nhớ và chuyển quyền cho chúng. Mỗi hệ điều hành sẽ quy đònh một số dạng thức riêng (format) về cách mô tả và tổ chức bên trong củafilechương trình. Hệ điều hành DOS có hai dạng thức cho filechươngtrình là COM và EXE. 16.1FILE DẠNG COM Khi DOS thực hiện một filechươngtrình dạng COM, nó sẽ qua các bước sau: Thiết lập một environment segment. Tạo một PSP. Đọc toàn bộ filechươngtrình vào ngay sau PSP (offset 100h) Gán các thanh ghi segment bằng với đòa chỉ của PSP. Cho SP=offset cuối của segment SS rồi push 0 thực hiện lệnh JMP PSP:0100h Như vậy filechươngtrình dạng COM có các đặc điểm sau : Kích thước file phải nhỏ hơn 65536 - 100h - 2 Bắt đầu tại offset 0100h Tất cả chươngtrình trong một segment File chương trình và chươngtrình khi thực hiện hoàn toàn giống nhau Cácchươngtrình dạng COM thông thường kết thúc bằng Int 020h 16.2FILE DẠNG EXE Khác với file dạng COM, cácfile dạng EXE có một cấu trúc đầu file (Exe header) dùng để lưu giữ các mô tả về cách sắp xếp, vò trí bắt đầu củachươngtrình . Cấu trúc của một Exe header: Offs Size Contents ==== ==== ================================================================== +0 2 |4Dh 5aH| Dấu hiệu nhận diện EXE file (‘MZ’ hoặ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ố phần tử trong relocation table |------- +8 2 |HdrSize| kích thước header tính bằng paragraph (16 bytes) |------- +0aH 2 |MinMemKích thước bộ nhớ tối thiểu sau load module (paragraphs) |------- +0cH 2 |MaxMemKích thước bộ 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 đầu của SP |------- +12H 2 |ChkSumtổng tất cả các word trong file nhân với -1 |------- 106 +14H 2 |ExeIPGiá trò khởi đầ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ố phần tử overlay -------- 1cH điểm kết thúc của cấu trúc EXE header --------------- - - |--------------- ? 4*? |offset segment| |offset segment| Relocation table. ------------- - - Ĩ------------- ? ? điền các giá trò 0 cho đầy paragraph cuối. ? ? điểm kết thúc của EXE header Khi thực hiện một filechươngtrì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 bộ nhớ cầ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 bộ nhớ còn lại của hệ thống. ExeMem sẽ lấy giá trò lớn nhất có thể được trong khoảng đã nêu. Thiết lập một environment segment. Xin cấp phát một vùng nhớ với kích thước ExeMem. Tạo một PSP. Xác đònh Start—seg. (Thông thường Start—seg = PSP+10h). Đọc load module vào bộ nhớ (bắt đầu từ Start—seg:0000) Load module bắt đầu từ offset HdrSize*16 trong EXE file Load module có kích thước bằng : PageCnt*512 - HdrSize*16 - PartPag Thực hiện đònh vò lại các giá trò segment trong load module ( Xem thí dụ ) Gán các giá trò khởi đầu cho các thanh ghi DS = ES = PSP SS = Start—seg + ReloSS, SP = ExeSP CS = Start—seg + ReloCS, IP = ExeIP (Thực hiện JMP CS—value:IP—value hoặc PUSH CS—value ; PUSH IP—value ; RETF ) Đặc điểm củafilechươngtrình dạng Exe là : Kích thước filechươngtrình không có giới hạn Số segment trong chươngtrình không giới hạn Điểm khởi đầu, vò trí của STACK . được quy đònh trong bản thân chương trìnhFilechươngtrình và chươngtrình khi thực hiện không hoàn toàn giống nhau : quá trình load đã sửa đổi các giá trò segment trong chươngtrình cho phù hợp với vò trí được nạp. Mặt khác khi thực hiện, không phải khi nào toàn bộ chươngtrình cũng được nạp lên. Cácchươngtrình dạng EXE thông thường kết thúc bằng Int 021h chức năng 4Ch Thí dụ đònh vò lại các giá trò segment của load module: ; DS:SI = ỴRelocation table 107 ; CX = ReloCnt ; DX = Start—Seg ; Load module đã được đọc vào Start—Seg cld LL1: lodsw ; offset of ReloItem mov di,ax lodsw ; Relative Segment of ReloItem add ax,dx ; Adjust to Real Segment mov es,ax add word ptr es:[di],dx ; Adjust ReloItem loop LL1 16.3PROGRAM SEGMENT PREFIX (PSP) Các thông tin về chươngtrình đang thực hiện như tham số dòng lệnh, bộ nhớ thuộc về chươngtrình . được lưu chứa trong một cấu trúc đặc biệt gọi là PSP. Cấu trúc của PSP: Offs Size +0 2 |INT 20H| EXE programs may JMP or RET here (PSP:0) to exit |------- +2 2 |MemTopBiên trên vùng nhớ thuộc về chươngtrình (paragraph) |---|---- +4 1| (reserved) |---|--------------- +5 5 |CALL offset segment| FAR CALL to DOS function dispatcher ----|------|------- +6 (2)Availkích thước của Segment chươngtrình -------|---|---- (Trường hợp COM file) +0aH 4 |offset segment| Terminate address. INT 22H |------|------- +0eH 4 |offset segment| Ctrl-Break handler address INT 23H |------|------- +12H 4 |offset segment| Critical Error handler addr INT 24H |------------- - ------ +16H 16HDOS reserved area | |------|------ - ----- +2cH 2 |EnvSegĐòa chỉ của environment (segment) |-------------- - ------ +2eH 2eHDOS reserved area | |------------ - ----- +5cH 10Hformatted parm area 1setup as an FCB for 1 st cmd parameter |------------ - ----- +6cH 14Hformatted parm area 2setup as an FCB for 2 nd cmd parameter |---|--------- - ----- +80H 1 |len| Số ký tự trong tham số dòng lệnh |--------------- - ------ +81H 7fHUnformatted Parm AreaTham số dòng lệnh ------------- - ----- 108 +FFH Điểm kết thúc PSP Trước khi chuyển quyền, DOS chỉ đònh PSP:080h là đòa chỉ cho DTA mặc nhiên củachương trình. 16.4ENVIRONMENT Environment là một vùng nhớ lưu chứa các chuỗi ASCIIZ liên tiếp nhau. Các chuỗi ấy có dạng thức : name=value. Với name là các “biến môi trường” củaDOS như COMSPEC,PATH,PROMPT . được thiết lập bởi lệnh SET. Thí dụ về thông tin bên trong một environment: (biểu diễn bằng hợp ngữ) db ‘COMSPEC=c:\command.com’,0 ; Danh sách các biến môi db ‘PROMPT=$p$g’,0 ; trường củaDOS db ‘PATH=c:\;c:\dos;c:\utils’,0 ; db ‘TEMP=c:\windows\temp’,0 ; db 0 ; Kết thúc danh sách dw 1 ; Số Exec—String tiếp theo ; Thông thường là 1 db ‘C:\UTILS\HDDIAG.EXE’,0 ; Tên củachươngtrình được ; thực hiện (bao gồm cả PATH) db 0 109 Chöông 17 Caáu truùc device cuûa MSDOS . 105 CHƯƠNG 16 : CÁC FILE CHƯƠNG TRÌNH CỦA DOS. Khi thực hiện các chương trình, hệ điều hành nạp các file chương trình vào bộ nhớ và chuyển. về cách mô tả và tổ chức bên trong của file chương trình. Hệ điề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