Giáo trình Gtasm

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.

pdf114 trang | Chia sẻ: tlsuongmuoi | Lượt xem: 2050 | Lượt tải: 0download
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:

  • pdfGiáo trình GTASM.pdf
Tài liệu liên quan