ID Number: Q72698
6.00
OS/2
Summary:
The "Microsoft Macro Assembler Programmer's Guide" for MASM version
6.0 has a HELLO.ASM example for OS/2 on page 458, section 17.3, and
has the same example using INVOKE on page 459. Both examples use
simplified dot directives. The code sample below shows how the
examples may be assembled using full segment directives.
More Information:
The code that the assembler generates with the INVOKE directive is
placed in comment lines below each INVOKE.
With INVOKE, the assembler generates code depending on the prototypes
for the DosWrite and DosExit functions declared in the include file
BSEDOS.INC. Both the prototypes indicate the PASCAL calling
convention. In BSEDOS.INC, DosWrite is prototyped as:
DosWrite PROTO FAR PASCAL \
hf:Hfile, bBuf:PVOID, cbBuf:WORD, pcbBytesWritten:PWORD
DosExit is prototyped in BSEDOS.INC as:
DosExit PROTO FAR PASCAL fTerminate:BOOL, usExitCode:WORD
In OS2DEF.INC, PVOID is typedefined as:
PVOID TYPEDEF FAR PTR
PWORD is typedefined as:
PWORD TYPEDEF FAR PTR WORD
BOOL is typedefined as:
BOOL TYPEDEF WORD
The code generated for INVOKE accomplishes the following:
1. Pushes the arguments for the function DosWrite on the stack (from
right to left).
2. Pushes the arguments for the DosExit function on the stack (from
right to left).
3. Exits.
Sample Code
-----------
; Assemble options needed:
.286
INCLUDELIB os2.lib
INCLUDE os2.inc
DGROUP GROUP _DATA
STACK SEGMENT PARA STACK 'STACK' ;stack segment declared
WORD 256 dup(?)
STACK ENDS
_DATA SEGMENT WORD PUBLIC 'DATA' ;data segment declared
message BYTE "Hello World", 13,10
bytecount DWORD ?
_DATA ENDS
_TEXT SEGMENT WORD PUBLIC 'CODE' ;code segment declared
ASSUME CS:_TEXT, DS:_DATA, SS:STACK
@Startup:
INVOKE DosWrite, 1, ADDR message, LENGTHOF message
ADDR bytecount
;Code generated by INVOKE
;------------------------
; push 1 ;output to Stdout
; push ds ;pass address of msg
; push OFFSET message
; push LENGTHOF message ;pass length of msg
; push ds
; push OFFSET bytecount ;pass address of count
; call DosWrite
INVOKE DosExit,+1h, +0h
;Code generated by INVOKE
;------------------------
; push +1h ;Ends all threads
; push +0h ;Pass 0 return code
; call DosExit
_TEXT ENDS
END @Startup