Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 163

Unknown Author

COMMON-сегменты используются тогда, когда одни и те же ячейки памяти желательно именовать по-разному в разных модулях программы. Например, в программе, в состав которой входят следующие модули:

;модуль Ml    ;модуль М2

S ENDS    S    ENDS

на оба сегмента S будет отведено 5 байтов, причем первый из этих байтов - это одновременно и байт А (с точки зрения модуля Ml), и байт X (с точки зрения модуля М2), второй байт - это начало двойного слова В в модуле Ml и переменная Y в модуле М2, а оставшиеся три байта - продолжение переменной В (для модуля Ml). При этом, если в приказе LINK модуль М2 был указан после модуля Ml, в первом байте результирующего сегмента окажется число 3, значение второго байта будет неопределенным, а остальные три байга будут нулевыми.

12JJ. Параметр Ивыравннванием

Как мы уже видели, при объединении сегментов типа PUBLIC или STACK может образоваться зазор между сегментами. Если для необъединяемых сегментов такой пропуск необходим (независимый сегмент должен начинаться с адреса, кратного 16, чтобы на его начало можно было установить сегментный регистр), то для объединенных сегментов этот зазор - лишь потеря памяти. Поэтому в ЯА предусмотрено средство, позволяющее, уничтожать такие зазоры, а точнее - регулировать начало размещения сегментов в памяти. Этим средством является параметр "выравнивание” директивы SEGMENT: он указывает, с адреса какой кратности должен начинаться сегмент. Возможные значения данного параметра и соответствующие им начальные адреса сегментов таковы:

BYTE    -    ближайший    свободный адрес;

WORD    -    ближайший    адрес,    кратный    2;

PARA    -    ближайший    адрес,    кратный    16 (параграф);

PAGE    -    ближайший    адрес,    кратный    256 (страница).

Например, в программе, содержащей следующие модули:

;модуль Ml    ;модуль    М2

A SEGMENT PUBLIC 'Q'    A SEGMENT BYTE PUBLIC 'Q'

X DW ?    Z DW ?

Y DB ?    A ENDS

A ENDS будет образован единый сегмент А:

A SEGMENT X DW ?

Y DB ?

Z DW ?

A ENDS

причем содержимое сегмента А из модуля М2 будет без пропуска подсоединено к предложениям сегмента А из модуля Ml, поэтому смещение имени Z будет равно 3, а не 10h, как было в примере из разд. 12.3.2.

Отметим, что если в директиве SEGMENT параметр "выравнивание" опущен, то по умолчанию берется значение PARA. Именно по этой причине у нас до сих пор все сегменты начинались с адресов, кратных 16.

ВВОД-ВЫВОД. ПРЕРЫВАНИЯ

Цель данной главы - рассмотреть, как в ПК осуществляется ввод-вывод и как можно реализовать те операции ввода-вывода (INCH, OUTINT и т. п.), которыми мы пользовались в предыдущей части книги.

13.1. Команды ввода-вывода

Все устройства ЭВМ принято делить на внутренние и внешние. Внутренние устройства - это центральный процессор (ЦП) и оперативная память, а внешние -все остальные устройства (внешняя память, клавиатура, дисплей, принтер и т. д.). В широком смысле, под вводом-выводом понимается обмен информацией между ЦП и любым внешним устройством. При этом "отсчет" ведется от ЦП: ввод - это передача данных в ЦП из внешнего устройства, а вывод - передача данных из ЦП во внешнее устройство.