III. Quản lý vùng nhớ vμ Tổ chức, thi hμnh File d−ới DOS.
3. Cấu trúc của MCB (Memory Control Block).
Nh− chúng ta đã nói ở trên, phần vùng nhớ tạm thời đ−ợc chia thành các khối tạo thành chuỗi, mỗi khối đ−ợc quản lý bằng một cấu trúc đầu khối gọi là MCB.
MCB có kích th−ớc 16 byte, đặt ngay ở đầu vùng nhớ mà nó quản lý, cấu trúc của MCB nh− sau:
Offse t
Siz e
Item Nội dung
+0 1 ID Byte nhận diện loại của MCB +1 2 PSP PSP của MCB. +3 2 Size Kích th−ớc vùng nhớ mà MCB quản lý. +5 0B h Resev ed Dành riêng
+10h Khối vùng nhớ bắt đầu từ đây và chấm dứt ở byte (Size*10h) tính từ đây.
Giá trị của các tr−ờng trong cấu trúc trên có ý nghĩa nh− sau:
- ID: Là byte nhận diện xem MCB này có phải là MCB cuối cùng của chuỗi hay ch−a. nếu ch−a là cuối chuỗi, byte này có giá trị 4Dh, ng−ợc lại sẽ có giá trị 5Ah.
- PSP: Cho biết vùng nhớ do MCB này quản lý hiện còn trống hay đang đ−ợc dùng cho ch−ơng trình nào. Nếu giá trị là 0 thì ch−a có ch−ơng trình nào sử dụng, ng−ợc lại noc là giá trị PSP của ch−ơng trình đã xin cấp phát vùng nhớ này. Căn cứ vào giá trị trong PSP mà DOS biết đ−ợc vùng nhớ nào là của ch−ơng trình vừa chấm dứt để giải phóng vùng nhớ đó.
- Size: Là kích th−ớc theo đoạn của khối vùng nhớ mà MCB quản lý. Để xác định đ−ợc MCB đầu tiên, dùng chức năng 52h của ngắt 21h. Sau khi thực hiện chức năng này, ES:BX trỏ tới khối tham biến của DOS mà tr−ớc đó 2 byte (ở ES:[BX-2]) là giá trị segment của MCB đầu tiên. Các
MCB tiếp theo sẽ đ−ợc tính bằng cách cộng kích th−ớc của khối MCB tr−ớc nó với 1.
Đoạn ch−ơng trình sau minh họa cách duyệt qua các MCB: mov ah,52h
int 21h sub bx,2
mov ax,word ptr es:[bx]
mov es,ax ; es = đoạn của MCB đầu tiên Next:
mov al,byte ptr es:[0] ; Lấy ID của MCB cmp al,5Ah ; Là phần tử cuối?
je OK ; đúng, kết thúc
mov bx,word ptr es:[1] ; bx = PSP mov ax,word ptr es:[3] ; ax = Size call Print_MCB mov dx,ax mov ax,es add ax,dx inc ax mov es,ax jmp Next OK: call Print_MCB int 20h