|
Решить проблемуадресации сегментов поможет ассемблер.В одной из
своихчастейпрограмманаязыкеассемблерадолжнаопределить
составляющие еесегменты. Кроме тогоспециальные команды сообщают
ассемблеру,какие сегментыс
какимрегистром связаны.Благодаря
этому ассемблер может, когда требуется,
определить какой сегментный
префикс нуженв коде команды.Если
программист задаетссылку, не
связаннуюс регистромDS,нодоступную черездругой
сегментный
регистр,тоассемблерсамсформируетправильныйпрефикс.Это
позволяет программисту работать
непосредственно с данными и текстом
программы, оставив ассемблеру работу по
осуществлению адресации.
Объявление сегментов позволяет ассемблеру
следить за тем, какие
сегменты доступны через сегментныерегистры и определять возможные
ошибки. Например,в программе могутпоявиться переменные, которые
недоступны из-за того, что насегмент этой переменной не указывает
ни одиниз сегментных регистров.Ассемблер квалифицирует этокак
Microsoft (R) Macro Assembler Version 5.001/1/80 03:53:05
Фиг. 3.9СегментыPage 1-1
PAGE,132
TITLEФиг. 3.9Сегменты
0000DATASEGMENT
000001VAR1DB1; Переменная в сегменте DATA
0001DATAENDS
0000BUFFERSEGMENT
000002VAR2DB2; Переменная в сегменте BUFFER
0001BUFFERENDS
0000CODESEGMENT
000003VAR3DB3; Переменная в сегменте CODE
ASSUMECS:CODE, DS:DATA, ES:BUFFER
0001FE 06 0000 R INCVAR1;
Переменная из сегмента DATA
000526: FE 06 0000 RINCVAR2;
Переменная из сегмента BUFFER
000A2E: FE 06 0000 RINCVAR3;
Переменная из сегмента CODE
000FCODEENDS
END
Фиг. 3.9 Сегменты
ошибку.Она возникаетиз-за того,что впрограмме
не обеспечена
адресуемость.Этоограничение,нолучшеобнаружитьошибку при
ассемблировании, чем во время работы
программы.
Оператор SEGMENT определяет всесегменты, давая каждому из них
имя.Программа наФиг. 3.9демонстрирует определениенескольких
сегментов.В
качествеимени сегментаможет использоватьсялюбое
допустимое имя переменной. Утверждение
SEGMENT сообщает ассемблеру,
чтовсе следующиекоманды и данные во
времявыполнения программы
будутнаходиться вэтом сегменте.Оператор ENDSуказывает конец
текущего сегмента. В этомутверждении тоже указывается имя сегмен-
та. Каждому утверждениюSEGMENT должно соответствовать утверждение
ENDS. В противном случае ассемблер
запутается и выдаст сообщение об
ошибке.
|