home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / TM1632.ZIP / HEL1632A.ASM < prev    next >
Assembly Source File  |  1992-12-04  |  2KB  |  87 lines

  1. TITLE 16 to 32 thunking OS/2 assembly language program to display Hello world!
  2. ; HEL1632A.ASM
  3. PAGE 0,80
  4. .386         
  5. N32  TYPEDEF PTR NEAR32
  6. F32  TYPEDEF PTR FAR32
  7. F16  TYPEDEF PTR FAR16
  8.  
  9. ;STACK32 SEGMENT DWORD STACK FLAT 'STACK'
  10. ;STACK32 ENDS                     
  11.  
  12. STACK16 SEGMENT DWORD STACK USE16 'STACK'
  13. STACK16 ENDS       
  14. ASSUME ss:STACK16
  15.  
  16. DATA32 SEGMENT DWORD PUBLIC FLAT 'DATA'
  17. msg  BYTE 0Dh,0Ah,'Hello World!',0Dh,0Ah ;length 16
  18. Nparams  BYTE ?
  19. wlen DWORD ? ;receives number of bytes written
  20. ProgAddr DWORD ?
  21. OurStack DWORD ?
  22. OurDS    WORD  ?
  23. Stack32  FWORD ?
  24. ReturnPoint DWORD ?       
  25. Entry32  FWORD ?
  26. DATA32 ENDS            
  27.  
  28. DATA16 SEGMENT DWORD PUBLIC USE16 'DATA'
  29. DATA16 ENDS
  30.  
  31. DGROUP GROUP DATA16
  32. EXTERN DOS16SELTOFLAT:FAR16,DOS16FLATTOSEL:FAR16,DOS16EXIT:FAR16
  33.  
  34. CODE32 SEGMENT DWORD PUBLIC FLAT 'CODE'
  35. ASSUME es:FLAT
  36. EXTERN Dos32Write:NEAR;, DOS32EXIT:NEAR
  37. Start32:                              
  38. call  N32 PTR es:[ProgAddr]
  39. jmp   F16 PTR es:[ReturnPoint]
  40. CODE32 ENDS
  41.  
  42. CODE16 SEGMENT DWORD PUBLIC USE16 'CODE'
  43.  
  44. ASSUME ds:DGROUP
  45.  
  46. PRINT:   
  47. mov   ax,SEG FLAT:DATA32
  48. mov   es,ax                                           
  49. mov   DWORD PTR es:Entry32,OFFSET FLAT:Start32
  50. mov   WORD PTR es:Entry32+4,SEG FLAT:CODE32
  51. mov   es:ProgAddr,OFFSET Dos32Write
  52. mov   es:OurDS,ds
  53. mov   WORD PTR es:OurStack+2,ss
  54. mov   WORD PTR es:OurStack,sp
  55. mov   WORD PTR es:ReturnPoint+2,cs
  56. mov   WORD PTR es:ReturnPoint,OFFSET Return1 ;set up return jmp
  57. push  OFFSET FLAT:wlen
  58. pushd 16; length of data
  59. push  OFFSET FLAT:msg
  60. pushd 1; stdout handle
  61. mov   ax,ss ;set up stack pointer and switch to flat form
  62. shl   eax,16
  63. mov   ax,sp
  64. call  DOS16SELTOFLAT
  65. mov   DWORD PTR es:Stack32,eax ;flat offset
  66. mov   WORD PTR es:Stack32+4,SEG FLAT:DATA32
  67. lss   esp,es:Stack32
  68. mov   ds,WORD PTR es:Stack32+4
  69. mov   al,4 ;denote 4 parameters
  70. jmp   F32 PTR es:[Entry32] 
  71. ;add   esp,10h: not necessary because stack pointer will be restored to 16-bit    
  72. Return1:                                
  73. mov   bx,DGROUP
  74. mov   ds,bx
  75. lss   sp,es:OurStack ;restore to 16-bit
  76. or    eax,eax; was write successful?
  77. jnz   Errer        
  78. pushw 0
  79. pushw 1
  80. call  DOS16EXIT
  81. Errer: 
  82. pushw 1
  83. pushw 1
  84. call  DOS16EXIT
  85. CODE16 ENDS
  86. END   PRINT
  87.