Q39441: The ORG Directive and Actual Offsets
Article: Q39441
Product(s): Microsoft Macro Assembler
Version(s): 5.1,5.1a,6.0,6.0a,6.0b
Operating System(s):
Keyword(s):
Last Modified: 06-MAY-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Macro Assembler (MASM), versions 5.1, 5.1a, 6.0, 6.0a, 6.0b
-------------------------------------------------------------------------------
SUMMARY
=======
The ORG directive in MASM does not necessarily produce an actual offset that
matches the offset specified by "ORG XXX". For example, if you use "ORG 100h" 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 "ORG
100h" 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 "ORG 100h" 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
|---------------testmain.asm: |---------------test1.asm:
code segment public 'code' PUBLIC _test
assume cs:code code segment public 'code'
assume cs:code
mov ax, 0a0ah _test proc
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
|---------------test2.asm:
code segment public 'code'
assume cs:code
org 100h
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 :
Technology : kbMASMsearch kbAudDeveloper kbMASM510 kbMASM600 kbMASM600a kbMASM510a kbMASM600b
Version : :5.1,5.1a,6.0,6.0a,6.0b
=============================================================================
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1986-2002.