Я читаю некоторую сборку для MASM, и мне трудно понять цель директивы сегмента. Чем он отличается от меток при вычислении адреса при сборке? Предположим, что директива формы - это просто name segment at addr
, меня не особо интересуют другие ее параметры. Что такое
BootSeg segment at 0x7c0
BootSeg end
Хорошо, если внутри ничего нет?
Какую ценность вы имели бы в топоре, если бы сделали:
mov ax, BootSeg
?
1 ответ
Директива segment
в некотором роде универсальна.
Первое использование - объединение вещей в сегменты.
Второе использование - это правильная ссылка (= вычисление адреса) объектов в различных сегментах. В зависимости от сегмента объекта, к которому осуществляется доступ в вашем коде, ассемблер может вставить соответствующие segment override prefixes
(es:
, ss:
, cs:
, fs:
, gs:
) в сгенерированный код. Точно так же при вызове procedure
из другого сегмента кода ассемблер может сгенерировать инструкцию far call
вместо near call
. AFAIR, для этого вам действительно нужно пометить сам procedure
как far
(и это также превратит все простые rets
в far rets
в подпрограмме).
Сегменты затем обрабатываются компоновщиком и превращаются в информацию о перемещении, которую потребляет ОС.
Зачем нам эти сегменты? Потому что они есть в ЦП, и мы не всегда можем игнорировать их существование. Существуют программы DOS .COM, которые помещают свой код, данные и стек в один сегмент, и в этом случае программа не должна усложняться понятием сегментов (за исключением тех случаев, когда ей нужен доступ к некоторому «чужому» коду / данные, а не из собственного сегмента).
И да, вещь AT
в основном накладывает один объект на другой. Таким образом, mov ax, BootSeg
должен дать вам ax
= 0x7c0, как и с любым другим сегментом, за исключением того, что этот сегмент известен во время "компиляции".
Воспользуйтесь отладчиком, поэкспериментируйте.
Похожие вопросы
Связанные вопросы
Новые вопросы
assembly
Вопросы по языку ассемблера. Отметьте процессор и/или набор инструкций, которые вы используете, а также ассемблер, допустимый набор должен быть таким: ([assembly] [x86] [gnu-assembler] или [att]). Вместо этого используйте тег [.net-assembly] для сборок .NET, [cil] для языка ассемблера .NET и вместо байт-кода Java используйте тег java-bytecode-asm.
mov ax, BootSeg
. Явный адрес сегмента (вместе с директивойORG
) обычно используется для таблицы векторов прерываний, области данных BIOS, видеопамяти и т. Д., Где фактические данные не поступают из двоичного файла. Это похоже на шаблон структуры данных, привязанный к определенному сегменту памяти.EQU
предназначен для объявления констант, а не только для метки. Регистрax
будет07C0h
, как указано в директивеSEGMENT AT
.