Microsoft KB Archive/123688

= Turning a 16-bit Protected Segment into a 32-bit Segment =

Article ID: 123688

Article Last Modified on 2/11/2004

-

APPLIES TO


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

-



This article was previously published under Q123688



SUMMARY
By default, 32-bit code created in MASM exists in 16-bit segments. This article shows by example how to use DPMI calls to change a 16-bit segment into a 32-bit segment.

NOTE: On a 386, almost no improvement in performance results from using 32-bit code in a 32-bit segment over using 32-bit code in a 16-bit segment. There may be slight performance improvement on a 486 due to the effects of the 66h prefix byte on instruction pipelining.



MORE INFORMATION
The following code fragment uses DPMI calls to turn a 16-bit protected mode segment into a 32-bit protected mode segment. A number of the instructions are encoded using the DB directive because you need to generate USE16 instructions inside of a USE32 segment. The sample includes an interface function so that you can call the 32-bit segment from a 16-bit C, C++, or FORTRAN module.

NOTE: Your debugger may still report these segments to be 16-bit segments. It all depends on what the debugger expects.

Sample Code
.MODEL large .386

.CODE SwitchInterface PROC FAR16 call FAR32 PTR Switch16bitTo32bit ret SwitchInterface ENDP

CODE32 SEGMENT PARA PUBLIC USE32 'CODE' Switch16bitTo32bit PROC FAR32 xor eax, eax                      ;zero set xor eax, DWORD PTR 0C08B0000h     ;zero clear for 32-bit jz Still16bit                     ;zero set for 16-bit ret

Still16bit: DB 083h, 0ECh, 008h       ;sub sp, 8 DB 08Ch, 0D0h             ;mov ax, ss      DB 08Eh, 0C0h              ;mov es, ax      DB 08Bh, 0FCh              ;mov di, sp

DB 08Ch, 0CBh             ;mov bx, cs      DB 0B8h, 00Bh, 0000h       ;mov ax, 000Bh int 31h

DB 026h, 080h, 04Dh, 006h, 040h   ;or BYTE PTR es:[di+6], 40h DB 0B8h, 00Ch, 0000h      ;mov ax, 000Ch int 31h

Now32bit: add sp, 8 ret Switch16bitTo32bit ENDP CODE32 ENDS

END

Additional query words: kbinf 6.00 6.10

Keywords: KB123688

-

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

© Microsoft Corporation. All rights reserved.