Để ý rằng do chương trình EXE đã được dịch, việc thay đổi vòng lặp DelayLoop để không ảnh hưởng tới các phần khác của chương trình là không thực hiện được.. Do đó, chúng ta cần thay đổ[r]
(1)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
(2)SUB AX,1 SBB DX,0 JC @@2
CMP BL,ES:[DI] JE @@1
@@2: RET
Như có trình bày phần trên, dịng chèn thêm khơng thực lệnh mà đơn làm chậm vòng DelayLoop lại Điều khơng có nghĩa đồng hồ hệ thống chậm lại mà đơn làm chậm vòng DelayLoop giảm số lần lặp xuống
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
(3)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 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
bằng lệnh đơn giản: mov AX,0FFFFh FFFFh giá trị tối đa mà DelayCount (biến dạng word byte) nhận Tuy nhiên, để không làm biến đổi địa phần khác, bạn nhớ đặ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 ý: