- •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. Замена типа
Тип переменной или метки может быть временно изменен с помощью директивы PTR, которая записывается в следующем формате:
Новый_тип PTR Адресное_выражение
В качестве параметра "Новый_тип" могут указываться имена стандартных типов: для переменных BYTE,WORD,DWORD, а для метокNEARиFAR. В результате адресное выражение приобретает новый тип, а его атрибуты "Сегмент" и "Смещение" не изменяются.
Директива PTRможет использоваться для обращения к составным частям переменных, что наиболее актуально для переменных типа DWORD.
Пример 3.25:
Скопировать в памяти переменную типаDWORD
Source DD? ;Источник данных
Dest DD? ;Приемник данных
; Обращения типа "Память" "Память" недопустимы,
; и копирование должно осуществляться через регистры МП
MOV AX, Source ;Ошибканесоответствие ;типов данных
MOV AX, WORDPTRSource ;Копирование младшего
MOV WORD PTRDest, AX ;слова
MOV AX, WORD PTRSource+2 ;Копирование старшего
MOV WORD PTRDest+2, AX ;слова
Очень часто директива PTRиспользуется для устранения неоднозначности при анонимных обращениях к памяти.
Пример 3.26:
Инкрементировать элемент массива байтов (слов), адресуемый регистром BX:
INC [BX] ;Ошибканеоднозначность инкрементируе-
;мого элемента: BYTEилиWORD?
INC BYTE PTR [BX] ; Инкрементирование байта
INC WORD PTR [BX] ; Инкрементирование слова
Замена типа метки осуществляется аналогично. Например, если сегмент программного кода содержит строку :
Begin:MOV CX, 100
то метка Begin имеет тип NEAR, что позволяет ссылаться на нее командам перехода JMP лишь из того же сегмента. Для ссылки на эту метку из других сегментов необходимо явно указывать тип переходаFARс помощью директивыPTRJMPFAR PTR Begin, что особенно актуально при ссылках вперед.
Использование директивы PTRдля частого обращения к переменным или меткам , имеющим как бы два различных типа, неудобно. Для исключения этого неудобства предусмотрена возможность связывания с одними и теми же ячейками памяти различных переменных или меток. Для этого служит директиваLABEL, записываемая в виде:
Имя LABELТип
В качестве параметра "Тип" для переменных могут использоваться BYTE,WORD,DWORD, а для метокNEARиFAR.
Часто директива LABELиспользуется для получения доступа к элементам данных различного размера из одной и той же области памяти.
Пример 3.27:
Обеспечить обращение к одной и той же зоне памяти как к области байтов и слов.
Для решения поставленной задачи описание этой области памяти должно иметь вид:
ArrByte LABELBYTE
ArrWord DW 200DUP(?)
Директива DWописывает область памяти как массив слов, присваивая ей имя ArrWord. ДирективаLABELтой же самой области памяти присваивает имя ArrByte, описывая ее как последовательность байтов.
При обращении к этой области памяти через имя ArrByte осуществляется доступ к байту, а при обращении через имя ArrWord к слову.
Пример 3.28:
MOV ArrByte[5], 0 ; Запись 0 в шестой байт области памяти
MOV ArrWord[5],0 ; Запись 0 в слово (шестой и седьмой
; байты) области памяти
С помощью директивы LABELможно для любой команды ввести метку с описанием ее типа.
Пример 3.29:
Begin LABELFAR;Введение метки
MOV CX, 100
Директива LABELсвязывает метку Begin типаFARс командой MOV. Это позволяет передавать управление на эту команду из других сегментов программного кода командой JMP Begin.