Решить проблему адресации сегментов поможет ассемблер. В одной из
своих частей программа на языке ассемблера должна определить
составляющие ее сегменты. Кроме того специальные команды сообщают
ассемблеру, какие сегменты с каким регистром связаны. Благодаря
этому ассемблер может, когда требуется, определить какой сегментный
префикс нужен в коде команды. Если программист задает ссылку, не
связанную с регистром DS, но доступную через другой сегментный
регистр, то ассемблер сам сформирует правильный префикс. Это
позволяет программисту работать непосредственно с данными и текстом
программы, оставив ассемблеру работу по осуществлению адресации.
Объявление сегментов позволяет ассемблеру следить за тем, какие
сегменты доступны через сегментные регистры и определять возможные
ошибки. Например, в программе могут появиться переменные, которые
недоступны из-за того, что на сегмент этой переменной не указывает
ни один из сегментных регистров. Ассемблер квалифицирует это как
Microsoft (R) Macro Assembler Version 5.00 1/1/80 03:53:05
Фиг. 3.9 Сегменты Page 1-1
PAGE ,132
TITLE Фиг. 3.9 Сегменты
0000 DATA SEGMENT
0000 01 VAR1 DB 1 ; Переменная в сегменте DATA
0001 DATA ENDS
0000 BUFFER SEGMENT
0000 02 VAR2 DB 2 ; Переменная в сегменте BUFFER
0001 BUFFER ENDS
0000 CODE SEGMENT
0000 03 VAR3 DB 3 ; Переменная в сегменте CODE
ASSUME CS:CODE, DS:DATA, ES:BUFFER
0001 FE 06 0000 R INC VAR1 ; Переменная из сегмента DATA
0005 26: FE 06 0000 R INC VAR2 ; Переменная из сегмента BUFFER
000A 2E: FE 06 0000 R INC VAR3 ; Переменная из сегмента CODE
000F CODE ENDS
END
Фиг. 3.9 Сегменты
ошибку. Она возникает из-за того, что в программе не обеспечена
адресуемость. Это ограничение, но лучше обнаружить ошибку при
ассемблировании, чем во время работы программы.
Оператор SEGMENT определяет все сегменты, давая каждому из них
имя. Программа на Фиг. 3.9 демонстрирует определение нескольких
сегментов. В качестве имени сегмента может использоваться любое
допустимое имя переменной. Утверждение SEGMENT сообщает ассемблеру,
что все следующие команды и данные во время выполнения программы
будут находиться в этом сегменте. Оператор ENDS указывает конец
текущего сегмента. В этом утверждении тоже указывается имя сегмен-
та. Каждому утверждению SEGMENT должно соответствовать утверждение
ENDS. В противном случае ассемблер запутается и выдаст сообщение об
ошибке.