La directiva ORG y desplazamientos reales

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Resumen

La directiva ORG en MASM no genera necesariamente un desplazamiento real que coincida con el desplazamiento especificado por "ORG XXX". Por ejemplo, si utiliza "ORG 100h" en el programa, el código siguiente no siempre comenzará en el desplazamiento 100h en relación con el inicio del segmento.


Cuando está utilizando un archivo de origen .COM y hay sólo un módulo, la "ORG 100h" dará como resultado un desplazamiento real de 100h para el código que sigue a la instrucción de ORG. Este comportamiento también ocurre con segmentos con AT combinan (en cuyo caso no se combinan segmentos por el vinculador y no se define datos ni el código).


Sin embargo, si hay varios módulos o no es trabajar con un archivo de origen .COM, el "ORG 100h" produce un desplazamiento real, que es algo mayor que 100h.


Este comportamiento se produce porque el vinculador, en estas circunstancias, hará algunos relleno que no tiene ningún control sobre.

Más información

En la siguiente ilustración (que trata con los siguientes módulos de origen), tenga en cuenta que la instrucción ORG incrementa el local compensado por 100h, dando como resultado el desplazamiento de la instrucción de INSERCIÓN de ejemplo2 está 100h (que es lo que se informaría en el archivo de anuncio). Sin embargo, cuando estos módulos están vinculados, se concatenan todas las partes del código de segmento. Por lo tanto, EXAMPLE2.asm:code:100h se convierte en código: 113 h. El orden de concatenación es el orden de vinculación.


En el ejemplo siguiente se ilustra la situación:

     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

Propiedades

Id. de artículo: 39441 - Última revisión: 17-01-2017 - Revisión: 1

Comentarios