Microsoft KB Archive/95414

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

Article ID: 95414

Article Last Modified on 10/22/2003

-

APPLIES TO


 * Microsoft Macro Assembler 6.0 Standard Edition
 * Microsoft Macro Assembler 6.0a
 * Microsoft Macro Assembler 6.0b
 * Microsoft Macro Assembler 6.1 Standard Edition
 * Microsoft Macro Assembler 6.1a
 * Microsoft Macro Assembler 6.11 Standard Edition

-



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

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

Keywords: kbprb KB95414

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.