Microsoft KB Archive/39441

= The ORG Directive and Actual Offsets =

Article ID: 39441

Article Last Modified on 10/29/2003

-

APPLIES TO


 * Microsoft Macro Assembler 5.1 Standard Edition
 * Microsoft Macro Assembler 5.1a
 * Microsoft Macro Assembler 6.0 Standard Edition
 * Microsoft Macro Assembler 6.0a
 * Microsoft Macro Assembler 6.0b

-



This article was previously published under Q39441



SUMMARY
The ORG directive in MASM does not necessarily produce an actual offset that matches the offset specified by &quot;ORG XXX&quot;. For example, if you use &quot;ORG 100h&quot; in your program, the following code will not always begin at the 100h offset relative to the start of the segment.

When you are using a .COM source file and there is only one module, the &quot;ORG 100h&quot; will result in an actual offset of 100h for the code that follows the ORG statement. This behavior also occurs with segments with AT combine type (in which case segments are not combined by the linker, and no data or code is defined).

However, if you have multiple modules and/or you are not dealing with a .COM source file, the &quot;ORG 100h&quot; produces an actual offset, which is somewhat greater than 100h.

This behavior occurs because the linker, in these circumstances, will do some padding that you have no control over.



MORE INFORMATION
In the following illustration (which deals with the source modules below), note that the ORG instruction increments the local offset by 100h, resulting in the offset of the PUSH instruction in example2 being 100h (that's what it would report in the listing file). However, when these modules are linked, all the portions of segment code are concatenated. Thus, EXAMPLE2.asm:code:100h is converted into code:113h. The order of concatenation is the order of linking.

The following example illustrates the scenario: Actual                     Offset offset                     from start from                       of segment code                       code in module ---                    ---             +-+     0117    |   ret           | 0105 0116   |   pop           | 0103    test2.asm 0114   |   mov           | 0101 0113   |   push          | 0100 0013   |   org           | 0000 +-+    0012    |   ret           | 0004 0011   |   pop           | 0003    test1.asm 000F   |   mov           | 0001 000E   |   push          | 0000 +-+    000C    |   int           | 000C 0009   |   mov           | 0009    testmain.asm 0006   |   call          | 0006 0003   |   call          | 0003 0000   |   mov           | 0000 +-+                segment code

code segment public 'code'          PUBLIC _test assume cs:code                      code segment public 'code' assume cs:code mov    ax, 0a0ah            _test proc
 * ---testmain.asm:      |---test1.asm:

extrn  _test:proc               push    bp          extrn   _test2:proc              mov     bp, sp

call   _test                    pop     bp          call    _test2                   ret

mov    ax, 4c00h            _test   ENDP int    21h                  code ends code ends

END                         END

code segment public 'code' assume cs:code org    100h
 * ---test2.asm:

PUBLIC _test2 _test2   PROC

push   bp           mov     bp, sp

pop    bp           ret

_test2   ENDP code ends END

Additional query words: kbinf 5.10 5.10a 6.00 6.00a 6.00b

Keywords: KB39441

-

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

© Microsoft Corporation. All rights reserved.