Chắc rằng trong số các chương trình bạn đã biên dịch bằng Borland Pascal 7, một số chương trình sử dụng unit CRT cũng sẽ gặp phải lỗi Division Error kể trên. Nếu các bạn còn giữ source,[r]
(1)Error 200: division by zero pascal cách khắc phục
Hiện số máy cầu hình cao dùng chương trình Pascal sau dịch cho thực thi nhận thơng báo lỗi: Error 200: division by zero Nếu đem chương trình source cho dịch lại với Turbo Pascal 5.5 lại khơng có vấn đề xảy
Điều đau lịng cho Borland, cơng ty tạo trình biên dịch tiếng Turbo
Pascal, sau thời gian hoạt động thua lỗ định đổi tên thành Inprise Inc bỏ rơi số phần mềm có Turbo Pascal Version cuối Pascal Borland đưa 7.0 Việc cập nhật lên version điều không thực
Trái lại, người yêu thích ngơn ngữ Pascal muốn sâu vào ngơn ngữ này, xin bỏ chút thời gian cho mục Nguyên nhân, nơi nguyên vấn đề trình bày
Nguyên nhân
Trước hết, để tìm vị trí gây nên lỗi, dùng đoạn chương trình đơn giản sau: Program Test;
Uses Crt; Begin
Writeln('Hello'); End
Rõ ràng, chương trình viết chữ Hello lên hình Khi bạn chạy chương trình nhận thông báo lỗi: Runtime error 200 at XXXX:0091 XXXX địa segment gây lỗi, khác với máy tùy theo chương trình nạp nhớ 0091 offset đoạn mã lệnh gây nên lỗi
Nếu bạn bỏ dòng thứ 2: Uses Crt chương trình lại chạy cách "ngon lành" Sở dĩ bỏ dịng hàm writeln dùng chương trình vừa thuộc unit SYSTEM ngầm định, vừa thuộc unit CRT Trong trường hợp dùng lệnh Uses CRT, CRT.Writeln gọi Trái lại, SYSTEM.Writeln sử dụng bạn không viết Uses CRT Vậy, lỗi có liên quan tới unit CRT
Giữ nguyên dòng Uses CRT, thêm dòng: SYSTEM.writeln('System Hello')
vào trước dịng writeln('Hello') Khi chạy chương trình, bạn chẳng thấy dòng System Hello ra, mà hệ thống đưa câu báo lỗi tương tự Như vậy, phần mã gây lỗi nằm trước mã lệnh SYSTEM.Writeln(System Hello)
Từ nhận xét trên, phán đoán phần mã gây lỗi phần khởi động unit CRT-phần thực chương trình Test nạp vào nhớ
Cách giải
Mọi vấn đề "đau đầu" nói giải cách thay đổi nội dung tập tin CRT.TPU Thông thường, bạn khởi động TURBO PASCAL (TP) hay BORLAND PASCAL (BP),
(2)vụ thay đổi unit CRT TURBO.TPL C1: cho lập trình viên Pro, làm sau:
Trước tiến hành bước sau, lưu lại tập tin TURBO.TPL \BP\BIN để đề phòng bất trắc
Bước 1: Sửa lại nội dung unit CRT
Với cài đầy đủ Borland Pascal 7.0, bạn có thư mục \BP\CRT, có tập tin CRT.ASM CRT.PAS Đầu tiên, thay đổi nội dung CRT.ASM sau (hãy bấm Ctrl Q-L tìm từ DelayLoop phần mã sau):
; Delay one timer tick or by CX iterationsDelayLoop: @@1:
SUB AX,1 SBB DX,0 JC @@2
CMP BL,ES:[DI] JE @@1
@@2: RET trở thành:
; Delay one timer tick or by CX iterations DelayLoop:
@@1:
push ax ; bắt đầu hàng chèn thêm push cx push dx
mov ax,0 mov cx,1 mov dx,0
div cx ;với 10 lệnh div cx, DelayCount = 5F0h div cx; đủ cho bạn chạy với CPU có tốc độ < 8GHz div cx ; mặt lý thuyết
div cx div cx div cx div cx div cx div cx div cx pop dx pop cx
pop ax ; kết thúc hàng chèn thêm SUB AX,1
SBB DX,0 JC @@2
CMP BL,ES:[DI] JE @@1
@@2: RET
(3)Lệnh nguyên thủy SUB SBB vòng lặp giữ nguyên, lệnh DIV (sau lưu nội dung ghi AX, CX, DX loạt lệnh PUSH) nhằm làm chậm vòng lặp Sở dĩ tơi chọn lệnh DIV lệnh tiêu tốn nhiều clock CPU (lệnh nhiều thời gian thực hiện) Bạn thêm số lần DIV cảm thấy cần thiết Cuối cùng, loạt lệnh POP hoàn trả lại nội dung ghi
Bước Chép tập tin SE.ASM từ thư mục \BP\SYS vào thư mục \BP\CRT Tập tin SE.ASM chứa số định nghĩa cho trình dịch Unit Borland (hay Turbo) Pascal
Bước Tiến hành dịch CRT.ASM lệnh: \BP\BIN\TASM CRT.ASM
Máy phát vài cảnh báo cách sử dụng tên biến Cứ "nhắm mắt làm ngơ", chẳng có nghiêm trọng đâu
Bước Chạy Borland Pascal tiến hành dịch (bấm F9) \BP\CRT\CRT.PAS để tạo CRT.TPU Chép CRT.TPU vào thư mục \BP\BIN
Bước Chuyển thư mục thời qua \BP\BIN Xóa unit CRT TURBO.TPL lệnh: TPUMOVER TURBO.TPL -CRT
Sau đó, đưa unit CRT sửa vào TURBO.TPL TPUMOVER TURBO.TPL +CRT
TURBO.TPL sẵn sàng Hãy khởi động lại Borland Pascal Hy vọng hàm bạn thực cách xác Turbo Pascal chẳng cịn phát thơng báo lỗi khó chịu "Run time error 200" bạn sử dụng unit CRT
Giải pháp cho chương trình Pascal biên dịch khơng cịn source
Chắc số chương trình bạn biên dịch Borland Pascal 7, số chương trình sử dụng unit CRT gặp phải lỗi Division Error kể Nếu bạn cịn giữ source, biên dịch lại chương trình với unit TURBO.TPL hiệu chỉnh "chuyện lớn" Thế phải làm bạn khơng cịn hay khơng có source chương trình
Để ý chương trình EXE dịch, việc thay đổi vịng lặp DelayLoop để khơng ảnh hưởng tới phần khác chương trình khơng thực Do đó, cần thay đổi trực tiếp đoạn mã lệnh gây lỗi
Giải pháp xin đề cử tới bạn thay đoạn lệnh: XXXX:008e: mov CX,55
XXXX:0091: div CX
(4)đặt thêm lệnh byte trước lệnh move (do lệnh nguyên thủy chiếm byte nhớ lệnh mov AX,0FFFFh chiếm byte Giải pháp dẫn tới việc bạn dùng hàm delay, máy tính chờ (nhanh hơn) so với thời gian bạn yêu cầu, nhiên đa số trường hợp, điều khơng dẫn tới hậu nghiêm trọng Để tránh phiền hà tìm kiếm thay đổi phần mã gây lỗi, tơi có kèm thêm chương trình PATCH.EXE (có thể chép Tịa Soạn PCW) Chương trình tự động thực việc thay đổi đoạn mã kể Chỉ có đơi điều bạn cần lưu ý:
1 Chỉ dùng PATCH với chương trình phát sinh lỗi chạy kể Hãy lưu file nguyên thủy trước thực thay đổi
Error 200: division by zero pascal cách khắc phục