Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 1).doc
Скачиваний:
148
Добавлен:
08.03.2015
Размер:
435.2 Кб
Скачать

3.9. Замена атрибутов переменных и меток

После описания переменной или метки в программе все их атрибуты однозначно определены. При трансляции программы они используются по умолчанию для контроля и для формирования машинного кода соответствующих команд. При несоответствии атрибутов переменной или метки их использованию в команде фиксируется ошибка.

Пример3.22:

Var1 DW?

MOV AL, Var1 ; Ошибка несоответствия типов

При трансляции команды MOV будет зафиксирована ошибка несоответствия типов, так как переменную Var1 типа WORDнельзя загрузить в регистр AL типаBYTE.

При программировании на ассемблере часто требуется временно изменять атрибуты переменных или меток. В этом случае они указываются явно с помощью директив или конструкций ассемблера. При этом изменяться могут лишь атрибуты "Сегмент", "Смещение" и "Тип".

3.9.1. Замена смещения

Для изменения смещения используется конструкция, называемая адресным выражением. В общем случае адресное выражение записывается в следующем формате:

Имя_переменной (или Метки)  Константа_выражение

При этом атрибуты "Сегмент" и "Тип" адресного выражения не изменяются, а атрибут "Смещение" имеет новое значение, отличающееся на величину указанной константы.

Пример 3.23:

Пусть в программе описана некоторая переменная X, тогда:

SEG(X + 10) =SEGX

OFFSET (X + 10) =OFFSETX + 10

TYPE (X + 10) =TYPEX

Одиночные имена переменных или меток являются простейшими адресными выражениями.

3.9.2. Замена сегмента

При выполнении программы МП выбирает сегментный регистр для вычисления адреса текущего обращения к памяти в соответствии с используемым способом адресации данных или в соответствии с байтом префикса замены сегмента, предшествующего команде.

При разработке программы программист размещает данные в логических сегментах и с помощью директивы ASSUMEсвязывает их с сегментными регистрами, которые по умолчанию будут использоваться для их адресации. Однако, при необходимости можно отменить назначение по умолчанию и явно указать используемый сегментный регистр. Это осуществляется с помощью префикса замены сегмента, который записывается в виде имени сегментного регистра с последующим двоеточиемCS:, DS:, ES:и SS:.

Таким образом, в случае замены сегмента операнд команды записывается в виде:

Сегментный_регистр:Адресное_выражение

Эта конструкция порождает новый адрес, сегментным компонентом которого является указанный сегментный регистр. Если этот регистр не совпадает с сегментным регистром, выбираемым МП по умолчанию в соответствии с используемым способом адресации (см. подраздел 1.2.5), то при трансляции программы ассемблер формирует и помещает перед командой байт префикса замены сегмента (БПЗС). В противном случае БПЗС не формируется. Правила формирования БПЗС рассмотрим на примере.

Пример3.24:

Data1 SEGMENT;Описание данных

Var1 DB ?

Data1 ENDS

Data2 SEGMENT

Var2 DB?

Data2 ENDS

Code SEGMENT

ASSUMECS:Code, DS:Data1, ES:Data2

MOV DL, [BP] ;По умолчанию SS БПЗС

;не формируется

MOV DL, DS:[BP] ;Формируется БПЗС на DS

MOV DL, Var1 ;По умолчанию DS, совпадающий ;с указаниями ASSUMEБПЗС ;не формируется

MOV DL, Var2 ;По умолчанию DS, но из ASSUME;следует ESформируется ;БПЗС на ES

ASSUMEDS:NOTHING, ES:Data1

MOV DL, Var1 ;По умолчанию DS, но из ASSUME;следует ESформируется ;БПЗС на ES

MOV DL, DS:Var1 ;По умолчанию DSБПЗС не

;формируется

При явном указании сегментного регистра в описании операнда обращение к нему осуществляется и в случае, если логический сегмент, в котором он находится, не связан с этим регистром.

Префикс замены сегмента всегда относится только к одной команде.