home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gppdem32.zip / gppDemid32 / call1632.asm < prev    next >
Assembly Source File  |  1996-08-05  |  2KB  |  83 lines

  1.          .386
  2.          .387
  3.    .MODEL FLAT
  4.  
  5. TEXT32   SEGMENT USE32 PUBLIC DWORD 'CODE'
  6. TEXT32   ENDS
  7.  
  8. DATA32   SEGMENT USE32 PUBLIC DWORD 'DATA'
  9.          ORG 0
  10. flatPtr  LABEL NEAR
  11. DATA32   ENDS
  12.  
  13. DGROUP   GROUP DATA32
  14.  
  15.  
  16. TEXT32   SEGMENT
  17.          ASSUME CS:FLAT,DS:NOTHING,ES:NOTHING
  18.          PUBLIC _Call32
  19. _Call32  PROC NEAR
  20.    ; Stack ist 16-Bit beim Aufruf
  21.    ; EBX Größe der Parameter in Bytes
  22.    ; EDX Addresse der aufzurufenden Funktion
  23.    ; Stack:
  24.    ;        Parameter
  25.    ;        Sel         --> RetAddr
  26.    ;        Off         --> RetAddr
  27.    ; 1. 32-Bit Stack bauen
  28.    mov ecx,ss
  29.    and ecx,0FFFFH
  30.    shl ecx,16-3   ; Selector-Bits ausblenden und gleich verschieben
  31.    mov cx,sp      ; ECX = Flat --> SS:SP
  32.    ;lea eax,FLAT:DATA32   ; nur für ALP wegen Bug
  33.    ; mov eax, SEG FLAT:flatPtr ; für MASM und TASM
  34.    ASSUME DS:FLAT,CS:NOTHING
  35.    lea eax,FLAT:DATA32
  36.    ASSUME CS:FLAT,DS:NOTHING
  37.    mov ss,eax
  38.    mov esp,ecx
  39.    ; Jetzt ist Stack 32-Bit
  40.    test esp,3
  41.    jz stDWORD
  42.    and esp, 0FFFFFFFCH ; Stack auf 4 Byte ausrichten
  43. stDWORD:
  44.    push ds
  45.    push es
  46.    mov ds,eax     ; FLAT-Sel in ds laden
  47.    mov es,eax     ; FLAT-Sel in es laden
  48.    push ecx       ; alten Stackpointer sichern
  49.  
  50.    push ebp
  51.    mov ebp,esp
  52.  
  53.    add ecx,4      ; Pointer auf Parameter erzeugen
  54.    push ecx
  55.    call edx    ; eax=(edx)((void*)args);
  56.  
  57.    mov esp,ebp
  58.    pop ebp
  59.  
  60.    pop ecx        ; alten Stackpointer zurückholen
  61.    mov edx,[ecx]  ; in EDX Rückkehraddresse
  62.    mov [ecx+ebx],edx ; Rückkehraddresse an die richtige Stelle schreiben
  63.  
  64.    pop es         ; es wiederherstellen
  65.    pop ds         ; ds wiederherstellen
  66.  
  67.    mov esp,ecx    ; ESP wieder mit OriginalWert laden
  68.    add esp,ebx    ; Stack:       SEL:OFF RetAddr d.h. Parameter entfernen
  69.    mov edx,esp
  70.    shr edx,16-3
  71.    or edx, 7      ; TILED Selector erzeugen
  72.    ; Stack 16-Bit
  73.    mov ss,edx    ;
  74.    and esp,0FFFFH ;   High Bits ausblenden
  75.    shld edx,eax,16 ; Ergebnis erzeugen
  76.    db 66H        ;
  77.    retf
  78. _Call32  ENDP
  79.  
  80. TEXT32   ENDS
  81.  
  82. END
  83.