PRB: INVOKE Pushes SS to Convert NEAR PTR to FAR PTR

ID: Q95414


The information in this article applies to:
  • Microsoft Macro Assembler for MS-DOS, versions 6.0, 6.0a, 6.0b, 6.1, 6.1a, 6.11
  • Microsoft Macro Assembler for OS/2, versions 6.0, 6.0a, 6.0b


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 

Additional query words: 6.00 6.00a 6.00b 6.10 6.10a

Keywords :
Version : :6.0,6.0a,6.0b,6.1,6.11,6.1a
Platform :
Issue type :


Last Reviewed: January 6, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.