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:MajorLast Reviewed:10/22/2003
Keywords:kbprb KB95414