Как (локальная) метка может заканчиваться вне своего собственного сегмента (TASM 8086)? - PullRequest
1 голос
/ 11 февраля 2020

Мой профессор часто использует этот шаблон написания своего кода, где задействован DS.

ASSUME CS:CODE,DS:DATA

DATA SEGMENT
[...]
DATA ENDS

CODE SEGMENT
START:
[...]
CODE ENDS
END START
END

В соответствии с его концепцией, мы делаем это так, чтобы ассемблер проверял сегмент данных. Но я не могу согласиться с этим без правильного объяснения ...

Как метка заканчивается вне сегмента?

Почему ассемблер не может проверить DS без него?

Отличаются ли метки в сборке?

1 Ответ

3 голосов
/ 12 февраля 2020

END START не является «концом» метки start. Сами ярлыки не имеют ни концов, ни длин, ни границ. (Для этого используйте proc foo / endproc, если только это не MASM, а не TASM).

END START - это конец всего файла asm (после этого синтаксический анализ прекращается). END label также устанавливает точку входа = указанную метку . Это странное имя для директивы с этой целью, но TASM очень старый.

(Ассемблер может поместить метаданные в файл .obj, чтобы сообщить компоновщику имя символа точки входа, если ассемблер не ' .exe.


Думайте о метках как о тегах нулевой ширины, на которые вы можете ссылаться откуда угодно, не более.

Если у вас есть блок кода для функцию, которую вы хотите вызвать, вы прикрепляете метку прямо перед ней, чтобы вы могли call до этой точки. Машинный код для этой функции имеет некоторый размер, но метка - нет; это просто маркировка начала блока. (Таким образом, метка всегда имеет ровно 1 адрес.)

...