You are on page 1of 6

Hin ti mt s my cu hnh cao dng chng trnh Pascal sau khi dch v

cho thc thi th nhn c thng bo li: Error 200: division by zero. Nu
em ng chng trnh source cho dch li vi Turbo Pascal 5.5 th li
khng c vn g xy ra.
iu kh au lng cho chng ta l Borland, cng ty to ra trnh bin dch
ni ting Turbo
Pascal, sau mt thi gian hot ng thua l quyt nh i tn thnh
Inprise Inc. v b ri mt s phn mm ca mnh trong c Turbo Pascal.
Version cui cng ca Pascal do Borland a ra l 7.0. Vic cp nht ln
version mi hn l iu khng thc hin c.
Tri li, nu l ngi yu thch ngn ng Pascal v mun i su vo ngn
ng ny, xin b mt cht thi gian cho mc Nguyn nhn, ni mi nguyn
cn ca vn trn c trnh by.
Nguyn nhn
Trc ht, c th tm c v tr gy nn li, chng ta hy dng on
chng trnh n gin sau:
Program Test;
Uses Crt;
Begin
Writeln('Hello');
End.
R rng, chng trnh ny ch vit ch Hello ln mn hnh. Khi cc bn
chy chng trnh s nhn c thng bo li: Runtime error 200 at
XXXX:0091. XXXX l a ch segment gy li, c th khc vi mi my
ty theo cc chng trnh np trong b nh. 0091 l offset ca on m
lnh gy nn li.
Nu bn b dng th 2: Uses Crt th chng trnh li chy mt cch "ngon

lnh". S d chng ta c th b dng ny l v hm writeln duy nht dng


trong chng trnh va thuc unit SYSTEM ngm nh, va thuc unit
CRT. Trong trng hp dng lnh Uses CRT, CRT.Writeln s c gi. Tri
li, SYSTEM.Writeln s c s dng nu bn khng vit Uses CRT. Vy,
li c lin quan ti unit CRT.
Gi nguyn dng Uses CRT, v thm dng:
SYSTEM.writeln('System Hello')
vo trc dng writeln('Hello'). Khi chy chng trnh, bn cng s chng
thy dng System Hello hin ra, m h thng vn a ra cu bo li tng
t. Nh vy, phn m gy li nm trc m lnh SYSTEM.Writeln(System
Hello).
T 2 nhn xt trn, c th phn on ngay phn m gy li l phn khi
ng ca unit CRT-phn c thc hin u tin khi chng trnh Test c
np vo b nh.
Cch gii quyt
Mi vn "au u" ni trn s c gii quyt bng cch thay i ni
dung tp tin CRT.TPU. Thng thng, khi bn khi ng TURBO PASCAL
(TP) hay BORLAND PASCAL (BP), CRT.TPU s c h thng t ng
np khi c TURBO.TPL (TPL=Turbo Pascal Library). Nhim v ca
chng ta l thay i unit CRT trong TURBO.TPL.
C1: nu cho mnh l mt lp trnh vin Pro, hy lm nh sau:
Trc khi tin hnh cc bc sau, hy lu li tp tin TURBO.TPL trong
\BP\BIN phng mi bt trc.
Bc 1: Sa li ni dung unit CRT
Vi mt bn ci y ca Borland Pascal 7.0, bn s c th mc
\BP\CRT, trong c 2 tp tin CRT.ASM v CRT.PAS. u tin, hy thay

i ni dung CRT.ASM nh sau (hy bm Ctrl Q-L v tm t DelayLoop v


phn 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 thnh:
; Delay one timer tick or by CX iterations
DelayLoop:
@@1:
push ax ; bt u cc hng chn thm
push cx push dx
mov ax,0
mov cx,1
mov dx,0
div cx ;vi 10 lnh div cx, DelayCount = 5F0h div cx; cho bn chy vi
CPU c tc < 8GHz
div cx ; v mt l thuyt.
div cx
div cx
div cx
div cx
div cx
div cx
div cx
pop dx
pop cx
pop ax ; kt thc cc hng chn thm
SUB AX,1

SBB DX,0
JC @@2
CMP BL,ES:[DI]
JE @@1
@@2: RET
Nh ti c trnh by phn trn, cc dng chn thm khng thc hin bt
c mt lnh g m ch n thun l lm chm vng DelayLoop li. iu ny
khng c ngha l ng h h thng s chm li m ch n thun lm chm
vng DelayLoop v gim s ln lp xung.
Lnh nguyn thy SUB v SBB ca vng lp c gi nguyn, cc lnh
DIV (sau khi lu ni dung thanh ghi AX, CX, DX bng lot lnh PUSH)
nhm lm chm hn vng lp. S d ti chn cc lnh ny l v DIV l lnh
tiu tn nhiu clock ca CPU (lnh mt nhiu thi gian thc hin). Bn c
th thm s ln DIV nu cm thy cn thit. Cui cng, lot lnh POP hon
tr li ni dung cc thanh ghi.
Bc 2. Chp tp tin SE.ASM t th mc \BP\SYS vo th mc \BP\CRT.
Tp tin SE.ASM cha mt s nh ngha cho qu trnh dch cc Unit ca
Borland (hay Turbo) Pascal.
Bc 3. Tin hnh dch CRT.ASM bng lnh:
\BP\BIN\TASM CRT.ASM
My s pht ra mt vi cnh bo v cch s dng tn bin. C "nhm mt
lm ng", chng c g nghim trng u.
Bc 4. Chy Borland Pascal v tin hnh dch (bm F9)
\BP\CRT\CRT.PAS to ra CRT.TPU. Chp CRT.TPU vo th mc
\BP\BIN.
Bc 5. Chuyn th mc hin thi qua \BP\BIN
Xa unit CRT trong TURBO.TPL bng lnh:

TPUMOVER TURBO.TPL -CRT


Sau , a unit CRT mi sa vo TURBO.TPL
TPUMOVER TURBO.TPL +CRT
TURBO.TPL sn sng. Hy khi ng li Borland Pascal. Hy vng rng
mi hm ca bn u c thc hin mt cch chnh xc v Turbo Pascal s
chng cn pht ra nhng thng bo li kh chu "Run time error 200" khi
bn s dng unit CRT na.
Gii php cho cc chng trnh Pascal bin dch nhng khng cn
source
Chc rng trong s cc chng trnh bn bin dch bng Borland Pascal
7, mt s chng trnh s dng unit CRT cng s gp phi li Division
Error k trn. Nu cc bn cn gi source, bin dch li chng trnh vi
unit TURBO.TPL hiu chnh khng phi l "chuyn ln". Th nhng
phi lm th no nu bn khng cn hay khng c source cc chng trnh
trn.
rng do chng trnh EXE c dch, vic thay i vng lp
DelayLoop khng nh hng ti cc phn khc ca chng trnh l
khng thc hin c. Do , chng ta cn thay i trc tip on m lnh
gy li.
Gii php ti xin c ti cc bn l thay on lnh:
XXXX:008e: mov CX,55
XXXX:0091: div CX
bng mt lnh n gin: mov AX,0FFFFh v FFFFh l gi tr ti a m
DelayCount (bin dng word 2 byte) c th nhn c. Tuy nhin, khng

lm bin i a ch cc phn khc, bn nh t thm 1 lnh 2 byte trc


lnh move ny (do 2 lnh nguyn thy chim 5 byte b nh cn lnh mov
AX,0FFFFh ch chim 3 byte. Gii php ny dn ti vic nu bn dng hm
delay, my tnh s ch t hn (nhanh hn) so vi thi gian bn yu cu, tuy
nhin trong a s cc trng hp, iu ny khng dn ti hu qu g nghim
trng. trnh s phin h khi tm kim v thay i phn m gy li, ti c
km thm chng trnh PATCH.EXE (c th chp ti Ta Son PCW).
Chng trnh ny s t ng thc hin vic thay i on m k trn. Ch
c i iu bn cn lu :
1. Ch dng PATCH vi cc chng trnh pht sinh li khi chy nh k trn.
2. Hy lu file nguyn thy trc khi thc hin thay i.
C2: Nu bn khng mun mt thi gian th hy ti file Turbol.tpl ny v sau
copy ln file c l xong
http://www.hua.edu.vn/it/pqdung/download/TDC/TURBO.TPL
su tm

You might also like