home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ASMPRG.ZIP / THUNK16.ASM < prev   
Assembly Source File  |  1993-01-10  |  4KB  |  105 lines

  1. ;==============================================================================;
  2. ; OS/2 2.0 Assembler Routines                                                  ;
  3. ;                                                                              ;
  4. ; thunk16.asm     thunking routines, 16 <-> 32 bit calls                       ;
  5. ;                                                                              ;
  6. ; Author: Larry Morley                                  (c) Larry Morley, 1993 ;
  7. ;==============================================================================;
  8.  
  9.                   INCLUDE std20.inc
  10.                   INCLUDE stdmac20.inc
  11.  
  12. PUBLIC            _Call16
  13.  
  14. ;------------------------------------------------------------------------------
  15.  
  16. CODE32            SEGMENT
  17.                   ASSUME  CS:CODE32,SS:STACK32
  18.  
  19. _Call16           PROC
  20.  
  21.                                                   ; get caller's return address
  22.                                                   ; off the stack and save
  23.  
  24.                   POP     EAX
  25.                   MOV     dwRetToCaller,EAX
  26.                                                   ; put return address of thunk
  27.                                                   ; on stack frame
  28.  
  29.                   PUSH    OFFSET FLAT:_RetToThunk16
  30.                   MOV     EBX,ESP
  31.                   SHL     WORD PTR [EBX+2],3
  32.                   ADD     WORD PTR [EBX+2],7
  33.  
  34.                                                   ; stack frame now set up
  35.                                                   ; for jump to - return from
  36.                                                   ; 16 bit function
  37.  
  38.                   MOV     EAX,OFFSET FLAT:_Thunk16
  39.                   MOV     EBX,EAX
  40.                   SHR     EAX,16
  41.                   SHL     AX,3
  42.                   ADD     AX,7
  43.                   MOV     wThunk16AddrSeg,AX
  44.                   AND     EBX,00000FFFFH
  45.                   MOV     dwThunk16AddrOff,EBX
  46.  
  47.                   MOV     dwRetToCall16Off,OFFSET FLAT:_RetToCall16
  48.                   MOV     AX,CS
  49.                   MOV     wRetToCall16Seg,AX
  50.  
  51.                   mov     eax,dwRetToCaller       ; ret to caller
  52.                   mov     ax,wThunk16AddrSeg
  53.                   mov     eax,dwThunk16AddrOff
  54.  
  55.                   MOV     dwSavedStackPtr,ESP
  56.  
  57.                   MOV     AX,SS
  58.                   MOV     DS,AX
  59.                   MOV     EAX,EBP
  60.                   SHR     EAX,16
  61.                   SHL     AX,3
  62.                   ADD     AX,7
  63.                   MOV     SS,AX
  64.                   NOP
  65.  
  66.                   MOV     EBX,EBP
  67.                   AND     EBX,00000FFFFH
  68.  
  69.                   JMP     fwThunk16AddrDS
  70.  
  71. _RetToCall16      EQU     $
  72.                                                   ; leave ax, bx alone since
  73.                                                   ; they may contain return
  74.                                                   ; values from function call
  75.                   MOV     DX,DS
  76.                   MOV     SS,DX
  77.                   NOP
  78.  
  79.                   MOV     EDX,dwSavedStackPtr
  80.                   AND     EDX,0FFFF0000H
  81.                   OR      ESP,EDX
  82.                   JMP     dwRetToCaller
  83.  
  84. _Call16           ENDP
  85.  
  86. CODE32            ENDS
  87.  
  88. ;******************************************************************************
  89.  
  90. CODE16            SEGMENT
  91.  
  92. _Thunk16          PROC
  93.  
  94.                   JMP     dwFnToCallFrom16
  95.  
  96. _RetToThunk16     EQU     $
  97.                   JMP     fwRetToCall16
  98.  
  99. _Thunk16          ENDP
  100.  
  101.  
  102. CODE16            ENDS
  103.                   END
  104.  
  105.