La Directive de l’organisation et les décalages de réels

Exclusion de responsabilité du contenu obsolète de la base de connaissances

Cet article a été rédigé sur les produits pour lesquels Microsoft n’offre plus aucune prise en charge. Par conséquent, cet article est proposé « en l’état » et ne sera plus mis à jour.

Résumé

La directive ORG dans MASM ne produit pas nécessairement un décalage réel qui correspond à l’offset spécifié par « ORG XXX ». Par exemple, si vous utilisez « ORG 100h » dans votre programme, le code suivant pas toujours commencera à l’offset de 100h par rapport au début du segment.


Lorsque vous utilisez un fichier de source .COM et il n'existe qu’un seul module, le « ORG 100h » entraîne un décalage réel des 100h pour le code qui suit l’instruction de l’organisation. Ce comportement se produit également avec segments avec AT combinent (auquel cas segments ne sont pas regroupés par l’éditeur de liens, et aucune données ou le code est définie).


Cependant, si vous avez plusieurs modules ou vous n’êtes pas traiter un fichier de source .COM, le « ORG 100h » produit un décalage réel, ce qui est légèrement supérieur à 100h.


Ce problème se produit parce que l’éditeur de liens, dans ces circonstances, fera un remplissage qui vous n’avez aucun contrôle sur.

Plus d'informations

Dans l’illustration suivante (qui traitent les modules source ci-dessous), notez que l’instruction ORG incrémente local compensé par 100h, ce qui entraîne le décalage de l’instruction PUSH dans l’exemple 2 est 100h (c’est ce qu’il signale dans le fichier de la liste). Toutefois, lorsque ces modules sont liés, toutes les parties de code de segment sont concaténées. Par conséquent, EXAMPLE2.asm:code:100h est convertie dans le code : 113 h. L’ordre de concaténation est l’ordre de liaison.


L’exemple suivant illustre ce scénario :

     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

Propriétés

ID d'article : 39441 - Dernière mise à jour : 27 janv. 2017 - Révision : 1

Commentaires