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

Команды загрузки адресных значений

К этой подгруппе относятся команды LEA, LDS и LES.

Команда загрузки исполнительного адреса LEA имеет формат:

LEA регистр16, память

и загружает в указанный 16-битный регистр адрес (смещение offset) указанной ячейки памяти, адресуемой любым способом.

Во многих случаях команда LEA идентична команде MOV с директивой OFFSET. Однако, следует помнить, что при использовании директивы OFFSET адрес вычисляется и должен быть известен на этапе трансляции программы, а при использовании команды LEA при ее выполнении. Следовательно, при обращении к индексированной переменной с регистровым индексом (например, Tabl[SI]), неизвестным при трансляции, команда LEA правильно сформирует адрес элемента данных, а команда MOV OFFSET  неправильно. Директива OFFSET в подобных условиях возвращает адрес переменной без учета индекса, что приводит к возникновению ошибки, необнаруживаемой в процессе трансляции программы.

Пример 3.49:

Пусть имеется сегмент данных:

Data SEGMENT

DB 10 DUP(?)

Tabl DB 20h, 21h, 22h, 23h, 24h, 25h

Data ENDS

Тогда при обращениях к таблице Tabl, получим:

LEA BX, Tabl ;Идентично MOV BX, OFFSET Tabl

MOV AL, [BX] ;(AL)=20h

LEA BX, Tabl[4] ;Идентично MOV BX, OFFSET Tabl[4]

MOV AL, [BX] ;(AL)=24h

MOV SI, 3

LEA BX, Tabl[SI] ;Корректно

MOV AL, [BX] ;(AL)=23h

MOV BX, OFFSET Tabl[SI];Необнаруживаемая ошибка MOV AL, [BX] ;Ошибка – (AL)=20h

Команды загрузки полных адресных значений LDS и LES имеют формат:

LDS регистр16, память32

LES регистр16, память32

и осуществляют загрузку двойного слова из ячейки памяти, адресуемой любым способом, в соответствующий сегментный регистр и указанный 16-битный регистр. При этом младшее слово, расположенное по адресу "память32", загружается в 16-битный регистр, а старшее слово, считываемое по адресу "память32+2", командой LDS загружается в регистр DS, а командой LES - в регистр ES. В соответствии с этим младшее слово области "память32" должно содержать смещение offset, а старшее слово - сегментную компоненту segment выбираемой переменной. Так как команды LDS и LES загружают полный логический адрес, то программа может сразу обращаться к объекту, на который указывает этот адрес.

Обычно буфера адресных указателей инициализируются на требуемые значения директивой DD при трансляции программы. При необходимости они могут переопределяться двумя командами MOV с директивами SEG и OFFSET. Это приемлемо, так как программа читает адресные указатели гораздо чаще, чем изменяет их.

Команды LDS и LES наиболее часто используются для инициализации регистров при обработке строк.

Пример 3.50:

Скопировать элемент одной строки в две других строки:

String1 DB 80 DUP(?) ;Описание строк

String2 DB 80 DUP(?)

String3 DB 80 DUP(?)

BuffSrc DD String1 ;Инициализация адресного буфера

;источника на String1

BuffDst DD String2 ;Инициализация адресного буфера

;приемника на String2

;. . . . . . . . . . . . . . . . . . . . . . . . .

LDS SI,BuffSrc ;Инициализация DS:SI на строку-источник

LES DI,BuffDst ;Инициализация ES:DI на строку-приемник

MOV AL,[SI] ;Копирование элемента

MOV ES:[DI],AL ;String1 в String2

;. . . . . . . . . . . . . . . . . . . . . . . . .

MOV AX,OFFSET String3 ;Переопределение адресного указателя

MOV WORD PTR BuffDst,AX ;приемника на String3

MOV AX,SEG String3

MOV WORD PTR BuffDst+2,AX

;. . . . . . . . . . . . . . . . . . . . . . . . .

LDS SI,BuffSrc ;Инициализация DS:SI на строку- источник

LES DI,BuffDst ;Инициализация ES:DI на строку- приемник

MOV AL,[SI] ;Копирование элемента

MOV ES:[DI],AL ;String1 в String3.