- •3.11.1 Команды пересылки данных
- •Команды пересылки общего назначения
- •Xchg приемник, источник
- •Команды загрузки адресных значений
- •Команды обращения к стеку
- •Команды пересылки флагов
- •Команды ввода/вывода
- •In аккумулятор, порт
- •In аккумулятор, dx.
- •3.11.2. Арифметические команды
- •Типы арифметических данных
- •Команды инкрементирования и декрементирования
- •Inc приемник
- •Команды сложения и вычитания
- •Команды расширения знака
- •Команды умножения и деления
- •Imul источник.
- •Команды десятичной коррекции
- •Сложение в bdc-формате
- •Вычитание в bcd-формате
- •Сложение в ascii-формате
- •Вычитание в ascii-формате
- •Умножение в ascii-формате
- •Деление в ascii-формате
- •3.11.3 Логические команды
- •Команды логических операций
- •Команды сравнения
- •Команды сдвигов
- •Команды логических сдвигов
- •Команды арифметических сдвигов
- •Команды циклических сдвигов
- •3.11.4. Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды перехода по состоянию арифметических флагов
- •Команды перехода по соотношению между числами
- •Команды перехода по состоянию регистра cx
- •Команды управления циклами
- •Команды для организации подпрограмм
- •Команды прерываний
- •3.11.5. Команды обработки строк
- •Строковые примитивы
Команды загрузки адресных значений
К этой подгруппе относятся команды 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.