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

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с помощью директивыPTRJMPFAR 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.