3.12. Оператор Segment

Решить проблему адресации сегментов поможет ассемблер. В одной из своих частей программа на языке ассемблера должна определить составляющие еесегменты. Кроме того специальные команды сообщают ассемблеру, какие сегменты с каким регистром связаны. Благодаря этому ассемблер может, когда требуется, определить какой сегментный префикс нуженв коде команды. Если программист задает ссылку, не связанную с регистром DS, но доступную через другой сегментный регистр, то ассемблер сам сформирует правильный префикс. Это позволяет программисту работать непосредственно с данными и текстом программы, оставив ассемблеру работу по осуществлению адресации. Объявление сегментов позволяет ассемблеру следить за тем, какие сегменты доступны через сегментные регистры и определять возможные ошибки. Например, в программе могут появиться переменные, которые недоступны из-за того, что на сегмент этой переменной не указывает ни один из сегментных регистров. Ассемблер квалифицирует это как ошибку. Она возникает из-за того, что в программе не обеспечена адресуемость.Это ограничение, но лучше обнаружить ошибку при ассемблировании, чем во время работы программы. Оператор SEGMENT определяет все сегменты, давая каждому из них имя. Программа на Фиг. 3.9 демонстрирует определение нескольких сегментов.


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 сообщает ассемблеру, что все следующие команды и данные во время выполнения программы будут находиться в этом сегменте. Оператор ENDS указывает конец текущего сегмента. В этом утверждении тоже указывается имя сегмента. Каждому утверждению SEGMENT должно соответствовать утверждение ENDS. В противном случае ассемблер запутается и выдаст сообщение об ошибке.