- •3.Программирование на языке ассемблера
- •3.1. Архитектура микропроцессоров k1810вм86/k1810вм88
- •3.2. Основные элементы ассемблера. Формат программной строки
- •3.3. Директивы управления сегментами
- •3.4. Типовая структура текста программы
- •3.5. Символические имена
- •3.6. Константы. Их типы и директивы описания
- •3.6.1. Числовые константы
- •3.6.2. Символьные константы
- •3.6.3. Поименованные константы
- •3.6.4. Константы-выражения
- •3.7. Переменные. Их типы и директивы описания
- •3.7.1. Стандартные типы данных и их размещение в памяти
- •3.7.2. Директивы описания переменных и распределения памяти
- •3.8. Атрибуты переменных и меток. Директивы, возвращающие атрибутные значения
- •3.8.1. Атрибуты переменных
- •3.8.2. Атрибуты меток
- •3.9. Замена атрибутов переменных и меток
- •3.9.1. Замена смещения
- •3.9.2. Замена сегмента
- •3.9.3. Замена типа
- •3.10. Способы адресации операндов
- •3.10.1. Адресация данных
- •Регистровая адресация
- •Непосредственная адресация
- •Прямая адресация
- •Косвенная регистровая адресация
- •Базовая адресация
- •Индексная адресация
- •Базово-индексная адресация
- •Относительная базовоиндексная адресация
- •3.10.2. Адресация переходов
- •Внутрисегментный прямой переход
- •Внутрисегментный косвенный переход
- •Межсегментный прямой переход
- •Межсегментный косвенный переход
- •3.11. Система команд
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БПЗС не
;формируется
При явном указании сегментного регистра в описании операнда обращение к нему осуществляется и в случае, если логический сегмент, в котором он находится, не связан с этим регистром.
Префикс замены сегмента всегда относится только к одной команде.