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

  1. TITLE OS/2 assembly language program to display Hello world!             
  2. ; calling 16-bit API from 32-bit module
  3. .LIST
  4. ; HEL3216.ASM
  5. PAGE 0,80
  6. .386
  7. ;For 32 bit OS/2 2.0 using DOS16WRITE
  8. N32  TYPEDEF PTR NEAR32
  9. F32  TYPEDEF PTR FAR32
  10. F16  TYPEDEF PTR FAR16
  11. STACK32 SEGMENT DWORD STACK FLAT 'STACK'
  12. STACK32 ENDS
  13.  
  14. DATA32 SEGMENT DWORD PUBLIC FLAT 'DATA'
  15. msg  BYTE 0Dh,0Ah,'Hello World!',0Dh,0Ah ;length 16
  16. wlen WORD ? ;receives number of bytes written
  17. OurStack FWORD ?
  18. OurDS    WORD  ?
  19. Stack16  DWORD ?
  20. ProgAddr DWORD ? 
  21. ReturnPoint FWORD ?       
  22. Entry16  DWORD ?
  23. DATA32 ENDS
  24.  
  25. EXTERN DOS16WRITE:FAR16, DOS16EXIT:FAR16       
  26. ASSUME ds:FLAT,ES:FLAT,SS:FLAT
  27.  
  28. CODE16 SEGMENT DWORD PUBLIC USE16 'CODE'
  29. Start16:        
  30. ; This method of indirect calls and jumps enables the code to be reusable for
  31. ; any number of 16-bit API calls instead of using separate code for each API
  32. ; function called
  33. call  F16 PTR FLAT:[ProgAddr]
  34. jmp   F32 PTR FLAT:[ReturnPoint]
  35.  
  36. CODE16 ENDS
  37.  
  38. CODE32 SEGMENT DWORD PUBLIC FLAT 'CODE'
  39. ;should it be EXTERN DOS16WRITE:NEAR?   
  40. EXTERN DOS32FLATTOSEL:NEAR, DOS32SELTOFLAT:NEAR
  41. ASSUME ds:FLAT,ES:FLAT,SS:FLAT
  42.  
  43. PRINT PROC NEAR
  44. push  ebp
  45. mov   ebp,esp   
  46. push  ebx
  47. push  esi
  48. push  edi
  49. push  ebp
  50. mov   OurDS,ds
  51. mov   DWORD PTR OurStack,esp
  52. mov   WORD PTR OurStack+4,ss 
  53. mov   WORD PTR [Entry16+2],SEG Start16
  54. mov   WORD PTR [Entry16],OFFSET Start16
  55. mov   WORD PTR [ProgAddr+2],SEG DOS16WRITE
  56. mov   WORD PTR [ProgAddr],OFFSET DOS16WRITE
  57. mov   WORD PTR [ReturnPoint+4],cs
  58. mov   DWORD PTR [ReturnPoint],OFFSET Return1
  59. pushw 1; stdout handle for DOS16WRITE
  60. mov   eax,OFFSET msg; DOSFLATTOSEL and DOSSELTOFLAT take parameter in EAX
  61. call  DOS32FLATTOSEL
  62. push  eax ;seg & offset of msg  
  63. pushw 16 ;length of message
  64. mov   eax,OFFSET wlen
  65. call  DOS32FLATTOSEL
  66. push  eax; seg & offset of wlen
  67. mov   eax,esp
  68. call  DOS32FLATTOSEL
  69. mov   Stack16,eax
  70. lss   sp,Stack16                            
  71. jmp   F16 PTR [Entry16]
  72. Return1:
  73. lss   esp,FLAT:OurStack
  74. mov   ds,FLAT:OurDS
  75. mov   es,FLAT:OurDS
  76. pop   ebp
  77. pop   edi
  78. pop   esi
  79. pop   ebx
  80. or    ax,ax; was write successful?
  81. jnz   Errer
  82. mov   eax,0 ;return success code
  83. leave
  84. ret
  85. Errer:
  86. mov   eax,1; return error code
  87. leave
  88. ret
  89. PRINT ENDP
  90. CODE32 ENDS
  91. END   PRINT
  92.