> TP7 only uses 16-bit regs, for longints too, hence no need to > save/restore higher words.
No, programs compiled with Turbo-Pascal 7 with the $G+ option will use 32 bit registers for longint arithmetic if the program runs on a 386 cpu or higher. They test the cpu-type on startup and store the result in the global variable 'test8086'. Longint library functions test this variable to decide which code to use. But the programs do not not save the upper half of the cpu-registers in interrupt procedures, so if the interrupted main program is in the middle of a longint calculation and the interrupt procedure uses longint as well, then the calculation in the main programm can get incorrect results. The attached source demonstrates the problem, however I just noticed that the error happens much less often if the program runs in a dos window than when it runs in plain dos. > >> and it doesn't provide a stack (so your programm will crash even it it > > doesn't > >> use longint). > Of course interrupt handler will have some stack, though it is > usually rather small (like all things in 16-bit world ;) > Built-in stack checking won't work properly though indeed. I think stack checking does report the problem, but the stack can sometimes be so small that it can hardly store the registers. Yet a Pascal-Program can easily use a lot of stack, for example if it uses a big local record variable or strings or if it passes such variables to another procedure. This can easily overwrite the stack, causing the program to crash. Using the $M option does not help because what the interrupt procedure sees is the stack of the interrupted program, not necessarily the stack of the pascal program. Summary: If you want your program to be reliable, don't use the built in interrupt keyword. I suffered from both problems, that's why I wrote trapint.pas > > Euhm... why will it crash ? > > Let me gues... if I call other routines from inside the interrupt routine ? > No. If you re-enter non-reenterable code like DOS services, > say try to open some file without special care. It will crash because the return address on the stack is overwritten with other data, so when the interrupt procedure finishes, the CPU doesn't remember to which address it should return. Klaus
The following section of this message contains a file attachment prepared for transmission using the Internet MIME message format. If you are using Pegasus Mail, or any another MIME-compliant system, you should be able to save it or view it from within your mailer. If you cannot, please ask your system administrator for assistance. ---- File information ----------- File: Int-eax.pas Date: 19 Mar 2004, 11:29 Size: 873 bytes. Type: Binary
Int-eax.pas
Description: Binary data