Похоже, что разработчики намеревались использовать макрос I_AM
, чтобы сделать символы (указывающие на BYTE, WORD и DWORD) общедоступными для других модулей. Проблема в том, что макрос I_AM
не позволяет указывать данные, он оставляет их неинициализированными как ?
. Чтобы обойти это, разработчики решили создать резервную копию счетчика программы, чтобы перезаписать неинициализированные данные, чтобы они могли заполнить их значением WORD 80h и вторым неинициализированным WORD (?
).
Вы не можете использовать выражения с org
, который является отрицательным. Вы не можете создать резервную копию счетчика программы:
org -4
Вам нужно абсолютное значение. Вам нужно знать, как далеко находится счетчик программ от начала сегмента. Они решили сделать это, установив CONSTRT
вверху с помощью:
CONSTANTS SEGMENT BYTE PUBLIC 'CONST'
EXTRN international_table:BYTE
EXTRN Current_Country:WORD
ORG 0
CONSTRT EQU $ ; Start of constants segment
В этом случае CONSTRT
присваивается значение 0 (начало сегмента). $
- текущий счетчик программы относительно начала сегмента.
Чтобы определить абсолютное значение счетчика текущей программы на 4 байта раньше, вы можете взять счетчик текущей программы $
и вычесть его из счетчика программы в начале сегмента (для которого установлено значение CONSTRT
). Как только вы знаете, как далеко вы находитесь от начала сегмента, вы вычитаете 4.
Что мы имеем тогда:
I_AM DMAADD,DWORD ; User's disk transfer address
; (disp/seg)
Это определяет общедоступную метку, которая определяется как указывающая на неинициализированное значение DWORD. Это создает резервную копию счетчика программы на 4 для замены неинициализированного DWORD:
ORG $-CONSTRT-4
Затем выдается значение WORD 80h, за которым следует неинициализированное значение WORD:
DW 80H
DW ?
Вы могли бы заменить макрос I_AM
, резервное копирование указателя и заменить данные на:
public DMAADD
DMAADD dd 80h
Возможно, разработчики DOS всегда экспортировали метки, указывающие на данные BYTE, WORD, DWORD через макрос I_AM
, как требование кодирования в Microsoft. Это полностью умозрительно. Возможно, они чувствовали, что общий макрос позволит им изменить метод экспорта таких данных без изменения кода в бесчисленных местах.