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 l­u 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 l­u 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 nh­ng 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Õ nh­ng 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 l­u ý:

    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 l­u 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, nh­ng ®· 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, nh­ng 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, nh­ng 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 l­u ý 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 ch­a 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