ОРГ директива и действителното отместване

Отказ от отговорност за оттеглено съдържание на БЗ

Тази статия е написана за продукти, за които Microsoft вече не предлага поддръжка. Ето защо тази статия се предлага „както е“ и вече няма да бъде актуализирана.

Резюме

ОРГ Директива MASM не е задължително произвежда действителната изместване, която отговаря на изместване, определен от "Орг XXX". Например ако използвате "Орг 100h" във вашата програма, следният код ще невинаги започва 100h отместване спрямо началото на сегмента.


Когато използвате .COM източник файл и има само един модул, "Организационна 100h" ще доведе до действително изместване на 100 часа за код, който следва декларацията на организацията. Това поведение възниква и със сегменти с AT комбинирате тип (в този случай сегменти не са свързани с свързване и няма данни или код се определя).


Обаче ако имате множество модули и/или не сте справяне с .COM файла източник, "Организационна 100h" произвежда действителна отместване, което е малко над 100 часа.


Това поведение възниква, защото linker при тези обстоятелства ще направи някои подложка, вие нямате контрол над.

Допълнителна информация

На илюстрацията (който се занимава с източник модули по-долу), имайте предвид, че организацията инструкцията изменя местните изместване от 100h, което води до изместване на инструкцията за извличане в Пример2 е 100h (това е това, което той съобщавал в регистрационните файлове). Обаче при тези модули са свързани, всички части от код сегмент са свръхдълги. Така EXAMPLE2.asm:code:100h се превръща в код: 113 h. Редът на съединяване е последователността на свързване.


Следният пример илюстрира сценарий:

     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

Свойства

ИД на статията: 39441 – Последен преглед: 16.01.2017 г. – Редакция: 2

Обратна връзка