Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
262,16 KB
Nội dung
Lập trình bằng Turbo Pascal BP IP CS DS SS ES Flags 1.1.2 Cấu trúc của địa chỉ trong bộ nhớ. Bộ vi xử lí họ 8086 dùng 20 bit để đánh địa chỉ bộ nhớ. Suy ra nó quản lí đợc một không gian địa chỉ gồm 2 20 bit = 1 MB hay 1.048.576 địa chỉ. Nhng các thanh ghi chỉ có 16 bit, chỉ có thể quản lí một không gian địa chỉ gồm 2 16 bit = 64 KB hay 65.536 địa chỉ. Vì lí do ny, bộ nhớ đợc chia lm nhiều đoạn - segment, mỗi đoạn gồm 64 KB. Địa chỉ một ô nhớ gồm hai phần, có dạng Segment: offset. Segment l địa chỉ đoạn, đợc ghi trong các thanh ghi đoạn, còn offset l độ dịch chuyển, đợc ghi trong các thanh ghi offset. Địa chỉ thực của ô nhớ sẽ nhận đợc sau khi nhân địa chỉ đoạn với 16 (hay l dịch trái 4 bit) rồi cộng với điạ chỉ offset. Trong Pascal ngời ta dùng dấu hiệu $ đứng trớc một số hệ đếm 16 (hexadecimal) để phân biệt với số thập phân thông thờng. Các địa chỉ ô nhớ thờng đợc viết bằng số trong hệ đếm cơ số 16. Ví dụ $F12A:$E82B. Địa chỉ thực tơng ứng sẽ l $F12A0 + $E82B = $FFACB. 1.2 Các ngắt - interrupt 1024 byte đầu tiên trong bộ nhớ đợc chia thnh 256 bộ 4 byte, chứa đợc 256 địa chỉ, trỏ đến các chơng trình xử lí các công việc cơ sở của hệ thống gọi l các véc tơ ngắt - Interrupt. Các ngắt đợc đánh số từ 0 đến 255 hay l từ $00 đến $FF. Một ngắt lại có thể lm vi việc khác nhau, mỗi việc nh thế cũng gán tơng ứng với một số nguyên, gọi l chức năng của ngắt. Ví dụ, ngắt số 16 = $10 l ngắt phục vụ mn hình. Ngắt ny lại có nhiều chức năng khác nhau nh $00: Thiết lập chế độ mn hình. $03: Lấy toạ độ con chạy trên mn hình văn bản. $0F: Lấy chế độ hiện tại của mn hình. Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 245 Lập trình bằng Turbo Pascal Dới đây l bảng một số véc tơ ngắt. Ngắt số Tác dụng Thập phân Hex. 0 1 9 16 32 33 $00 $01 $09 $10 $20 $21 Xử lí khi có phép chia cho 0 Cho chạy chơng trình từng bớc (để sửa lỗi) Đọc mã quét từ bn phím BIOS gọi các phục vụ mn hình DOS chấm dứt chơng trình .COM Thực hiện rất nhiều chức năng của DOS 1.3 Thâm nhập trực tiếp qua thanh ghi và ngắt 1.3.1 Thủ tục gọi ngắt. Ta nhắc lại cách gọi ngắt thực hiện các chức năng của chúng từ một chơng trình viết bằng hợp ngữ. Sau khi gán số hiệu chức năng cho thanh ghi AH, câu lệnh INT số hiệu ngắt đợc dùng để gọi thực hiện ngắt. Các kết quả nếu có đợc trả về trong các thanh ghi. Việc gọi thực hiện ngắt từ trong một chơng trình Pascal cũng qua những bớc tơng tự. Unit Dos của TurboPascal cung cấp các hỗ trợ cần thiết để thực hiện gọi ngắt. Trớc hết, để truy cập các thanh ghi của bộ vi xử lí, có kiểu dữ liệu thanh ghi - Registers đợc định nghĩa trong Unit Dos nh sau Type registers = record Case Integer of 0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags: word); 1: (AL, AH, BL, BH, CL, CH, DL, DH: byte); End; Đây l một kiểu bản ghi có cấu trúc thay đổi nhằm có thể thâm nhập riêng rẽ byte thấp v byte cao của các thanh ghi AX,BX,CX,DX. Unit Dos cung cấp hai thủ tục Intr v MsDos để gọi thực hiện các ngắt. Intr( IntNum: Word; Var Regs: Registers); Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 246 Lập trình bằng Turbo Pascal MsDos( Var Regs: Registers); Biến thanh ghi Regs đóng vai trò cung cấp dữ liệu đầu vo cho ngắt đợc gọi v cũng l nơi để nhận kết quả trả về nếu có. MsDos dnh riêng để gọi các phục vụ của Dos, ứng với ngắt số $21. Lời gọi MsDos(Regs) tơng đơng với lời gọi Intr( $21, Regs) vì ngắt số $21 l các phục vụ của DOS. 1.3.2 1.4.1 Các bớc gọi ngắt - Khai báo một biến kiểu thanh ghi, ví dụ Regs - Đặt các giá trị cần thiết cho các thanh ghi thông qua các trờng của biến Regs. Quy ớc: AH chứa số hiệu của chức năng. AL chứa số hiệu của chức năng phụ (nếu có). Các thanh ghi còn lại dùng đến hay không tuỳ theo từng ngắt. - Gọi thực hiện ngắt bằng Intr hay MsDos - Nhận kết quả trả về trong các trờng của Regs (nếu cần). Để biết công việc của mỗi ngắt, các chức năng ngắt khác nhau, ý nghĩa của thông tin trả về trong các thanh ghi,v.v cần tham khảo các ti liệu tra cứu về hệ thống, hệ điều hnh DOS. 1.4 Các ví dụ minh hoạ. Ví dụ 1. Xem v đặt lại chế độ mn hình. Ngắt thực hiện các dịch vụ mn hình có số hiệu $10. Ngắt ny có nhiều chức năng khác nhau. a) Xem chế độ mn hình hiện hnh. Chức năng: AH:=$0F; Giá trị trả về: AL = Số hiệu của chế độ mn hình ; AH = số cột; BH = số hiệu của trang active; program LayCheDoManHinh; uses dos; var regs: registers; BEGIN regs.AH:=$0F; {$0F= chức năng lấy chế độ mn hình} Intr($10,regs); {$10 l ngắt về dịch vụ mn hình} With regs do begin Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 247 Lập trình bằng Turbo Pascal writeln(' mode man hinh la:',AL); writeln(' so cot :',AH); writeln(' active page :',BH); end; readln END. b) Thiết lập chế độ cho mn hình Chức năng: AH:=$00; Tham số đầu vo AL:= số hiệu mode mn hình muốn thiết lập; program ThietLapCheDoManHinh; uses dos; var i: integer; procedure SetVideoMode(mode: integer); var regs: registers; begin with regs do begin AH:=0; AL:=mode; Intr($10,regs); End end; BEGIN for i:=0 to 6 do begin SetVideoMode(i); Writeln(' man hinn dang o mode ',i); readln end; END. 1.4.2 Ví dụ 2. Xem v thiết lập ngy hệ thống. Ngắt có số hiệu $21 thực hiện nhiều chức năng khác nhau của DOS. a) Xem ngy hệ thống. Chức năng: $2A. Giá trị trả về: DL = ngy; DH = tháng; CX = Năm; program LayNgayHeThong; uses dos; var regs: registers; date,year,month,day: string; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 248 Lập trình bằng Turbo Pascal BEGIN regs.AH:=$2A; { $2A= chức năng lấy ngy hệ thống} MsDos(regs); With regs do begin str(CX,year); {chuyển gía trị số thnh string} str(DH,month); str(DL,day); end; date:=day+'/'+month+'/'+year; Writeln('hom nay la ngay:',date); readln; END. b) Đặt ngy tháng hệ thống Chức năng AH:=$2B; Tham số đầu vo: DL:= ngy (0 31); DH:= tháng (0 12); CX:= Năm (1980 2099); Giá trị trả về: AL=0 nếu thnh công. AL=255 nếu có lỗi. program DatNgayThang; uses dos; var regs: registers; BEGIN with regs do begin AH:=$2B; { $2A= chức năng đặt ngy hệ thống} DL:=15; DH:=1; CX:=1999; MsDos(Regs); if AL=0 then Writeln('da dat ngay xong !') else writeln('co loi'); end; END. 1.4.3 Ví dụ 3. Thông báo vùng trống trên đĩa. Đây cũng l một chức năng của ngắt số $21. Chức năng AH:= $36; Tham số đầu vo: DL:= số hiệu của ổ đĩa (0,1,2 ); Giá trị trả về Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 249 Lập trình bằng Turbo Pascal AX= số sector cho mỗi cluster ( = $FFFF nếu ổ đĩa không hợp lệ). BX= số cluster không sử dung. CX= số byte trên mỗi sector. DX= tổng số sector. Số vùng trống trên đĩa = LongInt (AX)*BX*CX; program TinhVungTrongTrenDia; uses dos; var TenODia: char; Ketqua: LongInt; function SoByteConRoi(Drv: char): LongInt; var regs: registers; begin with regs do begin AH:=$36; DL:= Ord(Upcase(drv)) - 64; MsDos(Regs); if AX=$FFFF then SoByteConRoi:=-1 else SoByteConRoi:= LongInt(AX)*BX*CX; end; end; BEGIN write(' Cho ten o dia:'); readln(TenODia); Ketqua:= SoByteConRoi(TenODia); if Ketqua =-1 then writeln(' Co loi!') else writeln(' con ', Ketqua:0, 'byte trong '); readln; END. 1.5 Sử dụng các hàm, thủ tục của unit DOS Trong phần trớc ta đã thấy việc thâm nhập hệ thống v thực hiện một số chức năng hệ điều hnh DOS một cách trực tiếp sử dụng các ngắt l khá tỉ mỉ v mất nhiều công sức. Unit DOS của Turbo Pascal cung cấp một th viện các chơng trình con lm sẵn, hỗ trợ ngời sử dụng trong các giao tiếp với hệ thống v hệ điều hnh. Có thể sử dụng các hm, thủ tục ấy để thâm nhập hệ thống dễ dng hơn. Ví dụ, có thể xem v đặt ngy tháng hệ thống bằng các thủ tục GetDate, SetDate. program XemVaDatNgay_UnitDos; uses dos; var y,m,d,dow: word; BEGIN Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 250 Lập trình bằng Turbo Pascal GetDate(y,m,d,dow); Writeln('GetDate cho ket qua la:',d:2,'/',m:2,'/',y:4,' thu:', dow:1); readln; SetDate(2000,01,01); {Đặt lại ngy hệ thống} END. Có thể lm lại chơng trình trong ví dụ 3, xem số byte còn rỗi trên đĩa bằng thủ tục DiskFree. program TinhVungTrongTrenDia_UnitDos; uses dos; var TenODia: char; SoODia: byte; Ketqua: longInt; BEGIN write(' Cho ten o dia:'); readln(TenODia); SoHieu:= Ord(Upcase(TenODia)) - 64; Ketqua:= DiskFree(SoHieu); if Ketqua =-1 then writeln(' Co loi!') else writeln('O dia ', TenODia,' con ', Ketqua DIV 1024 ,'Kbyte trong !'); readln; END. Rõ rng l với sự hỗ trợ của unit Dos, việc thâm nhập hệ thống, thực hiện các chức năng thông dụng của hệ điều hnh DOS trở nên dễ dng hơn nhiều. Cần tìm hiểu kĩ về unit Dos để nắm đợc cách sử dụng rất nhiều hm v thủ tục đã đợc lm sẵn trong đó. 2. Điều khiển chuột 2.1 Toạ độ chuột Mn hình văn bản chuẩn gồm 80 cột, 25 dòng tức l 2000 ô chữ nhật, mỗi ô hiển thị một kí tự. Trong khi đó, mn hình đồ hoạ lại chia lm nhiều điểm ảnh, thấp nhất cũng l 640 x 480 đối vơí mn hình VGA. Để con chuột có thể dùng trong cả hai chế độ mn hình, ngời ta quy định toạ độ micki của chuột biến đổi trong khoảng sau đây, không phụ thuộc chế độ văn bản hay đồ hoạ. 0 x_mouse 632. 0 y_mouse 192. Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 251 Lập trình bằng Turbo Pascal Để chuyển sang toạ độ x_text, y_text trên mn hình văn bản, lu ý rằng 1 x_text 80, y_text 25 ta sẽ có công thức đổi toạ độ chuột sang toạ độ trên mn hình văn bản l x_text = x_mouse/8 + 1 y_text = y_mouse/8 + 1 Theo công thức trên, ta sẽ đợc 8 x 8 = 64 điểm chuột trong một ô kí tự trên mn hình văn bản. Khi nhấn chuột vo các điểm ny đều chỉ ứng với một ô vị trí kí tự trên mn hình văn bản m thôi. Công thức chuyển toạ độ chuột sang toạ độ trên mn hình đồ hoạ l x_graphics = (x_mouse / 632) * getmaxx; y_graphics = (y_mouse / 192) * getmaxy; ở đây getmaxx, getmaxy l toạ độ x, toạ độ y lớn nhất của chế độ đồ hoạ đang xét. 2.2 Ngắt điều khiển chuột $33 Con chuột đợc điều khiển thông qua sử dụng ngắt số hiệu $33. Ngắt ny có nhiều chức năng khác nhau. Cần gán các số hiệu chức năng (sẽ liệt kê dới đây) cho thanh ghi AX (chứ không phải AH nh các ngắt khác) Các chức năng điều khiển chuột của ngắt $33. 1- Chức năng 0: khởi tạo chuột Đầu ra AX:= 0 cha ci đặt chuột AX:= -1 đã cI đặt chuột BX: = số phím chuột (thờng l 2) 2- Chức năng 1: Lm hiện con trỏ chuột 3- Chức năng 2: Lm ẩn con trỏ chuột 4- Chức năng 3: Lấy vị trí v kiểm tra nhấn phím Đầu ra CX:= toạ độ x_mouse của chuột. DX:= toạ độ y_mouse của chuột. BX sẽ cho trạng thái của các phím chuột Bit 0 = 0 phím trái nhả. Bit 0 = 1 phím trái đợc nhấn. Bit 1 = 0 phím phảI nhả. Bit 1 = 1 phím phảI đợc nhấn. 5 - Chức năng 4: Di chuyển con trỏ chuột. Đầu vo CX = toạ độ x mới DX = toạ độ y mới Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 252 Lập trình bằng Turbo Pascal 6- Hỏi trạng thái v số lần nhấn phím kể từ khi gọi chức năng ny. Đầu vo BX = phím cần hỏi: 0 = trái, 1 = phải, 2 = giữa. Đầu ra AX cho trạng thái phím (0 = nhả, 1 = nhấn) Bít 0 cho trạng thái phím trái. Bít 1 cho trạng thái phím phải. Bít 2 cho trạng thái phím giữa. BX:= số lần nhấn CX:= toạ độ x lần nhấn cuối cùng DX:= toạ độ y lần nhấn cuối cùng 7- Hỏi trạng thái v số lần nhả phím kể từ khi gọi chức năng ny Đầu vo BX = phím cần hỏi: 0 = tráI, 1 = phảI, 2 = giữa Đầu ra AX cho trạng thái phím (0 = nhả, 1 = nhấn) Bít 0 cho trạng thái phím trái. Bít 1 cho trạng thái phím phải. Bít 2 cho trạng thái phím giữa. BX:= số lần nhấn. CX:= toạ độ x lần nhấn cuối cùng. DX:= toạ độ y lần nhấn cuối cùng. 8 - Chức năng 7: Hạn chế phạm vi di chuyển ngang của chuột (phạm vi biến đổi của x_mouse) Đầu vo: CX:= cột trái DX:= cột phải 9 - Chức năng 8: Hạn chế phạm vi di chuyển dọc của chuột (phạm vi biến đổi của y_mouse) Đầu vo: CX:= Dòng trên cùng. DX:= Dòng dới cùng. 2.3 Ví dụ minh hoạ. 2.3.1 Khởi tạo chuột. Ta xây dựng thủ tục mouseInit thực hiện các chức năng: kiểm tra nếu đã ci đặt chuột thì thiết lập toạ độ ban đầu của chuột, hạn chế phạm vi tác dụng của chuột trong một khung hình chữ nhật v cho hiển thị chuột (một hình chữ nhật) trên mn hình văn bản. Để dễ nhớ, ta định nghĩa các hằng số l các chức năng của ngắt $33 nh trình by trên. x,y l toạ độ ban đầu của chuột. Left, Top, Right, Bottom Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 253 Lập trình bằng Turbo Pascal Trong thủ tục dới đây v các thủ tục khác tiếp theo sau, Regs l biến kiểu thanh ghi. var Regs: registers; const INT_MOUSE = $33; (*ngat chuot*) MOUSE_INIT = $00; MOUSE_X_LIMIT = $07; MOUSE_Y_LIMIT = $08; MOUSE_SET_POSITION = $04; MOUSE_SHOW = $01; procedure mouseInit(x,y,left,top,right,bottom: integer); var mouse_status: integer; begin regs.AX:=MOUSE_INIT; intr(INT_MOUSE,regs); mouse_status:= regs.AX; if (mouse_status <> -1) then begin writeln('No mouse driver'); exit; end; regs.AX:= MOUSE_X_LIMIT; regs.CX:= left; regs.DX:= right; intr(INT_MOUSE,regs); regs.AX:= MOUSE_Y_LIMIT; regs.CX:= top; regs.DX:= bottom; intr(INT_MOUSE,regs); regs.AX:= MOUSE_SET_POSITION; regs.CX:= x; regs.DX:= y; intr(INT_MOUSE,regs); regs.AX:= MOUSE_SHOW; intr(INT_MOUSE, regs); end; 2.3.2 Lấy vị trí chuột. Số hiệu của chức năng lấy vị trí l 03. Toạ độ chuột sẽ đợc ghi vo các biến nguyên x, y. Toạ độ ny sẽ đợc dùng để đổi sang toạ độ trên mn hình văn bản x_text, y_text hay toạ độ trên mn hình đồ hoạ x_graphics, y_graphics nh đã nói trên. const MOUSE_GET_POSITION = $03; procedure getMousePosition(VAR x,y: integer); begin Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 254 [...]... ĐHQG H nội 265 Lập trình bằng Turbo Pascal TI liệu tham khảo 1 Hong Kiếm (chủ biên), Tin học đại cơng nâng cao, Nxb Giáo dục, 1998 2 Quách Tuấn Ngọc, Ngôn ngữ lập trình Pascal, Nxb Giáo dục, 2000 3 Quách Tuấn Ngọc, Bi tập ngôn ngữ lập trình Pascal, Nxb Giáo dục, 2000 4 Schapers A., Mẹo v thủ thuật lập trình bằng Turbo Pascal 5.5, Nxb KHKT H nội, 1996 5 Bùi Thế Tâm, Võ Văn Tuấn Dũng, Giáo trình tin học... đều l các chơng trình thờng trú Nó chặn ngắt bn phím v thay vec tơ ngắt thông thờng bằng một thủ tục xử lí khác để khi gõ aa thì sẽ chuyển thnh mã của â, gõ dd thì chuyển thnh mã của đ, v.v Kĩ thuật lập trình thờng trú đòi hỏi phải kết hợp chặt chẽ với hệ thống, chặn v thay đổi một số ngắt để phục vụ cho mục đích của mình Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 260 Lập trình bằng Turbo Pascal 4.2 Cách... có kiểu Interrupt Một điểm cần lu ý l chơng trình thờng trú không thể biết chắc các ngắt hiện tại có phải l bản gốc của BIOS , DOS hay không vì có thể một chơng trình thờng trú khác đã thay thế nó rồi ! 4.3 Ví dụ minh hoạ Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 261 Lập trình bằng Turbo Pascal 4.3.1 Ví dụ 1 Đầu tiên ta xét một ví dụ đơn giản, lm một chơng trình thờng trú chiếm ngắt số $05 l ngắt có... chơng trình sẽ đổ vỡ ngay 3- Lệnh SetIntVec($00, SaveInt00) để khôi phục lại ngắt $00 - "chia cho không" Chơng trình trên mới chỉ quan tâm lm thế no chiếm chỗ của một ngắt khác Nó đã viết đè lên giá trị gốc ban đầu của ngắt $05 Không có cách no để khôi phục lại chức năng gốc của phím Print-Screen ngoi việc tắt máy khởi động lại Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 262 Lập trình bằng Turbo Pascal. .. end; BEGIN ScrollLeft(80); END 4 Chơng trình thờng trú 4.1 Khái niệm Khi thi hnh một chơng trình, hệ điều hnh dnh riêng một khối nhớ để chứa mã lệnh v các dữ liệu của chơng trình Lúc chơng trình kết thúc, DOS sẽ gọi hm $4C - kết thúc tiến trình v giải phóng vùng nhớ dnh riêng cho chơng trình, chép Command.com đè lên vùng ny Một cách thứ hai để kết thúc chơng trình l dùng hm Keep Sự khác biệt giữa Keep... {truy cập bộ nhớ mn hình v cho hiển thị mn hình đã lu} var i: word; begin Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 258 Lập trình bằng Turbo Pascal for i:=0 to 4000-1 do memL[$B800:i]:= scr[i]; end; BEGIN origMode:= lastMode; {thay đổi mode hiển thị} TextBackGround(Red); Clrscr; gotoxy (10, 5); Writeln(' Day la man hinh se luu lai !'); Writeln(' go ENTER de luu man hinh !!!'); readln; get_screen(old_src);... Thay đổi địa chỉ ny ta sẽ truy cập cổng của các thiết bị khác nhau Chơng trình minh họa dới đây lm mn hình trôi liên tục từ phải sang trái bằng cách thâm nhập trực tiếp vo cổng CRT program CuonManHinh; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 259 Lập trình bằng Turbo Pascal uses crt; const CrtAddr = $3D4; var i: word; procedure ScrollLeft(num: byte); begin for i:= 0 to num do begin asm CLI end; {CLI =... Stacksize,heapmin,heapmax} uses crt,dos; const DefaultTime = 1; {Tham số mặc định, báo thức sau 1 phút} Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 263 Lập trình bằng Turbo Pascal Var CurrentTime: longint; Worktime: word; {khoảng thời gian đợi báo thức} KbdIntVec: procedure; {để lu địa chỉ của chơng trình xử lí ngắt bn phím của hệ thống} {$F+} { force Far call} procedure KeyClick; interrupt; Begin gotoXY(1,1); TextColor(Yellow);... WorkTimeStr:= WorkTimeStr + ParamStr(i); Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 264 Lập trình bằng Turbo Pascal Val(WorkTimeStr,WorkTime, code); if code 0 then workTime:=DefaultTime; end; BEGIN TestParam; CurrentTime:=0; GetIntVec($1C,Addr(KbdIntVec)); {lu vecto ngắt $1C } SetIntVec($1C,Addr(TestTime)); {trỏ đến chơng trình xử lí testTime của ta} keep(0); END Câu hỏi v bi tập 1 Véc tơ ngắt l gì Chúng... v cho thờng trú Tuy nhiên Unit Dos của Turbo Pascal cung cấp cho chúng ta một số thủ tục phục vụ xây dựng chơng trình thờng trú Trớc hết đó l hm Keep đã nói đến ở trên Keep(exitCode: word) ; Cho kết thúc chơng trình v ở lại thờng trú Mã thoát exitCode = 0 l kết thúc bình thờng, exitCode = 1 l thoát bằng Ctrl+C, exitCode = 2 l thoát khi chia cho 0 Vậy một chơng trình thờng trú phải có Keep(0) trớc từ . năng lấy chế độ mn hình} Intr( $10, regs); { $10 l ngắt về dịch vụ mn hình} With regs do begin Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 247 Lập trình bằng Turbo Pascal writeln(' mode man. H nội 262 Lập trình bằng Turbo Pascal Chơng trình dới đây khắc phục nhợc điểm ny. Nó lu lại địa chỉ chứa trong vec tơ ngắt $08 (l ngắt đồng hồ hệ thống). Sau đó mới thay thế bằng địa chỉ. thống bằng các thủ tục GetDate, SetDate. program XemVaDatNgay_UnitDos; uses dos; var y,m,d,dow: word; BEGIN Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 250 Lập trình bằng Turbo Pascal