Caùc giaù trò soá löu chöùa trong Computer döôùi daïng töøng nhoùm caùc bit vôùi caùch bieåu dieãn 0 vaø 1 khaùc
haún caùch bieåu dieãn soá thoâng thöôøng cuûa chuùng ta (duøng caùc kyù soá 0,1.9). Caùch bieåu dieãn soá cuûa chuùng ta
döïa treân cô sôû möôøi kyù soá 0,1.9 ñöôïc goïi laø heä ñeám thaäp phaân, caùch bieåu dieãn soá trong Computer döïa
treân cô sôû hai kyù soá 0 vaø 1 ñöôïc goïi laø heä ñeám nhò phaân.
114 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 2036 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Gtasm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
àu ñoïc ghi ñöôïc gaén vaøo moät boä phaän ñieàu
khieån chung cho pheùp chuùng di chuyeån töø meùp ngoaøi vaøo taâm (vaø ngöôïc laïi) cuûa caùc maët ñóa.
Motor cho pheùp quay truïc ñóa vôùi moät vaän toác oån ñònh.
Maïch ñieàu khieån ñi keøm vôùi oå ñóa.
Khi truïc ñóa quay, caùc ñaàu ñoïc/ghi (Head) vaïch thaønh caùc ñöôøng ñoàng taâm treân caùc maët ñóa goïi laø töø
ñaïo (Track). Vôùi moãi vò trí cuûa head, ta coù moät taäp hôïp caùc töø ñaïo treân caùc maët ñóa goïi laø Cylinder. Thoâng
tin ñöôïc ghi treân caùc töø ñaïo theo töøng cung (sector). Moät sector thöôøng chöùa ñöôïc 512 bytes.
Treân maët ñóa, caùc töø ñaïo vaø ñaàu ñoïc/ghi ñöôïc ñaùnh soá töø 0 . Treân töø ñaïo caùc sector ñöôïc ñaùnh soá töø
1.
Caùc töø ñaïo (treân caùc maët dóa khaùc nhau) coù cuøng moät soá hieäu taïo thaønh moät maët truï (Cylinder) löu
chöùa thoâng tin.
Treân caùc maùy IBM PC/XT/AT vaø töông thích, caùc oå ñóa ñöôïc ñaùnh soá nhö sau:
Drive type Drive name Drive—ID
========== ========== ========
Floppy 1 A 0
Floppy 2 B 1
Fix disk 1 - 80h
Fix disk 2 - 81h
13.2ÑIEÀU KHIE ÅN
Maïch ñieàu khieån oå ñóa ñöôïc noái vôùi disk controller cuûa maùy vi tính. Caùc ñieàu khieån ñóa ñöôïc thöïc
hieän thoâng qua disk controller. Ñieàu khieån ñóa moät caùch tröïc tieáp qua disk controller raát phöùc taïp vaø khoù
khaên. Vì vaäy neáu khoâng coù yeâu caàu thaät ñaëc bieät, haõy duøng caùc trình ñieàu khieån ñóa cuûa BIOS. Caùc chöùc
naêng naøy ñöôïc cung caáp bôûi INT 013h .
13.3INTERRUPT 013H (CAÙC CHÖÙC NAÊNG THOÂNG DUÏNG)
13.3.1Reset disk
Input: AH = 0
DL = Drive—ID
> Reset laïi caùc thoâng soá cho controller töông öùng vôùi oå ñóa.
13.3.2Get error status
Input: AH = 1
DL = Drive—ID
Output: AL = Error code (AL=0 --> No error)
13.3.3Read sectors
Input: AH = 2 F E D C B A 9 8 7 6 5 4 3 2 1 0
AL = Sector count -------------------------------
87
CX = SecCylCylinder |Cyl| Begin Sec |
DH = Head ------------------
DL = Drive—ID 7 6 5 4 3 2 1 0 9 8 5 4 3 2 1 0
ES:BX = ÎRead buffer ------------------- -----------
Output: CF = 1 --> Error (AH = Error code)
CF = 0 --> OK
13.3.4Write sectors
Input: AH = 3
Caùc tham soá töông töï nhö read sectors.
13.3.5Verify sectors
Input: AH = 4
Caùc tham soá töông töï nhö read sectors, nhöng khoâng caàn chæ ñònh giaù trò
cho ES:BX. Döõ lieäu khoâng ñöôïc chuyeån vaøo boä nhôù cuûa maùy tính.
13.3.6Format track
Input: AH = 5
AL = Sectors per track
CX = SecCyl
DH = Head
DL = Drive—ID
ES:BX = ÎSector descriptor table
Diskette --> 4 bytes CHNS element
C:Cylinder,H:Head,N:SecNo,S:Size of sector
S=0 -> 128 bytes/sector
S=1 -> 256 bytes/sector
S=2 -> 512 bytes/sector
S=3 -> 1024 bytes/sector
Require AL*4 bytes buffer size
Hard disk --> 2 bytes FN element
F:Status flag (Return value) F=0--> good sector
N:SecNo
Require 512 bytes buffer size (AT Technical reference)
13.3.7Get drive parameter
Input: AH = 8
DL = Drive—ID
Output: DL = Number of hardisk in first controller
DH = Maximum value of head
CX = Maximum value of SecCyl
Coù theå tham chieáu ñeán caùc thoâng soá cuûa caùc ñóa cöùng moät caùch chi tieát hôn qua hard disk parameter
table.
Int 041h chæ ñeán baûng tham soá cuûa drive 080h
Int 046h chæ ñeán baûng tham soá cuûa drive 081h
88
13.3.8Read disk type
Input: AH = 15h
DL = Drive—ID
Output: AH = 0 --> Drive is not present
AH = 1,2 --> Diskette
AH = 3 --> Hard disk
13.3.9Disk error code
- 00H no error on last operation
- 01H bad command: invalid request to controller
- 02H bad address mark
- 03H write protect: attempted to write on write-protected diskette
- 04H sector ID bad or not found.
- 05H reset failed
- 08H DMA failure
- 09H DMA overrun: attempted to write across a 64K-byte boundary.
- 0bH bad track flag encountered
- 10H bad CRC: invalid CRC when data checked.
- 11H data corrected: recoverable error found/corrected by ECC algorithm
- 20H controller failure
- 40H bad seek. requested track not found
- 80H time out. drive did not respond
- 0aaH drive not ready
- 0bbH undefined error
- 0ffH sense operation failed
13.3.10Hard disk parameter table (INT 41 & INT 46)
Offs Size Description
1. 00h WORD number of cylinders
2. 02h BYTE number of heads
3. 03h WORD starting reduced write current cylinder (XT only,0 for others)
4. 05h WORD starting write precompensation cylinder number
5. 07h BYTE maximum ECC burst length (XT only)
6. 08h BYTE control byte
- bits 0-2: drive option (XT only, 0 for others)
- bit 3: set if more than 8 heads (AT and later only)
- bit 4: always 0
- bit 5: set if manufacturer’s defect map on max cylinder+1
- (AT and later only)
- bit 6: disable ECC retries
- bit 7: disable access retries
7. 09h BYTE standard timeout (XT only, 0 for others)
8. 0Ah BYTE formatting timeout (XT and WD1002 only, 0 for others)
9. 0Bh BYTE timeout for checking drive (XT and WD1002 only,0 for others)
10. 0Ch WORD cylinder number of landing zone (AT and later only)
11. 0Eh BYTE number of sectors per track (AT and later only)
89
12. 0Fh BYTE reserved
13.4RELATIVE SECTOR
Trong khai thaùc thoâng tin treân ñóa, ngöôøi ta thöôøng khaùi quaùt hoùa caáu truùc ñóa thaønh moät vaät theå kyù
tin vôùi ñôn vò löu chöùa cô baûn laø caùc sector ñöôïc ñaùnh soá lieân tuïc töø 0. Caùc sector vôùi caùch ñaùnh soá nhö
vaäy goïi laø relative sector.
Theo yù nieäm treân, ta coù ñoái chieáu giöõa caùc physical sector vaø relative sector nhö sau : (Giaû söû ñóa
coù 975 cylinders, 5 heads, 17 sectors/track)
Relative sector Physical sector (C:H:S)
0 0:0:1
1 0:0:2
2 0:0:3
... ...
16 0:0:17
17 0:1:1
18 0:1:2
... ...
84 0:4:17
85 1:0:1
... ...
Relative sector khoâng phuï thuoäc vaøo caùc thoâng soá vaät lyù cuûa ñóa, do ñoù cho pheùp toå chöùc löu giöõ
thoâng tin treân ñóa theo moät soá quy taéc toång quaùt. Theo ñoù caùc ñoaïn chöông trình truy nhaäp ñóa seõ khoâng leä
thuoäc vaøo caùc thoâng soá khaùc nhau cuûa caùc loaïi ñóa cöùng.
13.5PARTITION
Moãi moät hard disk treân IBM PC ñöôïc chia thaønh moät hay nhieàu phaàn (veà maët logic) goïi laø caùc
partition. Moãi partition ñöôïc taïo thaønh töø moät taäp hôïp caùc relative sector lieân tieáp nhau.
Thoâng thöôøng caùc partition treân moät hard disk ñöôïc saép xeáp keà nhau, khoâng coù caùc sector troáng ôû
giöõa.
Moãi partition thöôøng baét ñaàu töø sector 1, head 0 cuûa moät cylinder naøo ñoù.
Thoâng tin veà caùc partition ñöôïc löu giöõ trong moät caáu truùc ñaëc bieät goïi laø partition table. Ñoù laø moät
baûng goàm 4 phaàn töû ñaët taïi offset 01BEh trong master boot cuûa hard disk. Moãi phaàn töû thuoäc baûng ñöôïc
goïi laø moät partion entry. Moãi partition entry seõ löu giöõ thoâng tin veà moät partition.
Caáu truùc cuûa moät partition entry:
offs Size Contents
==== ==== ==============================================================
+0 1 |Boot Boot flag: 0=not active, 80H = active
|----
+1 1 |HdBegin head of the first sector of partition
|---|----
+2 2 |Sec Cyl| Begin SecCyl of the first sector of partition
|---|----
+4 1 |Sys| System Code: 0=unknown, 1=DOS 12-bit FAT, 4=16-bit
|---- 5= Extended DOS Partition, 6=BIG DOS
+5 1 |HdEnd head of the last sector of partition
|---|----
90
+6 2 |Sec Cyl| End SecCyl of the last sector of partition
|------|-------
+8 4low highBeginning relative sector number
|------|-------
+0cH 4low highSize (total sectors in partition)
--------------
Active Partition laø partition coù chöùa heä ñieàu haønh seõ ñöôïc töï ñoäng naïp vaøo sau khi khôûi ñoäng
computer. Treân moãi ñóa cöùng chæ coù moät active partition.
13.6MASTER BOOT (PHYSIC BOOT)
Sector 0:0:1 ñöôïc BIOS quy ñònh laø master boot cuûa hard disk. Master boot goàm hai phaàn chính:
Partition table vaø bootstrap routine.
Caáu truùc cuûa master boot:
Offset Size Contents
====== ==== ============================================================
----- - - - - - - - - - - - - - - - - - - - - - - - - - -----
+0 1beHcode to load and execute boot sector of active partition |
|--- - Ó - Ó - Ó -- Ó - Ó - Ó - Ó - Ó - Ó - Ó - Ó - Ó----
+1beH 10H| partition 1 entry (see below)
|--- - Ó - Ó - Ó----
+1ceH 10H| partition 2 entry
|--- - Ó - Ó - Ó----
+1deH 10H| partition 3 entry
|--- - Ó - Ó - Ó----
+1eeH 10H| partition 4 entry
|--- -- Ó - Ó----
+1feH 255 AApartition table signature (0aa55H)
--------
Ñoaïn chöông trình trong master boot ñöôïc goïi laø bootstrap routine.
Khi computer ñöôïc khôûi ñoäng, sau quaù trình POST (Power On Self Test), master boot ñöôïc ñoïc vaøo
ñòa chæ 0:7C00 vaø quyeàn ñieàu khieån ñöôïc chuyeån ñeán vò trí aáy.
Sau khi nhaän ñöôïc quyeàn ñieàu khieån, bootstrap routine seõ doø tìm active partition trong partition table
(taïi ñòa chæ 07DBE).
Neáu tìm thaáy,bootstrap routine seõ naïp module khôûi ñoäng heä ñieàu haønh töø active partition vaø chuyeån
quyeàn ñieàu khieån cho module aáy.
13.7MOÄT THÍ DUÏ VEÀ THUÛ TUÏC ÑOÏC/GHI RELATIVE SECTOR.
Drive—No db -1
C—Count dw 0
H—Count dw 0
SPT dw 0 ; SecPerTrack
GetHD—parm proc near
91
; DL = Drive—No
;
; Thuû tuïc naøy phaûi thöïc hieän tröôùc
; khi duøng ReadSec
push ax
push bx
push cx
push dx
mov byte ptr Drive—No,dl
mov ah,8
int 013h
inc dh
mov byte ptr H—Count,dh
mov ax,cx
and al,00111111b
mov byte ptr SPT,al
xchg ch,cl
mov ax,cx
mov cl,6
shr ah,cl
inc ax
mov word ptr C—Count,ax
pop dx
pop cx
pop bx
pop ax
ret
GetHD—parm endp
LogicToPhysic proc near
push bx
div word ptr SPT
inc dx
mov bx,dx ; soá dö laø SecNo
xor dx,dx
div word ptr H—count
mov dh,dl ; soá dö laø HeadNo
xchg ah,al ; thöông soá laø CylinderNo
mov cl,6
shl al,cl ; taïo SecCyl value
or ax,bx
mov cx,ax
mov dl,byte ptr Drive—No
mov ax,bx
sub ax,word ptr SPT
neg ax
92
inc ax ; AX = soá sector toái ña coù theå ñoïc
pop bx ; ( SPT - BeginSec +1 )
ret
LogicToPhysic endp
;--------------------------
ReadSec1 proc near
; DX:AX = Relative sector number
; ES:BX = ÎBuffer
;
; Ñoïc moät sector
;
call LogicToPhysic
mov ax,0201h
int 013h
ret
ReadSec1 endp
;--------------------------
ReadSec2 proc near
; DX:AX = Relative sector number
; ES:BX = ÎBuffer
; CX = Sector count
;
; Ñoïc nhieàu sector, goïi Int—13 n laàn ( n = sector count )
;
RS2a:
push ax
push cx
push dx
call LogicToPhysic
mov ax,0201h
int 013h
pop dx
pop cx
pop ax
jc RS2b
inc ax
adc dx,0
add bx,0200h
loop RS2a
RS2b:
jnc RS2c
mov ah,1
int 013h
93
stc
RS2c:
ret
ReadSec2 endp
;--------------------------
BeginRS dw 0,0
TotalSec dw 0
ReadSec3 proc near
; DX:AX = Relative sector number
; ES:BX = ÎBuffer
; CX = Sector count
;
; Ñoïc nhieàu sector, goïi Int—13 vôùi soá laàn ít nhaát.
;
mov word ptr TotalSec,cx
mov word ptr BeginRS[0],ax
mov word ptr BeginRS[2],dx
RS3—0:
mov ax,word ptr BeginRS[0]
mov dx,word ptr BeginRS[2]
call LogicToPhysic
cmp ax,TotalSec ; ax = SPT - BeginSec +1
jbe RS3—1
mov ax,TotalSec
RS3—1:
sub TotalSec,ax
add word ptr BeginRS[0],ax
adc word ptr BeginRS[2],0
push ax
mov ah,2
int 013h
pop ax
jc RS3—2
xchg ah,al
shl ax,1
add bx,ax ; ax = ax*512
cmp TotalSec,0
jne RS3—0
RS3—2:
jnc RS3—3
mov ah,1
int 013h
stc
94
RS3—3:
ret
ReadSec3 endp
95
CHÖÔNG 14 : TOÅ CHÖÙC ÑÓA CUÛA HEÄ ÑIEÀU HAØNH MSDOS
14.1MOÄT SOÁ YÙ NIEÄM
Heä ñieàu haønh MSDOS toå chöùc löu tröõ thoâng tin treân ñóa theo caùc volume.
Ñoái vôùi Floppy disk, moãi ñóa laø moät volume.
Ñoái vôùi ñóa cöùng, moãi DOS Partition laø moät volume. Moãi volume töông öùng vôùi moät oå ñóa logic
(A,B,C,D,E...)
MSDOS volume ñöôïc chia thaønh nhieàu ñôn vò löu chöùa thoâng tin baèng nhau goïi laø cluster. Moãi
cluster laø moät taäp hôïp goàm n sector lieân tieáp nhau. Trong moät volume, caùc cluster ñeàu coù kích thöôùc nhö
nhau .
Moãi file döõ lieäu ñöôïc löu giöõ trong moät hay nhieàu cluster tuøy theo kích thöôùc cuûa file. Chuoãi caùc
cluster theo thöù töï löu giöõ thoâng tin cuûa moät file ñöôïc goïi laø moät cluster chain. Ñeå ghi nhôù veà tình traïng
cuûa caùc cluster trong volume, MSDOS duøng moät caáu truùc goïi laø baûng FAT (File Alocation Table). Ñaây laø
moät ma traän vôùi moãi phaàn töû ñaïi dieän cho moät cluster. Giaù trò ghi nhôù trong moãi phaàn töû töôïng tröng cho
tình traïng cuûa cluster maø noù ñaïi dieän.
Moãi moät file, ngoaøi caùc thoâng tin ñöôïc löu giöõ coøn coù caùc ñaëc tröng rieâng nhö teân file, ngaøy giôø taïo
laäp ... Caùc thoâng tin naøy ñöôïc ghi nhaän trong moät danh saùch ñaëc bieät goïi laø thö muïc (directory) . Moãi phaàn
töû trong thö muïc goïi laø moät directory entry.
Moãi volume cuûa MSDOS ñeàu coù moät vuøng daønh rieâng goïi laø root directory. Trong ñoù coù moät soá
löôïng xaùc ñònh caùc directory entry ñeå löu giöõ thoâng tin veà caùc file.
Ñeå môû roäng khaû naêng löu tröõ file, töø version 2.0, heä ñieàu haønh MSDOS cho pheùp ghi nhôù caùc
directory entry theo cung caùch töông töï nhö ghi nhôù thoâng tin cuûa caùc caùc file döõ lieäu. Caùc file ñaëc bieät chæ
löu chöùa caùc directory entry naøy ñöôïc goïi laø caùc thö muïc con (sub directory).Khi caùc thö muïc con chính
baûn thaân noù laïi löu chöùa caùc moâ taû cuûa caùc thö muïc con khaùc, khaùi nieäm caây thö muïc ñöôïc thaønh hình.
14.2CAÁU TRUÙC VOLUME MSDOS
Moät volume cuûa MSDOS ñöôïc chia thaønh caùc phaàn chính theo thöù töï nhö sau:
Boot record (sector ñaàu tieân cuûa volume)
Caùc baûng FAT (thöôøng coù 2 baûng)
Root directory
Data (ñöôïc chia thaønh caùc cluster - töø 2 trôû ñi)
14.3CAÁU TRUÙC CUÛA MSDOS BOOT RECORD
Media Descriptor
| ValueMedia Types |
|---------|------------------------------------
FFH2 sides, 8 sectors per track |
FEH1 side, 8 sectors per track |
FDH2 sides, 9 sectors per track |
FCH1 side, 9 sectors per track |
F9H2 sides, 15 sectors per track |
F8Hfixed disk |
----------------------------------------------
-----------------------------------------------------------
|Offs|Size| Contents Version
|----|----|--------------------------------------------------<--
96
| 0003E9 XX XX or EB XX 90 (JMP to bootstrap routine)|
|----|----|-------------------------------------------------- |
| 0308OEM name and version |
|----|----|-------------------------------------------------- |
| 0B02Bytes per sector|
|----|----|-------------------------------------------------- |
| 0D01Sector per allocation unit (cluster size)|
|----|----|-------------------------------------------------- |
| 0E02Reserved sertors (size of boot record)| 2.x
|----|----|-------------------------------------------------- |
| 1001Number of FATs|
|----|----|-------------------------------------------------- |
| 1102Number of directory entries|
|----|----|-------------------------------------------------- |
| 1302Total sectors in volume (0 if volume size>32MB)|
|----|----|-------------------------------------------------- |
| 1501Media descriptor byte |
|----|----|-------------------------------------------------- |
| 1601Number of sertors per FAT |
|----|----|--------------------------------------------------<--
| 1802Sertor per track|
|----|----|-------------------------------------------------- |
| 1A02Number of heads| 3.x
|----|----|-------------------------------------------------- |
| 1C02Number of hidden sector (LowWord)|
|----|----|--------------------------------------------------<--
| 1E02Number of hidden sector (HiWord)|
|----|----|-------------------------------------------------- |
| 2004Total sectors in volume (volume size>32MB)|
|----|----|-------------------------------------------------- |
| 2401Physical drive number |
|----|----|-------------------------------------------------- |
| 2501Reserved | 4.x
|----|----|--------------------------------------------------5.x
| 2601Extended boot signature (29H)| 6.x
|----|----|-------------------------------------------------- |
| 270432-bit binary volume ID |
|----|----|-------------------------------------------------- |
| 2B0BVolume label|
|----|----|-------------------------------------------------- |
| 3608Reserved |
|----|----|--------------------------------------------------<--
|| Bootstrap routine |
14.4CAÁU TRUÙC CUÛA FAT (FILE ALOCATION TABLE)
97
Moãi baûng FAT chieám 1 hay nhieàu sector. Moãi baûng FAT ñöôïc chia thaønh nhieàu phaàn töû ñöôïc ñaùnh
soá töø 0. Coù hai loaïi kích thöôùc cho caùc phaàn töû cuûa FAT:12 bit vaø 16 bit.
Phaàn töû thöù 0 vaø thöù 1 cuûa FAT ñöôïc daønh rieâng cho caùc moâ taû nhö sau:
Byte thöù nhaát seõ mang giaù trò cuûa media descriptor byte. Caùc byte coøn laïi mang giaù trò FFh
Phaàn töû thöù 2 trôû ñi ñaïi dieän cho caùc cluster trong vuøng data. Caùc giaù trò ghi trong caùc phaàn töû naøy
cho bieát tình traïng cuûa caùc cluster töông öùng nhö sau:
0 : cluster coøn troáng.
0002h - FFEFh : cluster ôû giöõa chain. Giaù trò löu chöùa chính laø soá hieäu cuûa cluster keá tieáp trong
chain.
FFF0h - FFF7h : cluster daønh rieâng (khoâng ñöôïc söû duïng).
FFF7h : cluster bò hoûng
FFF8h - FFFFh : cluster cuoái cuøng trong chain.
14.5CAÁU TRUÙC CUÛA DIRECTORY ENTRY
Offs Size Contents
==== ==== ================================================================
+0 8 |’F’ ‘I’ ‘L’ ‘E’ ‘N’ ‘A’ ‘M’ ‘E’| left-justified, blank-padded
|---------|----------------
+8 3 |’E’ ‘X’ ‘T’| left-justified, blank-padded
|---|---|----
+0bH 1 |atr| file attribute (*)
|----------- - - -----
+0cH 0aHreserved |
|------|--- - - Ó----
+16H 2timetime created or last modified in filetime format (*)
|-------
+18H 2datedate created or last modified in filetime format (*)
|-------
+1aH 2 |ClstrNo| cluster number of start of file (link into FAT)
|--------------
+1cH 4file sizefile size in bytes
--------------
File attribute format
[7|6|5|4|3|2|1|0]
|a|d|v|s|h|r|
UØ—UÙÓUÙÓUÙÓUÙÓUÙÓUÙEÄ bit description
||OÁÔÙ> 0: 1=file is Read-only (can’t be written/deleted)
|| OÁÔÙÔÙÔÙ> 1: 1=Hidden
|OÁÔÙÔÙÔÙÔÙÔÙ> 2: 1=System
| OÁÔÙÔÙÔÙÔÙÔÙÔÙÔÙ> 3: 1=Volume label entry
OÁÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙ> 4: 1=subDirectory entry
OÁÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙ> 5: Archive bit. 1=file has NOT been backed up
File time format
[5|4|3|2|1|0|9|8UÙ7|6|5|4|3|2|1|0]
hourminutesec/2 |
98
UØ--------ÔÕ--------EÄ
OÁÔÙÔÙÔÙOÃÔÙÔÙÔÙEÃ OÁÔÙÔÙÔÙÔÙOÃÔÙÔÙÔÙÔÙEÃ OÁÔÙÔÙÔÙOÃÔÙÔÙÔÙEÃ
| OÁÔÙÔÙÔÙÔÙ> second/2
OÁÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙ> minute
OÁÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙ> hour
File date format
[5|4|3|2|1|0|9|8UÙ7|6|5|4|3|2|1|0]
yearmonthday |
UØ--------ÔÕ--------EÄ
OÁÔÙÔÙÔÙÔÙÔÙOÃÔÙÔÙÔÙÔÙÔÙEÃ OÁÔÙÔÙOÃÔÙÔÙEÃ OÁÔÙÔÙÔÙOÃÔÙÔÙÔÙEÃ
| OÁÔÙÔÙÔÙÔÙ> day
OÁÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙ> month
OÁÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙ> year-1980 (0-119 valid)
Byte ñaàu tieân cuûa filename mang caùc yù nghóa nhö sau:
Giaù trò 0 : directory entry coøn troáng (chöa duøng ñeán)
Giaù trò E5h : directory entry ñaõ bò xoùa boû
Caùc giaù trò khaùc : directory entry ñang ñöôïc söû duïng
Ñoái vôùi thö muïc con:
File size luoân baèng 0 --> kích thöôùc thö muïc chæ coù theå suy töø FAT.
Entry ñaàu coù name laø . (moät daáu chaám) mang thoâng tin veà vò trí, ngaøy giôø taïo laäp, cluster baét ñaàu
cuûa chính thö muïc con ñoù.
Entry thöù hai coù name laø .. (hai daáu chaám) mang thoâng tin veà vò trí, ngaøy giôø taïo laäp, cluster baét ñaàu
cuûa thö muïc chöùa thö muïc con ñoù. (neáu giaù trò cluster baèng 0 --> thö muïc meï laø root)
14.6MINH HOÏA VE À TOÅ CHÖÙC FAT VAØ THÖ MUÏC
starting cluster number ÔÙÔÙEÅ
Directory [----------------------------------------------v--------]
Entry ÔÙÔÙ |M Y F I L E T X T|a| |tim|dat|08size |
UØ--------------------------|-----EÄ
OÀÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙEÃ
00 01 02 03 04 05 06 07 |8 09 0a 0b 0c 0d 0e 0f
---------------------------------v------------------------------
00 |ID||ff||03=>04=>05=>ff||00||00||09=>0a=>0b=>15||00||00||00||00|
---------------------------------------------|------------------
OÀÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙÔÙEÃ
---------------------v------------------------------------------
10 |00||00||00||00||00||16=>17=>19||f7||1a=>1b=>ff||00||00||00||00|
-----------------------------|-------AÙ--------------------------
OÁÔÙÔÙÔÙÔÙÔÙÔÙÔÙEÃ
14.7LOGICAL SECTOR
Caùc sector trong moät volume ñöôïc MSDOS ñaùnh soá töø 0 trôû ñi. Caùc sector vôùi caùch ñaùnh soá nhö vaäy
goïi laø logical sector. Veà baûn chaát, logical sector vaø relative sector töông töï nhau. Veà phöông dieän tính
toaùn, relative sector baèng vôùi logical sector coäng theâm vò trí baét ñaàu cuûa volume.
Ta neân duøng interrupt 25h ñeå ñoïc caùc logical sector. interrupt 26h ñeå ghi caùc logical sector.
Input: AL = drive number (0=A, 1=B, etc.)
DX = sector baét ñaàu
99
DS:BX = Îbuffer
CX = soá löôïng sector ñoïc/ghi (<FFFFh)
CX = FFFFh --> taùc vuï treân BIG DOS partitions (>32M)
DS:BX = Ñòa chæ cuûa transfer packet (10 bytes)
DS:[BX+0] sector baét ñaàu (DWORD)
DS:[BX+4] soá löôïng sectors ñoïc/ghi (WORD)
DS:[BX+6] offset cuûa buffer (WORD)
DS:[BX+8] segment cuûa buffer (WORD)
Output: CF = 1 --> AX = error code
Löu yù : + Taát caû caùc thanh ghi seõ bò thay ñoåi tröø DS, ES, SS, SP
Caùc interrupt naøy keát thuùc baèng leänh retf, do ñoù seõ ñeå laïi côø hieäu trong stack khi keát thuùc.
Logical sector baét ñaàu cuûa moät cluster tính baèng coâng thöùc sau :
root—sects = (RootSize * 32) / SecSize
first—data = ResSecs + (FatSize * FatCnt) + root—sects
logical—sector = first—data + ((cluster—no - 2) * ClusSize)
100
CHÖÔNG 15 :
CAÙC CHÖÙC NAÊNG VEÀ FILE VAØ THÖ MUÏC CUÛA HEÄ ÑIEÀU HAØNH DOS
Caùc chöùc naêng cô baûn cuûa heä ñieàu haønh DOS ñeàu taäp trung vaøo Interrupt 21h. Soá hieäu cuûa chöùc
naêng ñöôïc ñaët trong thanh ghi AH,caùc tham soá ñöôïc ñaët trong caùc thanh ghi coøn laïi. Caùc chuoãi ñöôïc söû
duïng trong interrupt 21h thöôøng laø caùc daõy ASCIIZ (caùc daõy kyù töï keát thuùc baèng maõ 0). Khi chöùc naêng
thöïc hieän gaëp loãi, côø hieäu CF ñöôïc döïng leân vaø maõ loãi thöôøng ñöôïc ñaët trong AX.
Ñeå truy nhaäp thoâng tin trong moät file caàn phaûi coù caùc thoâng soá nhö :
- Teân file.
- Vò trí löu chöùa directory entry.
- Caùc cluster löu chöùa thoâng tin cuûa file.
- Kích thöôùc file hieän haønh.
- Vò trí cuûa con troû file.
- ....
Caùc thoâng soá naøy ñöôïc ñaët trong moät caáu truùc ñaëc bieät goïi laø FCB (File Control Block) . Caùc chöùc
naêng veà file seõ döïa theo thoâng tin trong FCB ñeå thöïc hieän. Moãi file ñöôïc ñieàu khieån bôûi moät FCB. Tröôùc
khi file ñöôïc truy nhaäp, FCB töông öùng vôùi noù phaûi ñöôïc chuaån bò caùc thoâng soá cô baûn (thoâng thöôøng ñoù laø
caùc thoâng tin chöùa trong directory entry töông öùng vôùi file). Vieäc thieát laäp caùc thoâng soá ban ñaàu cho moät
FCB ñöôïc goïi laø taùc vuï môû file (open file). Thoâng thöôøng thì caùc chöông trình öùng duïng chæ caàn chæ ra moät
FCB ñaõ coù chöùa saün teân file vaø yeâu caàu heä ñieàu haønh “môû file”. Heä ñieàu haønh seõ tìm kieám vaø ñieàn ñaày
ñuû caùc thoâng tin coøn laïi vaøo FCB aáy. Sau ñoù, moãi laàn caàn truy nhaäp file, chöông trình öùng duïng seõ goïi ñeán
chöùc naêng töông öùng cuûa heä ñieàu haønh ñính keøm vôùi ñòa chæ cuûa FCB. Caùc chöông trình öùng duïng phaûi töï
mình taïo ra vaø quaûn lyù caùc FCB. Ñieàu naøy khoâng ñöôïc thuaän tieän cho laém khi phaùt trieån caùc version môùi
cuûa heä ñieàu haønh : caáu truùc cuûa FCB laø baát bieán. Ñeå khaéc phuïc vaán ñeà naøy, moät cung caùch toå chöùc ôû möùc
cao hôn ñöôïc ñöa ra : heä ñieàu haønh taïo ra moät caáu truùc töông töï nhö moät maûng caùc FCB trong vuøng nhôù
rieâng cuûa noù. Khi chöông trình öùng duïng caàn môû moät file, chæ caàn goïi chöùc naêng môû file cuûa heä ñieàu haønh
cuøng vôùi teân cuûa file. Heä ñieàu haønh seõ töï ñoäng caáp phaùt moät FCB coøn troáng, ñieàn caùc thoâng soá caàn thieát
vaøo ñoù vaø traû laïi cho chöông trình öùng duïng soá hieäu cuûa FCB ñoù (goïi laø file handle number). Caùc taùc vuï
treân file keá tieáp chæ caàn ñính keøm vôùi soá hieäu töông öùng cuûa file.
Maët khaùc, yù nieäm veà file handle ñaõ ñöôïc môû roäng ra nhieàu so vôùi FCB. DOS quan nieäm file handle
laø moät ñaàu moái coù theå cung caáp hoaëc tieáp nhaän thoâng in theo moät soá cung caùch nhaát ñònh tuøy theo thuoäc
tính cuûa töøng file handle. Theo ñoù file handle khoâng chæ quaûn lyù caùc file treân ñóa, maø coøn coù theå ñaïi dieän
cho caùc thieát bò khaùc.
Thí duï :
Baøn phím laø moät nguoàn cung caáp döõ lieäu moät caùch tuaàn töï.
(Töông ñöông vôùi moät file môû ôû mode read only)
Maùy in laø moät nôi tieáp nhaän döõ lieäu moät caùch tuaàn töï.
(Töông ñöông vôùi moät file môû ôû mode write only)
Maëc duø heä ñieàu haønh DOS cung caáp caû hai cung caùch truy nhaäp file (theo FCB vaø theo file handle ),
nhöng caùc chöùc naêng duøng tröïc tieáp FCB chæ nhaèm töông thích vôùi caùc version ñaàu tieân cuûa DOS maø thoâi.
Trong taøi lieäu naøy, huùng ta seõ chæ ñeà caäp ñeán caùc chöùc naêng duøng file handle.
15.1CAÙC CHÖÙC NAÊNG VEÀ FILE
15.1.1Taïo laäp file (Create)
101
Input : AH = 3Ch
CX = File attribute
DS:DX = ÎBuffer chöùa file name (ASCIIZ)
Output : CF = 1 --> AX = error code
CF = 0 --> AX = file handle number
(file töï ñoäng ñöôïc môû vôùi mode ñoïc/ghi)
15.1.2Môû file (Open)
Input : AH = 3Dh
AL = 0 --> mode read only
= 1 --> mode write only
= 2 --> mode read/write
DS:DX = ÎBuffer chöùa file name (ASCIIZ)
Output : CF = 1 --> AX = error code
CF = 0 --> AX = file handle number
15.1.3Ñoùng file (Close)
Input : AH = 3Eh
BX = File handle
Output : CF = 1 --> AX = error code
15.1.4Ñaët con troû file (Set file pointer)
Input : AH = 42h
AL = mode
BX = File handle
CX:DX = soá gia (DWORD)
AL = 0 --> file pointer := CX:DX
AL = 1 --> file pointer := CX:DX + file pointer
AL = 1 --> file pointer := CX:DX + file size
Output : CF = 1 --> AX = error code
CF = 0 --> DX:AX = gia trò môùi cuûa file pointer
15.1.5Ñoïc file (Read)
Input : AH = 3Fh
BX = File handle
CX = Soá byte ñoïc
DS:DX = ÎBuffer
Output : CF = 1 --> AX = error code
CF = 0 --> AX = soá byte thöïc söï ñöôïc ñoïc
Döõ lieäu baét ñaàu töø vò trí hieän haønh cuûa file pointer ñöôïc ñoïc vaøo buffer. Khoâng theå ñoïc vöôït quaù vò
trí cuoái file.
15.1.6Ghi file (Write)
Input : AH = 40h
BX = File handle
CX = Soá byte ghi
102
DS:DX = ÎBuffer
Output : CF = 1 --> AX = error code
Döõ lieäu trong buffer ñöôïc ghi xuoáng file baét ñaàu töø vò trí hieän haønh cuûa file pointer. Neáu gaëp vò trí
cuoái file, kích thöôùc file seõ ñöôïc môû roäng ra theo soá byte ghi theâm.
Neáu CX = 0 --> kích thöôùc file seõ ñöôïc gaùn baèng giaù trò cuûa file pointer hieän haønh. Trong tröôøng hôïp
naøy file coù theå bò caét ngaén ñi hoaëc môû roäng ra tuøy theo vò trí cuûa file pointer .
15.1.7Huûy boû file (Delete)
Input : AH = 41h
DS:DX = ÎBuffer chöùa file name (ASCIIZ)
(File name coù theå bao goàm ñaày ñuû teân oå ñóa vaø PATH)
Output : CF = 1 --> AX = error code
15.1.8Xem/söûa file attrib
Input : AH = 43h
AL = 0 --> laáy file attrib
= 1 --> ñaët file attrib môùi
CX = Attribute môùi (AL=1)
DS:DX = ÎBuffer chöùa file name (ASCIIZ)
Output : CF = 1 --> AX = error code
CF = 0 --> CX = file Attribute (AL=0)
15.2CAÙC CHÖÙC NAÊNG VEÀ THÖ MUÏC
15.2.1Taïo thö muïc
Input : AH = 39h
DS:DX = ÎBuffer chöùa directory name (ASCIIZ)
15.2.2Xoùa thö muïc
Input : AH = 3Ah
DS:DX = ÎBuffer chöùa directory name (ASCIIZ)
15.2.3Chæ ñònh thö muïc hieän haønh
Input : AH = 3Bh
DS:DX = ÎBuffer chöùa directory name (ASCIIZ)
15.2.4Laáy teân thö muïc hieän haønh
Input : AH = 47h
DL = driver code ( 0=default,1=A,2=B,3=C ...)
DS:SI = Address of 64 bytes buffer
Path name traû laïi khoâng baét ñaàu baèng teân oå ñóa laãn daáu ‘\’ vaø keát thuùc baèng maõ 0h
15.2.5Tìm directory entry ñaàu tieân trong thö muïc
Input : AH = 4Eh
CX = search attribute
DS:DX = ÎBuffer chöùa search name (ASCIIZ)
103
search name coù theå chæ ñònh baèng caùc kyù hieäu ‘?’ hay ‘*’.
Neáu tìm thaáy, caùc thoâng tin cuûa phaàn töû naøy ñöôïc ñaët trong DTA
15.2.6Tìm directory entry keá tieáp trong thö muïc
Input : AH = 4Fh
DOS söû duïng caùc thoâng tin cung caáp bôûi lôøi goïi chöùc naêng 04E tröôùc ñoù ( löu giöõ trong DTA töø byte
0 -> 14 ) ñeå tìm phaàn töû keá tieáp .
Neáu tìm thaáy, caùc thoâng tin cuûa phaàn töû naøy ñöôïc ñaët trong DTA
15.2.7Caáu truùc DTA (Disk transfer area)
00 -> 14 : Vuøng daønh rieâng cuûa DOS
15 : File attribute
16 -> 17 : File time
18 -> 19 : File date
1A -> 1D : File size
1E -> 2A : File name ( Keát thuùc baèng maõ 0h )
Thoâng thöôøng khi chöông trình vöøa ñöôïc goïi thöïc hieän DTA ñöôïc ñaët taïi offset 080h cuûa PSP .
Ñoái vôùi file daïng COM, ñòa chæ naøy laø CS:080
Laáy ñòa chæ DTA :
Input : AH = 02Fh
Output: ES:BX = segment:offset of DTA
Ñònh ñòa chæ DTA :
Input : AH = 01Ah
DS:DX = segment:offset of DTA
15.2.8Duyeät caây thö muïc
Ta coù theå söû duïng hai chöùc naêng 4Eh vaø 4Fh ñeå hieån thò taát caû caùc file coù teân truøng vôùi Search—
name treân toaøn ñóa theo giaûi thuaät sau:
Search—path : laø path doø tìm hieän taïi
Search—name : teân cuûa phaàn töû caàn tìm (coù theå bao goàm ? vaø * )
1.Taïo Search—path baét ñaàu töø thö muïc chuû (Root)
:\ ; Thí duï A:\
2.Tìm taát caû caùc file theo Search—name baèng caùch :
Goïi chöùc naêng 04Eh vôùi
CX = 012h
DS:DX = segment:offset of Search—path+Search—name
Hieån thò teân file vöøa tìm thaáy
Goïi chöùc naêng 04Fh cho ñeán khi heát tìm thaáy .
3.Tìm thö muïc ñaàu tieân trong Search—path baèng caùch goïi chöùc
chöùc naêng 04Eh vôùi
CX = 012h ( Tìm caû nhöõng thö muïc “daáu maët” )
DS:DX = segment:offset of Search—path+’\*.*’
Neáu khoâng tìm thaáy :
3.1
Neáu Search—path ñang chæ vaøo thö muïc chuû thì keát thuùc
Neáu Search—path ñang chæ vaøo moät thö muïc con thì :
3a. Boû teân thö muïc cuoái cuøng trong Search—path vaø traû laïi DTA tröôùc ñoù
104
3b. Tìm teân thö muïc keá tieáp baèng chöùc naêng 04Fh
( Tìm theo thoâng tin cuûa DTA vöøa laáy laïi )
Neáu khoâng tìm thaáy laëp laïi böôùc 3.1
Neáu tìm thaáy, tieáp tuïc böôùc 4
4.Theâm teân thö muïc môùi tìm thaáy vaøo Search—path
Hieån thò Search—path môùi
5.Löu DTA hieän taïi vaø taïo DTA môùi vôùi Search—path môùi
6.Laëp laïi böôùc 2
15.3CAÙC MAÕ LOÃI THÖÔ ØNG GA ËP CUÛA INTERRUPT 021H :
Hex Dec Meaning
--- --- -----------------------
1 1 Invalid function number
2 2 File not found
3 3 Path not found
4 4 Too many open files
5 5 Access denied
6 6 Invalid handle
7 7 Memory ctrl blocks destroyed
8 8 Insufficient memory
9 9 Invalid memory block address
0aH 10 Invalid environment
0bH 11 Invalid format
0cH 12 Invalid access code
0dH 13 Invalid data
0eH 14 (not used)
0fH 15 Invalid drive specified
10H 16 Can’t remove current directory
11H 17 Not same device
12H 18 No more matching files
105
CHÖÔNG 16 : CAÙC FILE CHÖÔNG TRÌNH CUÛA DOS.
Khi thöïc hieän caùc chöông trình, heä ñieàu haønh naïp caùc file chöông trình vaøo boä nhôù vaø chuyeån quyeàn
cho chuùng. Moãi heä ñieàu haønh seõ quy ñònh moät soá daïng thöùc rieâng (format) veà caùch moâ taû vaø toå chöùc beân
trong cuûa file chöông trình. Heä ñieàu haønh DOS coù hai daïng thöùc cho file chöông trình laø COM vaø EXE.
16.1FILE DAÏNG COM
Khi DOS thöïc hieän moät file chöông trình daïng COM, noù seõ qua caùc böôùc sau:
Thieát laäp moät environment segment.
Taïo moät PSP.
Ñoïc toaøn boä file chöông trình vaøo ngay sau PSP (offset 100h)
Gaùn caùc thanh ghi segment baèng vôùi ñòa chæ cuûa PSP.
Cho SP=offset cuoái cuûa segment SS roài push 0 thöïc hieän leänh JMP PSP:0100h
Nhö vaäy file chöông trình daïng COM coù caùc ñaëc ñieåm sau :
Kích thöôùc file phaûi nhoû hôn 65536 - 100h - 2
Baét ñaàu taïi offset 0100h
Taát caû chöông trình trong moät segment
File chöông trình vaø chöông trình khi thöïc hieän hoaøn toaøn gioáng nhau
Caùc chöông trình daïng COM thoâng thöôøng keát thuùc baèng Int 020h
16.2FILE DAÏNG EXE
Khaùc vôùi file daïng COM, caùc file daïng EXE coù moät caáu truùc ñaàu file (Exe header) duøng ñeå löu giöõ
caùc moâ taû veà caùch saép xeáp, vò trí baét ñaàu cuûa chöông trình ...
Caáu truùc cuûa moät Exe header:
Offs Size Contents
==== ====
==================================================================
+0 2 |4Dh 5aH| Daáu hieäu nhaän dieän EXE file (‘MZ’ hoaëc ‘ZM’)
|-------
+2 2 |PartPag| kích thöôùc thöïc cuûa load module ôû trang cuoái
|-------
+4 2 |PageCnt| soá trang 512 bytes chöùa load module vaø header
|-------
+6 2 |ReloCnt| soá 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ôù toái thieåu sau load module (paragraphs)
|-------
+0cH 2 |MaxMemKích thöôùc boä nhôù toái ña sau load module (paragraphs)
|-------
+0eH 2 |ReloSSVò trí töông ñoái cuûa stack segment SS (paragraphs)
|-------
+10H 2 |ExeSPGiaù trò khôûi ñaàu cuûa SP
|-------
+12H 2 |ChkSumtoång taát caû caùc word trong file nhaân vôùi -1
|-------
106
+14H 2 |ExeIPGiaù trò khôûi ñaàu cuûa IP
|-------
+16H 2 |ReloCSVò trí töông ñoái cuûa code segment CS (paragraphs)
|-------
+18H 2 |TablOff| Vò trí cuûa relocation table trong EXE file
|-------
+1aH 2 |Overlay| soá phaàn töû overlay
--------
1cH ñieåm keát thuùc cuûa caáu truùc EXE header
--------------- - - |---------------
? 4*? |offset segment| |offset segment| Relocation table.
------------- - - Ó-------------
? ? ñieàn caùc giaù trò 0 cho ñaày paragraph cuoái.
? ? ñieåm keát thuùc cuûa EXE header
Khi thöïc hieän moät file chöông trình daïng EXE, DOS seõ qua caùc böôùc sau:
Ñoïc 1Ch bytes töø Exe Header ( offset 0 cuûa EXE file )
Xaùc ñònh kích thöôùc boä nhôù caàn thieát cho Exe file
LoadSize = PageCnt*512 - HdrSize*16 - PartPag
LoadSize + MinMem + 100h <= ExeMem <= LoadSize + MaxMem + 100h ( 100h = kích thöôùc cuûa
PSP )
ExeMem ñöôïc xaùc ñònh tuøy theo soá löôïng boä nhôù coøn laïi cuûa heä thoáng.
ExeMem seõ laáy giaù trò lôùn nhaát coù theå ñöôïc trong khoaûng ñaõ neâu.
Thieát laäp moät environment segment.
Xin caáp phaùt moät vuøng nhôù vôùi kích thöôùc ExeMem.
Taïo moät PSP.
Xaùc ñònh Start—seg. (Thoâng thöôøng Start—seg = PSP+10h).
Ñoïc load module vaø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 coù kích thöôùc baèng :
PageCnt*512 - HdrSize*16 - PartPag
Thöïc hieän ñònh vò laïi caùc giaù trò segment trong load module ( Xem thí duï )
Gaùn caùc giaù trò khôûi ñaàu cho caùc thanh ghi
DS = ES = PSP
SS = Start—seg + ReloSS, SP = ExeSP
CS = Start—seg + ReloCS, IP = ExeIP
(Thöïc hieän JMP CS—value:IP—value
hoaëc PUSH CS—value ; PUSH IP—value ; RETF )
Ñaëc ñieåm cuûa file chöông trình daïng Exe laø :
Kích thöôùc file chöông trình khoâng coù giôùi haïn
Soá segment trong chöông trình khoâng giôùi haïn
Ñieåm khôûi ñaàu, vò trí cuûa STACK ... ñöôïc quy ñònh trong baûn thaân chöông trình
File chöông trình vaø chöông trình khi thöïc hieän khoâng hoaøn toaøn gioáng nhau : quaù trình load ñaõ söûa
ñoåi caùc giaù trò segment trong chöông trình cho phuø hôïp vôùi vò trí ñöôïc naïp. Maët khaùc khi thöïc hieän, khoâng
phaûi khi naøo toaøn boä chöông trình cuõng ñöôïc naïp leân.
Caùc chöông trình daïng EXE thoâng thöôøng keát thuùc baèng Int 021h chöùc naêng 4Ch
Thí duï ñònh vò laïi caùc giaù trò segment cuûa load module:
; DS:SI = ÎRelocation table
107
; CX = ReloCnt
; DX = Start—Seg
; Load module ñaõ ñöôïc ñoïc vaø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)
Caùc thoâng tin veà chöông trình ñang thöïc hieän nhö tham soá doøng leänh, boä nhôù thuoäc veà chöông trình
... ñöôïc löu chöùa trong moät caáu truùc ñaëc bieät goïi laø PSP.
Caáu truùc cuûa PSP:
Offs Size
+0 2 |INT 20H| EXE programs may JMP or RET here (PSP:0) to exit
|-------
+2 2 |MemTopBieân treân vuøng nhôù thuoäc veà chöông trình (paragraph)
|---|----
+4 1| (reserved)
|---|---------------
+5 5 |CALL offset segment| FAR CALL to DOS function dispatcher
----|------|-------
+6 (2)Availkích thöôùc cuûa Segment chöông trì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æ cuûa environment (segment)
|-------------- - ------
+2eH 2eHDOS reserved area |
|------------ - -----
+5cH 10Hformatted parm area 1setup as an FCB for 1st cmd parameter
|------------ - -----
+6cH 14Hformatted parm area 2setup as an FCB for 2nd cmd parameter
|---|--------- - -----
+80H 1 |len| Soá kyù töï trong tham soá doøng leänh
|--------------- - ------
+81H 7fHUnformatted Parm AreaTham soá doøng leänh
------------- - -----
108
+FFH Ñieåm keát thuùc PSP
Tröôùc khi chuyeån quyeàn, DOS chæ ñònh PSP:080h laø ñòa chæ cho DTA maëc nhieân cuûa chöông trình.
16.4ENVIRONMENT
Environment laø moät vuøng nhôù löu chöùa caùc chuoãi ASCIIZ lieân tieáp nhau. Caùc chuoãi aáy coù daïng thöùc
: name=value. Vôùi name laø caùc “bieán moâi tröôøng” cuûa DOS nhö COMSPEC,PATH,PROMPT ... ñöôïc
thieát laäp bôûi leänh SET.
Thí duï veà thoâng tin beân trong moät environment: (bieåu dieãn baèng hôïp ngöõ)
db ‘COMSPEC=c:\command.com’,0 ; Danh saùch caùc bieán moâi
db ‘PROMPT=$p$g’,0 ; tröôøng cuûa DOS
db ‘PATH=c:\;c:\dos;c:\utils’,0 ;
db ‘TEMP=c:\windows\temp’,0 ;
db 0 ; Keát thuùc danh saùch
dw 1 ; Soá Exec—String tieáp theo
; Thoâng thöôøng laø 1
db ‘C:\UTILS\HDDIAG.EXE’,0 ; Teân cuûa chöông trình ñöôïc
; thöïc hieän (bao goàm caû PATH)
db 0
109
Chöông 17
Caáu truùc device cuûa MSDOS
110
CHÖÔNG 18 : TOÅ CHÖÙC BOÄ NHÔÙ CUÛA DOS.
Boä nhôù thuoäc veà DOS baét ñaàu töø ñòa chæ 0050:0000 trôû ñi. Trong boä nhôù, DOS ñöôïc chia thaønh caùc
phaàn chính nhö sau:
- Phaàn loõi cuûa DOS (DOS Kernel)
- Caùc device driver (code)
- Caùc table, stack, buffer ... (data)
Töø ñòa chæ 0050:0000 ñeán 0070:0000 laø vuøng communication cuûa DOS. Trong ñoù DOS thieát laäp moät
soá caùc caáu truùc rieâng duøng löu giöõ caùc thoâng tin veà heä thoáng.
DOS kernel vaø caùc internal device cuûa DOS ñöôïc naïp baét ñaàu töø 0070:0000.
Boä nhôù keá tieáp ñöôïc chia thaønh nhieàu khoái noái tieáp nhau (Memory block).
Caùc memory block ñöôïc quaûn lyù baèng heä thoáng caùc MCB (Memory Control Block).
..... |
|----------------
| MCB |
|----------------
Memory |
Block |
|----------------
| MCB |
|----------------
Memory |
Block |
|----------------
..... |
18.1 MEMORY CONTROL BLOCK:
Ñöùng tröôùc moãi memory block laø moät MCB (khoâng thuoäc veà memory block).
Moãi MCB chieám 16 bytes (hay moät paragraph) coù caáu truùc nhö sau:
Offset Size Description
00h BYTE block type: 5Ah neáu laø MCB cuoái, 4Dh cho caùc MCB khaùc
01h WORD 0000h --> chöa söû duïng
0008h --> thuoäc veà DOS
Khaùc --> PSP cuûa chöông trình ñang quaûn lyù (owner)
03h WORD Kích thöôùc cuûa memory block tính baèng paragraph
05h 3 BYTEs Khoâng söû duïng
---DOS 2.x,3.x---
08h 8 BYTEs Khoâng söû duïng
---DOS 4+ ---
08h 8 BYTEs Teân chöông trình (neáu laø PSP memory block)
---DOS 5+ ---
08h 2 BYTEs Neáu block thuoäc veà DOS (Block type = 0008) thì mang
moät trong hai giaù trò:
“SC” --> System code, locked-out inter-UMB memory
“SD” --> System data, device driver
111
Caùc MCB lieân keát caùc memory block laïi thaønh moät daây xích (chain). Quaù trình quaûn lyù boä nhôù cuûa
DOS döïa hoaøn toaøn treân caùc thoâng tin löu chöùa trong caùc MCB. Neáu thoâng tin trong moät MCB khoâng ñuùng
daãn ñeán chuoãi caùc MCB bò roái loaïn, ñeå baûo ñaûm an toaøn, DOS seõ thoâng baùo Memory Alocation Error vaø
yeâu caàu khôûi ñoäng laïi heä thoáng.
Döôùi DOS 3.1+, memory block ñaàu tieân laø DOS data segment,chöùa caùc device, table, buffer ... ñöôïc
chæ ñònh trong config.sys
Döôùi DOS 4+ memory block ñaàu tieân ñöôïc chia thaønh nhieàu khoái con, moãi khoái coù rieâng moät
Control Block vôùi caáu truùc nhö sau:
Offset Size Description
====== ==== ====================================================
00h BYTE Kieåu cuûa khoái con
“D” device driver
“E” device driver appendage
“I” IFS (Installable File System) driver
“F” FILES= (File system table)
“X” FCBS= (FCB table)
“C” BUFFERS EMS (Buffers EMS block)
“B” BUFFERS= (Buffer block)
“L” LASTDRIVE= (LASTDRIVE entry)
“S” STACKS= (STACK code segment)
“T” INSTALL=
01h WORD Segment baét ñaàu
03h WORD Kích thöôùc cuûa khoái con
05h 3 BYTEs Khoâng söû duïng
08h 8 BYTEs Teân cuûa file chöùa device (neáu kieåu laø D hay I)
18.2HIMEM
HIMEM.SYS laø trình quaûn lyù boä nhôù môû roäng (extended memory) cuûa DOS. Vôùi caùc CPU 286 trôû
leân boä nhôù coù theå lôùn hôn 1MB. HIMEM cho pheùp moät soá öùng duïng cuûa DOS nhö
RAMDRIVE,SMARTDRV ...duøng phaàn môû roäng naøy. Treân caùc PC duøng CPU 286 trôû leân, address bus laø
24 hoaëc 32 bit. Caùc ñòa chæ ñöôïc taïo thaønh töø segment vaø offset bò giôùi haïn trong 20 bit ñaàu (0-19) cuûa
address bus. Neáu bit 20 cuûa address bus ñöôïc söû duïng, ñòa chæ taïo thaønh töø segment FFFFh vaø caùc offset töø
0-FFFFh seõ cho pheùp truy nhaäp theâm 64KB tính töø ñòa chæ 100000h (treân 1MB).
Töø DOS 5.0, sau khi naïp HIMEM, vôùi chæ ñònh DOS=HIGH trong CONFIG.SYS, bit A20 cuûa
address bus (A20) seõ ñöôïc ñöa vaøo söû duïng. DOS seõ coá gaéng duøng taát caû vuøng nhôù naøy cho caùc internal
device, system table, buffer... Baèng caùch naøy, DOS seõ chæ chieám khoaûng 15 KB trong vuøng nhôù tieâu
chuaån.
18.3UPPER MEMORY CONTROL BLOCK
Töø DOS 5.0, vôùi caùc CPU 80386 trôû leân, driver EMM386.EXE cho pheùp khai thaùc boä nhôù moät caùch
höõu hieäu hôn: vuøng nhôù môû roäng (extend memory) coù theå ñöôïc duøng ñeå giaû laäp cho boä nhôù baønh tröôùng
(expand memory), ñoàng thôøi cuõng cho cho pheùp taïo ra caùc UMB laøm taêng theâm soá löôïng boä nhôù daønh cho
caùc chöông trình öùng duïng cuûa DOS.
Upper Memory Block laø caùc khoái nhôù thuoäc vuøng nhôù môû roäng treân PC (Ngoaøi 1MB quy öôùc, töø
100000h trôû ñi). Treân caùc CPU 80386 trôû ñi, EMM386 cho pheùp ñònh vò laïi ñòa chæ caùc khoái nhôù ñoù vaøo
caùc “khoaûng troáng” thuoäc A0000-100000. Ñeå söû duïng UMB caàn :
Chæ ñònh DEVICE=EMM386.EXE NOEMS trong CONFIG.SYS
112
( hoaëc DEVICE=EMM386.EXE RAM )
Chæ ñònh DOS=UMB trong CONFIG.SYS
Caùc UMB cuõng ñöôïc DOS quaûn lyù gioáng nhö caùc memory block. Moãi UMB coù moät UMCB ñöùng
tröôùc vôùi caáu truùc nhö sau:
Upper Memory Control Block (DOS 5+):
Offset Size Description
====== ==== =====================================================
00h BYTE 5Ah neáu laø UMCB cuoái, 4Dh cho caùc UMCB khaùc
01h WORD 0000h --> UMB chöa söû duïng
0008h --> UMB thuoäc veà DOS
Khaùc --> PSP cuûa chöông trình sôû höõu (owner)
03h WORD Kích thöôùc cuûa memory block tính baèng paragraph
05h 3 BYTEs Khoâng söû duïng
08h 8 BYTEs block type:
“UMB” neáu laø khoái ñaàu tieân
“SM” neáu laø khoái cuoái
Ñeå traùnh caùc vuøng nhôù daønh rieâng nhö video buffer, video bios ...,DOS taïo ra caùc UMCB ngay tröôùc
caùc vuøng aáy vaø ñaùnh daáu laø thuoäc veà DOS. (Coi caùc vuøng naøy nhö laø caùc UMB ñaõ duøng roài).
18.4DOS SYSVAR
Chöùc naêng 52h cuûa interrupt 21h cung caáp raát nhieàu thoâng tin quan troïng beân trong DOS. Tuy nhieân
ñaây laø moät chöùc naêng noäi (khoâng coâng boá) do ñoù caùc caáu truùc ñaõ cho coù theå bò thay ñoåi trong caùc version
keá tieáp cuûa DOS. Input : AH = 52h
Output : ES:BX -> Pointer to DOS SYSVAR TABLE
(ES = DOS data segment)
*DOS SYSVAR TABLE
Offset Size Description
====== ===== ==========================================================
2 WORD segment cuûa MCB ñaàu tieân
00h DWORD ñòa chæ cuûa Drive Parameter Block ñaàu tieân
04h DWORD ñòa chæ cuûa System File Table ñaàu tieân
08h DWORD ñòa chæ cuûa CLOCK$ device’s header hieän haønh
(device ñöôïc load leân sau cuøng coù CLOCK bit ñöôïc set)
0Ch DWORD ñòa chæ cuûa CON device’s header hieän haønh
(device ñöôïc load leân sau cuøng coù STDIN bit ñöôïc set)
---DOS 2.x---
10h BYTE soá löôïng oå ñóa (logic) trong heä thoáng
11h WORD soá byte toái ña trong moät block cuûa caùc block device
13h DWORD ñòa chæ cuûa disk buffer ñaàu tieân
17h 18 BYTEs NUL device driver header
NUL luoân luoân laø device ñaàu tieân trong chuoãi caùc device cuûa DOS
---DOS 3.0---
10h BYTE soá löôïng block device
11h WORD soá byte toái ña trong moät block cuûa caùc block device
13h DWORD ñòa chæ cuûa disk buffer ñaàu tieân
17h DWORD ñòa chæ cuûa baûng thoâng tin caùc thö muïc hieän haønh
113
1Bh BYTE giaù trò cuûa LASTDRIVE (trong CONFIG.SYS)
1Ch DWORD ñòa chæ cuûa STRING=
20h WORD kích thöôùc cuûa vuøng STRING (giaù trò x trong STRING=x)
22h DWORD ñòa chæ cuûa FCB table
26h WORD giaù trò y trong FCBS=x,y
28h 18 BYTEs NUL device driver header
---DOS 3.1-3.3---
10h WORD soá bytes toái ña trong moät sector cuûa block device
12h DWORD ñòa chæ cuûa disk buffer ñaàu tieân
16h DWORD ñòa chæ cuûa baûng thoâng tin caùc thö muïc hieän haønh
1Ah DWORD ñòa chæ cuûa FCB tables
1Eh WORD giaù trò y trong FCBS=x,y
20h BYTE soá löôïng block device ñaõ ñöôïc caøi ñaët
21h BYTE soá oå ñóa logic
(Cuõng laø soá phaàn töû cuûa baûng thoâng tin caùc thö muïc hieän haønh)
22h 18 BYTEs NUL device driver header
34h BYTE soá löôïng caùc oå ñóa JOIN
---DOS 4.x---
35h WORD 0
37h DWORD ñòa chæ ñaàu vaøo cuûa resident IFS utility functions
3Bh DWORD ñòa chæ cuûa chuoãi caùc IFS (installable file system) drivers
3Fh WORD giaù trò x trong BUFFERS x,y
41h WORD giaù trò y trong BUFFERS x,y
43h BYTE boot drive (1=A:)
44h BYTE flag: 01h to use DWORD moves (80386+), 00h otherwise
45h WORD kích thöôùc extended memory (KB)
---DOS 5.0-6.0---
37h DWORD ñòa chæ cuûa danh saùch chöông trình trong SETVER
3Bh WORD ??
3Dh WORD segment cuûa PSP cuûa chöông trình vöøa ñöôïc goïi (EXEC)
(neáu DOS ñöôïc naïp ôû vuøng nhôù cao HMA)
3Fh WORD giaù trò x trong BUFFERS x,y
41h WORD giaù trò y trong BUFFERS x,y
43h BYTE boot drive (1=A:)
44h BYTE 01h --> cho pheùp duøng DWORD moves (80386+)
45h WORD kích thöôùc extended memory (KB)
Caáu truùc ñaàu vaøo cuûa STACKS code segment:
Offset Size Description
====== ==== ====================================================
00h WORD ???
02h WORD Soá löôïng stack (giaù trò x trong STACKS=x,y)
04h WORD Kích thöôùc cuûa stack control block array
06h WORD Kích thöôùc cuûa moãi stack (giaù trò y trong STACKS=x,y)
08h DWORD Ñòa chæ cuûa STACKS data segment
Caáu truùc ñaàu vaøo cuûa system file table vaø FCB table:
114
Offset Size Description
====== ==== ====================================================
00h DWORD ñòa chæ cuûa file table keá tieáp (FFFFh neáu khoâng coù)
04h WORD soá file handle hay FCB trong baûng
06h 36h bytes DOS 3.0
35h bytes DOS 3.1 - 3.3x
3Bh bytes DOS 4.0 - 6.0
Offset Size Description
====== ==== =============================================
00h WORD soá löôïng file handle cuøng tham chieáu ñeán file
02h WORD file open mode (see AH=3Dh)
bit 15 set if this file opened via FCB
04h BYTE file attribute (see AX=4301h)
05h WORD device info word (see also AX=4400h)
bit 15 set if remote file
bit 14 set means do not set file date/time on closing
bit 13 set if named pipe
bit 12 set if no inherit
bit 11 set if network spooler
bit 7 set if device, clear if file (only if local)
bits 6-0 as for AX=4400h
07h DWORD ñòa chæ cuûa device driver header (character device)
hoaëc DOS Drive Parameter Block
0Bh WORD cluster baét ñaàu cuûa file
0Dh WORD file time
0Fh WORD file date
11h DWORD file size
15h DWORD file pointer
19h ??
Caáu truùc ñaàu vaøo cuûa baûng thoâng tin thö muïc hieän haønh (LASTDRIVE entries)
Offset Size Description
====== ==== ====================================================
00h 67 BYTEs Chuoãi ASCIZ daïng X:\PATH (Vôùi X: laø lastdrive)
43h ??
CHÖÔNG 19 : CHÖÔNG TRÌNH THÖÔØNG TRUÙ.
CHÖÔNG 20 : TAÄP TIN .BAT CUÛA MSDOS
CHÖÔNG 21 : THIEÁT LAÄP CAÁU HÌNH CHO MSDOS
21.1 Taäp tin CONFIG.SYS
Các file đính kèm theo tài liệu này:
- Giáo trình GTASM.pdf