Ch¹y Turbo Pascal 7.0 víi CPU Intel
Celeron3xx
Xem bai viet bang font Unicode
PCWorld VN 5/99
Trong thêi gian qua, toµ so¹n ®· nhËn ®îc rÊt nhiÒu th¾c m¾c cña b¹n ®äc vÒ vÊn ®Ò lçi khi ch¹y Borland Turbo Pascal 7.0 trªn c¸c m¸y tÝnh tèc ®é cao (Pentium II, AMD K6,...). Borland (nay ®æi tªn thµnh Inprise) l¹i kh«ng cã gi¶i ph¸p chÝnh thøc cho vÊn ®Ò nµy mµ ngêi dïng ph¶i "r¸ng tù lo lÊy". B¹n cã thÓ lªn Internet lÊy "trän gãi" nh÷ng patch file mµ¹ ngêi dïng trªn toµn thÕ giíi "®ãng gãp" vÒ dïng vµ kh«ng cÇn quan t©m c¸ch lµm. Trong trêng hîp muèn t×m hiÓu vµ "tù s¶n xuÊt" th× mêi b¹n x¾n tay lªn!
Nh mét sè b¹n sö dông Borland Pascal 7.0 ®· nhËn xÐt trong sè b¸o PCWorld th¸ng 3 n¨m 1999, víi c¸c bé xö lý Intel Pentium Celeron, mét sè ch¬ng tr×nh Pascal sau khi dÞch vµ cho thùc thi th× nhËn ®îc th«ng b¸o lçi: Error 200: division by zero. NÕu ®em ®óng ch¬ng tr×nh source cho dÞch l¹i víi Turbo Pascal 5.5 th× l¹i kh«ng cã vÊn ®Ò g× x¶y ra.
§iÒu kh¸ ®au lßng cho chóng ta lµ Borland, c«ng ty t¹o ra tr×nh biªn dÞch næi tiÕng Turbo Pascal, sau mét thêi gian ho¹t ®éng thua lç ®· quyÕt ®Þnh ®æi tªn thµnh Inprise Inc. vµ bá r¬i mét sè phÇn mÒm cña m×nh trong ®ã cã Turbo Pascal. Version cuèi cïng cña Pascal do Borland ®a ra lµ 7.0. ViÖc cËp nhËt lªn version míi h¬n lµ ®iÒu kh«ng thùc hiÖn ®îc.
Lµ sinh viªn cña giai ®o¹n ®Çu thËp kû 90, t«i ®· kh¸ viÕt kh¸ nhiÒu ch¬ng tr×nh b»ng Turbo Pascal. C¸ch ®©y vµi th¸ng, khi n©ng cÊp m¸y tÝnh cña m×nh lªn Pentium Celeron 333, t«i ®· nhËn ®îc th«ng b¸o lçi t¬ng tù nh trªn. Víi mét sè b¹n, nÕu Turbo Pascal tõ chèi ch¹y víi Celeron, viÕt l¹i ch¬ng tr×nh b»ng mét ng«n ng÷ kh¸c cã lÏ còng ch¼ng thµnh vÊn ®Ò. Tuy nhiªn, trong trêng hîp cña t«i, thêi gian ®Ó dÞch sè source ®· viÕt sang mét ng«n ng÷ kh¸c nh C hay C++ sÏ rÊt lín. ChÝnh v× vËy, t«i quyÕt ®Þnh t×m hiÓu nguyªn nh©n vµ c¸ch kh¾c phôc vÊn ®Ò trªn. Trong bµi viÕt nµy, xin chia sÎ kinh nghiÖm cña t«i cïng c¸c b¹n. NÕu kh«ng quan t©m tíi nguyªn nh©n x©u xa cña th«ng b¸o lçi trªn, b¹n cã thÓ bá qua môc Nguyªn Nh©n vµ ®i th¼ng tíi phÇn C¸ch gi¶i quyÕt.
Tr¸i l¹i, nÕu lµ ngêi yªu thÝch ng«n ng÷ Pascal vµ muèn ®i s©u vµo ng«n ng÷ nµy, xin bá mét chót thêi gian cho môc Nguyªn nh©n, n¬i mäi nguyªn c¨n cña vÊn ®Ò trªn ®îc tr×nh bµy.
Nguyªn nh©n
Tríc hÕt, ®Ó cã thÓ t×m ®îc vÞ trÝ g©y nªn lçi, chóng ta h·y 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 nµy chØ viÕt ch÷ Hello lªn mµn h×nh. Khi c¸c b¹n ch¹y ch¬ng tr×nh sÏ nhËn ®îc th«ng b¸o lçi: Runtime error 200 at XXXX:0091. XXXX lµ ®Þa chØ segment g©y lçi, cã thÓ kh¸c víi mçi m¸y tïy theo c¸c ch¬ng tr×nh ®· n¹p trong bé nhí. 0091 lµ offset cña ®o¹n m· lÖnh g©y nªn lçi.
NÕu b¹n bá dßng thø 2: Uses Crt th× ch¬ng tr×nh l¹i ch¹y mét c¸ch "ngon lµnh". Së dÜ chóng ta cã thÓ bá dßng nµy lµ v× hµm writeln duy nhÊt dïng trong 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 sÏ ®îc gäi. Tr¸i l¹i, SYSTEM.Writeln sÏ ®îc sö dông nÕu 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, vµ 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 còng sÏ ch¼ng thÊy dßng System Hello hiÖn ra, mµ hÖ thèng vÉn ®a ra 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õ 2 nhËn xÐt trªn, cã thÓ ph¸n ®o¸n ngay phÇn m· g©y lçi lµ phÇn khëi ®éng cña unit CRT-phÇn ®îc thùc hiÖn ®Çu tiªn khi ch¬ng tr×nh Test ®îc n¹p vµo bé nhí.
NÕu b¹n dÞch ch¬ng tr×nh Test ra file EXE råi tiÕn hµnh thi hµnh ngoµi DOS th× sÏ nhËn ®îc thªm mét chót th«ng tin vÒ ®Þa chØ g©y lçi:
Runtime error 200 at XXXX:0091. Error 200 theo Borland Pascal Help lµ lçi Divide by zero (chia cho 0). Ch¬ng tr×nh cña chóng ta cã céng trõ nh©n chia g× ®©u mµ g©y nªn lçi nµy?Nh c¸c b¹n còng biÕt, nÕu dïng mét unit nµo ®ã, khi b¾t ®Çu ch¹y ch¬ng tr×nh, phÇn m· khëi ®éng cña Unit sÏ ®îc thùc hiÖn. B»ng c¸ch sö dông Turbo Debugger (t¹i dÊu nh¾c cña Dos, nhËp TD TEST), b¹n cã thÓ quan s¸t dÔ dµng quan s¸t ®îc c¸c m· khëi ®éng cña unit SYSTEM vµ CRT vµo ®Çu ch¬ng tr×nh díi d¹ng c¸c lÖnh Call Far:
CALL XXXX:0000 ; Khëi ®éng unit system
CALL YYYY:000D ; Khëi ®éng unit Crt
Trong Turbo Debugger, Ên F8 (Step Over) ®Ó thùc hiÖn 1 lÇn lÖnh thø nhÊt vµ F7 (Trace) ®Ó bíc vµo ch¹y tõng bíc lÖnh CALL thø hai-lÖnh khëi ®éng CRT. Sau ®ã, chän môc Run / Execute To, nhËp offset ®Þa chØ cÇn tíi lµ 0091 (hex), bÊm Enter. Con trá sÏ hiÖn lªn ë ngay tríc vÞ trÝ ®o¹n m· lÖnh g©y lçi( XXXX:0091). NÕu nhÊn F8 1 lÇn n÷a, Deburger sÏ hiÖn ra th«ng b¸o:
Terminated, exit code 200. §Ó tiÖn theo dâi, t«i xin trÝch ra mét phÇn c¸c lÖnh cã liªn quan phÝa tríc vµ sau lÖnh g©y lçi:CRT_Initialize:
...............................
XXXX:0071: MOV ES,Seg0040
XXXX:0075: MOV DI,OFFSET Timer
XXXX:0078: MOV BL,ES:[DI] ; ES = 0040h, DI = 006Ch
XXXX:007b: @@2: CMP BL,ES:[DI] ; ES:DI = System clocktick
XXXX:007e:JE @@2
XXXX:0080: MOV BL,ES:[DI]
XXXX:0083: MOV AX,-28
XXXX:0086: CWD ; DX = FFFFh, AX = FFE4h
XXXX:0087: CALL DelayLoop
XXXX:008a: NOT AX
XXXX:008c: NOT DX
XXXX:008e: MOV CX,55
XXXX:0091: DIV CX ; Núi gêy löîi
XXXX:0093: MOV DelayCount,AX
DelayLoop:
XXXX:02c6: @@1: SUB AX,1
XXXX:02c9: SBB DX,0
XXXX:02cc: JC @@2
XXXX:02ce: CMP BL,ES:[DI]
XXXX:02d1: JE @@1
XXXX:02d3: @@2: RET
T«i kh«ng muèn b¹n "sa lÇy" vµo hîp ng÷, xin gi¶i thÝch ý chÝnh cña ®o¹n ch¬ng tr×nh nµy nh sau:
Khi phÇn khëi ®éng cña CRT ch¹y, ch¬ng tr×nh sÏ khëi t¹o mét biÕn gäi lµ DelayCount (d¹ng word 2- byte). BiÕn nµy chøa sè lÇn thùc hiÖn c¸c lÖnh trong vßng lÆp DelayLoop ®Ó lµm chËm 1 mili gi©y. NÕu b¹n cÇn delay N mili gi©y, hÖ thèng sÏ thùc hiÖn N lÇn vßng DelayLoop.
C¸ch x¸c ®Þnh DelayCount sÏ dùa vµo gi¸ trÞ xung ®Õm hÖ thèng (clocktick) t¹i ®Þa chØ 0040:006C (4 byte). Mçi gi©y, nhê kÝch ho¹t cña interrupt 08, gi¸ trÞ t¹i ®Þa chØ nµy sÏ t¨ng lªn 18.2 lÇn.
Tr×nh biªn dÞch sÏ ®Æt vµo DX:AX mét gi¸ trÞ cè ®Þnh vµ gäi vßng lÆp DelayLoop. Trong vßng lÆp nµy, gi¸ trÞ DX:AX sÏ ®îc thay ®æi cho tíi khi clocktick cña hÖ thèng thay ®æi.
§ã lµ ®é thay ®æi cña DX:AX trong 1 clocktick (1/18.2s). §Ó cã gi¸ trÞ nµy cho 1 mili gi©y, gi¸ trÞ DX:AX sÏ ®îc chia cho 55 (xin ®Ó ý:
18.2 * 55 = 1000ms=1second).§o¹n lÖnh g©y lçi trong ch¬ng tr×nh chÝnh lµ ®o¹n chia DX:AX cho CX. VÒ mÆt nguyªn t¾c, th¬ng sè sÏ ®îc chøa trong AX vµ sè d trong DX. Tuy nhiªn, do DX:AX qu¸ lín, gi¸ trÞ DX:AX chia cho CX sÏ vît qua gi¸ trÞ tèi ®a cña 1 word (FFFFh) vµ hÖ thèng ph¸t sinh th«ng b¸o lçi.
Víi m¸y Celeron 333 cña t«i, gi¸ trÞ nhËn ®îc khi ch¹y tíi lÖnh t¹i ®Þa chØ xxxx:008E lµ DX= 0045h, AX=4EEAh. Do ®ã, phÐp chia DX:AX (00454EEAh) cho CX(55=37h) sÏ lµm trµn sè vµ g©y ra lçi runtime. Nguyªn nh©n cña vÊn ®Ò lçi râ rµng cã liªn quan tíi tèc ®é CPU. Do CPU ch¹y qu¸ nhanh, ®é biÕn ®æi DX:AX lµ rÊt lín vµ phÐp chia DX:AX cho CX bÞ trµn. CPU trong tÇm 200A¹266MHz cã lÏ n»m ë ngìng cña "vùc th¼m" v× DX = 045h (gi¸ trÞ øng víi Celeron 333MHz) * 266/333 = 37h = 55 (PhÐp chia DX:AX cho CX sÏ cho ra mét gi¸ trÞ xÊp xØ FFFFh. Do ®ã, víi c¸c hÖ thèng 200 - 266 MHz nhanh, lçi trªn cã thÓ xuÊt hiÖn vµ víi c¸c hÖ thèng chËm, c¸c b¹n cã thÓ ch¹y Turbo Pascal mét c¸ch yªn ¶). Nh b¹n cã thÓ thÊy, CPU tèc ®é 300MHz, 333MHz hoÆc cao h¬n sÏ g©y lçi (do gi¸ trÞ DX lín h¬n nhiÒu so víi CX, dÉn tíi DX:AX chia CX bÞ trµn). Nh vËy, c¸ch gi¶i quyÕt cña chóng ta sÏ xoay quanh viÖc lµm gi¶m ®é biÕn ®æi DX:AX xuèng. §iÒu nµy cã thÓ thùc hiÖn b»ng c¸ch lµm chËm vßng DelayLoop xuèng. B¹n cã thÓ thªm 1 vµi lÖnh lµm tiªu tèn CPU clock vµo vßng lÆp nµy nh t«i thùc hiÖn ë phÇn sau. Mäi th«ng b¸o sÏ chÊm døt vµ ch¬ng tr×nh Pascal cña b¹n sÏ ch¹y mét c¸ch ªm ¶.
C¸ch gi¶i quyÕt
Tríc khi tiÕn hµnh c¸c bíc sau, h·y lu l¹i tËp tin TURBO.TPL trong \BP\BIN ®Ó ®Ò phßng mäi bÊt tr¾c.
Bíc 1: Söa l¹i néi dung unit CRT
Víi mét b¶n cµi ®Çy ®ñ cña Borland Pascal 7.0, b¹n sÏ cã th môc \BP\CRT, trong ®ã cã 2 tËp tin CRT.ASM vµ CRT.PAS. §Çu tiªn, h·y thay ®æi néi dung CRT.ASM nh sau (h·y bÊm Ctrl Q-L vµ t×m tõ DelayLoop vµ 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 c¸c 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 ;vÒ 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 c¸c hµng chÌn thªm
SUB AX,1
SBB DX,0
JC @@2
CMP BL,ES:[DI]
JE @@1
@@2: RET
Nh t«i cã tr×nh bµy ë phÇn trªn, c¸c dßng chÌn thªm kh«ng thùc hiÖn bÊt cø mét lÖnh g× mµ chØ ®¬n thuÇn lµ lµm chËm vßng DelayLoop l¹i. §iÒu nµy kh«ng cã nghÜa lµ ®ång hå hÖ thèng sÏ chËm l¹i mµ chØ ®¬n thuÇn lµm chËm vßng DelayLoop vµ gi¶m sè lÇn lÆp xuèng.
LÖnh nguyªn thñy SUB vµ SBB cña vßng lÆp ®îc gi÷ nguyªn, c¸c lÖnh DIV (sau khi lu néi dung thanh ghi AX, CX, DX b»ng lo¹t lÖnh PUSH) nh»m lµm chËm h¬n vßng lÆp. Së dÜ t«i chän c¸c lÖnh nµy lµ v× DIV lµ lÖnh tiªu tèn nhiÒu clock cña CPU (lÖnh mÊt nhiÒu thêi gian thùc hiÖn). B¹n cã thÓ thªm sè lÇn DIV nÕu 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 c¸c thanh ghi.
Bíc 2. 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 mét sè ®Þnh nghÜa cho qu¸ tr×nh dÞch c¸c Unit cña Borland (hay Turbo) Pascal.
Bíc 3. TiÕn hµnh dÞch CRT.ASM b»ng lÖnh:
\BP\BIN\TASM CRT.ASM
M¸y sÏ ph¸t ra mét vµi c¶nh b¸o vÒ c¸ch sö dông tªn biÕn. Cø "nh¾m m¾t lµm ng¬", ch¼ng cã g× nghiªm träng ®©u.
Bíc 4. Ch¹y Borland Pascal vµ tiÕn hµnh dÞch (bÊm F9) \BP\CRT\CRT.PAS ®Ó t¹o ra CRT.TPU. ChÐp CRT.TPU vµo th môc \BP\BIN.
Bíc 5. ChuyÓn th môc hiÖn thêi qua \BP\BIN
Xãa unit CRT trong TURBO.TPL b»ng lÖnh:
TPUMOVER TURBO.TPL -CRT
Sau ®ã, ®a unit CRT míi 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 r»ng mäi hµm cña b¹n ®Òu ®îc thùc hiÖn mét c¸ch chÝnh x¸c vµ Turbo Pascal sÏ ch¼ng cßn ph¸t ra nh÷ng th«ng b¸o lçi khã chÞu "Run time error 200" khi b¹n sö dông unit CRT n÷a.
Gi¶i ph¸p cho c¸c ch¬ng tr×nh Pascal ®· biªn dÞch nhng kh«ng cßn source
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, biªn dÞch l¹i ch¬ng tr×nh víi unit TURBO.TPL ®· hiÖu chØnh kh«ng ph¶i lµ "chuyÖn lín". ThÕ nhng ph¶i lµm thÕ nµo nÕu b¹n kh«ng cßn hay kh«ng cã source c¸c ch¬ng tr×nh trªn.
§Ó ý 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 ®æi trùc tiÕp ®o¹n m· lÖnh g©y lçi.
Gi¶i ph¸p t«i xin ®Ò cö tíi c¸c b¹n lµ thay ®o¹n lÖnh:
XXXX:008e: mov CX,55
XXXX:0091: div CX
b»ng mét lÖnh ®¬n gi¶n: mov AX,0FFFFh v× FFFFh lµ gi¸ trÞ tèi ®a mµ DelayCount (biÕn d¹ng word 2 byte) cã thÓ nhËn ®îc. Tuy nhiªn, ®Ó kh«ng lµm biÕn ®æi ®Þa chØ c¸c phÇn kh¸c, b¹n nhí ®Æt thªm 1 lÖnh 2 byte tríc lÖnh move nµy (do 2 lÖnh nguyªn thñy chiÕm 5 byte bé nhí cßn lÖnh mov AX,0FFFFh chØ chiÕm 3 byte. Gi¶i ph¸p nµy dÉn tíi viÖc nÕu b¹n dïng hµm delay, m¸y tÝnh sÏ chê Ýt h¬n (nhanh h¬n) so víi thêi gian b¹n yªu cÇu, tuy nhiªn trong ®a sè c¸c trêng hîp, ®iÒu nµy kh«ng dÉn tíi hËu qu¶ g× nghiªm träng. §Ó tr¸nh sù phiÒn hµ khi t×m kiÕm vµ 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¹i Tßa So¹n PCW). Ch¬ng tr×nh nµy sÏ tù ®éng thùc hiÖn viÖc thay ®æi ®o¹n m· kÓ trªn. ChØ cã ®«i ®iÒu b¹n cÇn lu ý:
1. ChØ dïng PATCH víi c¸c ch¬ng tr×nh ph¸t sinh lçi khi ch¹y nh kÓ trªn.
2. H·y lu file nguyªn thñy tríc khi thùc hiÖn thay ®æi.
Chóc b¹n thµnh c«ng!
Lª Nam Th¾ng
C«ng ty Samsung Vina
§T: (08) 821.1111
Kh¾c phôc lçi "Runtime Error 200"
trong Turbo Pascal 7.0 trªn m¸y PC tèc ®é cao
PCWorld VN 5/99
Borland Turbo Pascal 7 lµ bé biªn dÞch ng«n ng÷ lËp tr×nh Pascal, nhng ®· nhiÒu n¨m, h·ng Borland kh«ng cËp nhËt. Trong bé biªn dÞch Pascal nµy cã unit CRT mµ hÇu hÕt ch¬ng tr×nh viÕt trªn Pascal cã sö dông. C¸c ch¬ng tr×nh ®îc biªn dÞch b»ng Borland Turbo Pascal 7 cã sö dông unit CRT sÏ bÞ kÕt thóc víi th«ng b¸o lçi "Runtime Error 200" trªn c¸c m¸y PC tèc ®é cao, vÝ dô nh m¸y Pentium II 350MHz bus 100MHz (chóng t«i còng ®· thö nghiÖm trªn m¸y Pentium II 350MHz - bus 66MHz th× kh«ng thÊy lçi nµy).
Ch¬ng tr×nh ®îc biªn dÞch b»ng Borland Pascal 6 kh«ng bÞ lçi nµy, nhng thêi gian tr× ho·n trong lÖnh delay bÞ sai hoµn toµn khi ch¹y trªn c¸c m¸y PC nhanh.
Nguyªn nh©n
Lçi x¶y ra khi thi hµnh ch¬ng tr×nh cã sù khëi t¹o unit Crt, trong ®ã thñ tôc delay còng ®îc khëi t¹o. ViÖc khëi t¹o thñ tôc delay kh«ng chØ ®îc gäi trong c¸c ch¬ng tr×nh cã sö dông thñ tôc delay, mµ nã cßn ®îc gäi trong tÊt c¶ c¸c ch¬ng tr×nh cã sö dông unit Crt.
Khi khëi t¹o thñ tôc delay, ch¬ng tr×nh sÏ ®Õm sè lÇn thùc hiÖn mét vßng lÆp nhá trong kho¶ng thêi gian 55 mili gi©y (thêi gian ®îc ®o b»ng c¸ch ®äc bé ®Õm thêi gian cña BIOS ë ®Þa chØ 40:6C, bé ®Õm nµy nhÞp 18,2 lÇn mçi gi©y, nghÜa lµ mçi nhÞp chiÕm 55 mili gi©y).
Sè ®Õm nµy ®îc chia l¹i cho 55 ®Ó ®îc sè lÇn thùc hiÖn vßng lÆp trong mét mili gi©y. KÕt qu¶ ®îc ghi vµo trong biÕn kiÓu word (16 bit). KÕt qu¶ sÏ ®îc sö dông lµm c¬ së ®Ó tÝnh thêi gian tr× ho·n trong lÖnh delay. Khi ch¹y ch¬ng tr×nh trªn c¸c m¸y PC tèc ®é cao, sè lÇn lÆp trong 55 mili gi©y qu¸ lín (h¬n 65.535) lµm biÕn nµy bÞ trµn (overflow) vµ g©y ra lçi (ý nghÜa cña Runtime Error 200 lµ lçi chia cho Zero, nhng thËt ra ®ã lµ lçi trµn biÕn).
Gi¶i ph¸p
Díi ®©y lµ vµi bé ch¬ng tr×nh cã thÓ t×m trªn Internet ®Ó kh¾c phôc lçi nµy cho nh÷ng trêng hîp tiªu biÓu. Còng cÇn lu ý víi c¸c b¹n r»ng ®©y lµ nh÷ng ch¬ng tr×nh do ngêi dïng viÕt, cßn Borland còng nh Intel kh«ng ®a ra gi¶i ph¸p nµo!
NÕu b¹n chØ cã tËp tin ®· dÞch sang file .EXE mµ kh«ng cã ch¬ng tr×nh nguån:
Cã thÓ dïng TpPatch.zip, bé ch¬ng tr×nh söa trùc tiÕp trªn tËp tin thùc thi (.EXE) ®îc biªn dÞch tõ Borland Pascal 7, chØ nªn sö dông cho c¸c ch¬ng tr×nh kh«ng cÇn ®Þnh thêi chÝnh x¸c. B¹n h·y gi¶i nÐn tËp tin nµy, sau ®ã thùc hiÖn theo nh÷ng híng dÉn cô thÓ trong ®ã.
NÕu b¹n sö dông Turbo Pascal 7.01 hoÆc Borland Pascal 7.01 ë chÕ ®é real mode :Trong trêng hîp nµy, b¹n cã thÓ t¶i xuèng ba tËp tin sau vµ tïy chän theo ý b¹n.
T7TplFix.zip. Bé ch¬ng tr×nh n©ng cÊp cho tËp tin th viÖn Run Time Library (TURBO.TPL), b¹n chØ cÇn gi¶i nÐn, ch¹y ch¬ng tr×nh vµ nã sÏ tù ®éng thùc hiÖn c«ng viÖc trªn.
NewDelay.pas. Lµ mét tËp tin d¹ng Unit thay thÕ lÖnh delay. NÕu dïng Unit nµy, ph¶i khai b¸o nã tríc Crt vµ tÊt c¶ c¸c Unit kh¸c cã sö dông Unit Crt trong ch¬ng tr×nh nguån.
Rdelay.zip. Gièng nh NewDelay, nã thay thÕ lÖnh Delay.
Bé ch¬ng tr×nh bppatch. §©y lµ gi¶i ph¸p theo chóng t«i thÊy lµ tèt nhÊt khi tiÕn hµnh c¸c thö nghiÖm. Gi¶i ph¸p nµy bao gåm ch¬ng tr×nh nguån Crt.asm vµ Crt.pas (mµ chóng ta cã thÓ häc ®îc nhiÒu ®iÒu nÕu so s¸nh Crt.asm vµ Crt.pas víi ch¬ng tr×nh gèc cña Borland) cïng c¸c th viÖn Turbo.tpl, Tpp.tpl, Tpw.tpl. HoÆc lµ b¹n dÞch l¹i toµn bé th viÖn RTL, hoÆc ®¬n gi¶n lµ b¹n chØ cÇn chÐp c¸c file .TPL vµo th môc BIN vµ dÞch l¹i c¸c ch¬ng tr×nh mµ b¹n ®· viÕt.
Vµi bé ch¬ng tr×nh kh¸c nh bp7patch, tp7p5fix, tpbug.
Sau khi t×m hiÓu c¸c gi¶i ph¸p trªn, nhiÒu ngêi trong chóng ta cã thÓ thÊy r»ng mét gi¶i ph¸p ®Çy ®ñ vÒ nhiÒu mÆt (nhÊt lµ vÊn ®Ò b¶n quyÒn) vÉn cha cã, trõ khi Borland (®· ®æi tªn thµnh Inprise) ph¸t hµnh phiªn b¶n míi.
C¸c b¹n cã thÓ nhËn ®îc c¸c gi¶i ph¸p trªn b»ng c¸ch gëi e-mail ®Õn ®Þa chØ pcworldvn@hcm.vnn.vn víi subject: get fix error 200. NÕu c¸c b¹n muèn so s¸nh Crt.asm vµ Crt.pas víi b¶n gèc cña Borland xin gëi email ®Õn ®Þa chØ trªn cã subject: get RTL.
Trung Dòng
H÷u Hoan (PC World VN)
PcLeHoan
1996 - 2002
Mirror :
http://www.pclehoan.com
Mirror :
http://www.lehoanpc.net
Mirror :
http://www.ktlehoan.com