;Die Verkorkstheit von mexPrintf erfordert eine unschöne und leider
;nicht reentranzfähige Methode, das Datensegmentregister zu retten,
;ohne den Stack zu verwenden. Reentrante mexPrintf-Aufrufe werden
;kurzerhand unterbunden, um schwereren Schaden zu vermeiden
;Oder aber, wenn mexPrintf mit ^C abgebrochen werden kann, ist kein
;solcher Schutz möglich.
ideal
model large,c
P386
;TEST_REENTER equ 1 ;#define: Variante mit oder ohne Reenter-Test
extrn mexPrintf:far ;Import (mit Unterstrich)
extrn _AHINCR:far
extrn _AHSHIFT:far
publicdll DLLMEXPRINTF ;Export (mit Unterstrich)
publicdll pascal INCHP, pascal DECHP, pascal INCHPL
IFDEF TEST_REENTER
DATASEG
RLock db -1
ENDIF
UDATASEG
SaveDS dw ?
RetAdr dd ?
CODESEG
proc DLLMEXPRINTF far
push ds
push @data
pop ds ;Datensegment der CMEX.DLL
IFDEF TEST_REENTER
inc [RLock] ;Wiedereintritts-Zähler
jnz @@skip ;ungleich Null: Reenter! Sprung!
ENDIF
pop [SaveDS] ;Aufrufers Datensegment
pop [RetAdr] ;Aufrufers Returnadresse (32bit)
call mexPrintf ;gleiche Stack-Schicht: korrekter Aufruf
push [RetAdr]
IFDEF TEST_REENTER
push [SaveDS]
@@skip: dec [RLock]
pop ds
ELSE
mov ds,[SaveDS]
ENDIF
ret
endp
;IncHugePointer - Erhöhen eines Zeigers
proc INCHP pascal
arg P:DWord, By:Word
les bx,[P] ;Adresse von P
mov ax,[By]
add [word LOW es:bx],ax ;Offset inkrementieren
jnc @@e ;kein Überlauf: Selektor belassen!
add [word HIGH es:bx],offset _AHINCR ;Selektor erhöhen
@@e: ret
endp
;DecHugePointer - Erniedrigen eines Zeigers
proc DECHP pascal
arg P:DWord, By:Word
les bx,[P] ;Adresse von P
mov ax,[By]
sub [word LOW es:bx],ax ;Offset dekrementieren
jnc @@e ;kein Überlauf: Selektor belassen!
sub [word HIGH es:bx],offset _AHINCR ;Selektor erniedrigen
@@e: ret
endp
;IncHugePointerLong - Erhöhen und Erniedrigen eines Zeigers
proc INCHPL pascal
arg P:DWord, By:DWord
les bx,[P] ;Adresse von P
mov cx,[word LOW By] ;Hier AX:CX: ungewöhnlich!
mov ax,[word HIGH By]
add [word LOW es:bx],cx ;Offset inkrementieren
adc ax,0 ;Anzahl der 64-K-Übergänge
shl ax,offset _AHSHIFT ;Vielfaches erzeugen
add [word HIGH es:bx],ax ;Selektor erhöhen bzw. erniedrigen
ret
endp
end
Detected encoding: OEM (CP437) | 1
|
|