PRB: INVOKE Pushes SS to Convert NEAR PTR to FAR PTR (95414)
The information in this article applies to:
- Microsoft Macro Assembler (MASM) 6.0
- Microsoft Macro Assembler (MASM) 6.0a
- Microsoft Macro Assembler (MASM) 6.0b
- Microsoft Macro Assembler (MASM) 6.1
- Microsoft Macro Assembler (MASM) 6.1a
- Microsoft Macro Assembler (MASM) 6.11
This article was previously published under Q95414 SYMPTOMS
When an application passes a parameter of type NEAR PTR to a routine
that expects an argument of type FAR PTR, the INVOKE directive
converts the NEAR PTR to a FAR PTR by pushing the SS segment register
on the stack. The assembler does not issue any warnings when it
applies this conversion. In a situation where SS does not equal DS, as
in a Windows dynamic-link library (DLL), INVOKE may generate incorrect
code.
CAUSE
When the assembler converts a NEAR PTR to a FAR PTR, it uses the SS
segment register when it has no other information about the
appropriate segment value.
RESOLUTION
When your application passes a NEAR PTR parameter to a function that
expects a FAR PTR, specify the segment register to use in the
conversion by adding the appropriate segment prefix (cs:, ds:, es:,
or ss:) to the parameter. The code example below demonstrates this
method.
Sample Code
; Assemble options needed: none
.MODEL small, C, farstack
func1 PROTO arg1:FAR PTR BYTE
.CODE
func2 PROC, arg2:NEAR PTR BYTE
INVOKE func1, arg2 ; This pushes ss:arg2
ret
func2 ENDP
func3 PROC, arg2:NEAR PTR BYTE
INVOKE func1, ds:arg2 ; This pushes ds:arg2
ret
func3 ENDP
END
Modification Type: | Major | Last Reviewed: | 10/22/2003 |
---|
Keywords: | kbprb KB95414 |
---|
|