MP Безусловный переход
Команда jmp передает управление в указанную точку того же или другого программного
сегмента. Адрес возврата не сохраняется. Команда не воздействует на флаги процессора.
Команда jmp имеет пять разновидностей:
- переход прямой короткий (в пределах -128... + 127 байтов);
- переход прямой ближний (в пределах текущего программного сегмента) ;
- переход прямой дальний (в другой программный сегмент);
- переход косвенный ближний;
- переход косвенный дальний.
Все разновидности переходов имеют одну и ту же мнемонику
jmp, хотя и различающиеся
коды операций. Во многих случаях транслятор может определить вид перехода по
контексту, в тех же случаях, когда это невозможно, следует использовать атрибутные
операторы:
short - прямой короткий переход;near ptr - прямой ближний переход;
far ptr - прямой дальний переход;
word ptr - косвенный ближний переход;
dword ptr - косвенный дальний переход.
Примеры прямого короткого перехода
jmp short shpt ;Переход на метку shpt
Примеры прямого ближнего перехода
jmp pt ;Переход на метку pt
Примеры косвенных ближних переходов
Пример 1
mov BX,offset pt ;ВХ=адрес точки перехода
Пример 2
;В полях данных:
Пример 3
; В полях данных:
Пример 4
;В полях данных:
Примеры прямых дальних переходов
jmp far ptr farpt ;Переход на метку farpt в
Примеры косвенных дальних переходов
Пример 1
; В полях данных:
Пример 2
; В полях данных:
Допустимо использование дополнительных режимов адресации 32-разрядных процессоров. Для 32-разрядных приложений допустимо использование 32-битовых операндов. В защищенном режиме вместо сегментного адреса сегмента (при дальних переходах) выступает его селектор.
LAHF Загрузка флагов в регистр АН
Команда lahf копирует флаги SF, ZF, AF, PF и CF соответственно в разряды 7,
6, 4, 2 и 0 регистра АН. Значение битов 5, 3 и 1 регистра АН не определено.
Команда не имеет параметров и не изменяет флаги процессора.
Команда lahf (совместно с командой sahf) дает возможность читать и изменять
значения флагов процессора, в том числе флагов
SF, ZF, AF и PF, которые нельзя
изменить непосредственно. Однако следует иметь в виду, что команда lahf переносит
в АН только младший байт регистра флагов. Поэтому нельзя изменить с ее помощью,
например, состояние флага OF.
Пример 1
lahf ;Регистр АН отображает
Пример 2
lahf ;Регистр АН отображает
386Р+ LAR Загрузка прав доступа
Команда lar загружает в первый операнд (16- или 32-разрядный регистр) поле атрибутов
сегмента из дескриптора сегмента, заданного селектором во втором операнде. В
качестве операнда с селектором может использоваться 16- или 32-разрядный регистр
или ячейка памяти. В операнд-приемник поступают два байта атрибутов селектора
с замаскированным полем старших битов границы сегмента.
LDS Загрузка указателя с использованием регистра DS
Команда Ids считывает из памяти по указанному адресу двойное слово (32 бит),
содержащее указатель (полный адрес некоторой ячейки), и загружает младшую половину
указателя (т.е. относительный адрес) в указанный в команде регистр, а старшую
половину указателя (т.е. сегментный адрес) в регистр
DS. Таким образом, команда
Ids reg, mem
эквивалентна следующей группе команд:
mov reg,word ptr mem
mov DS,word ptr mem+2
В качестве первого операнда команды Ids указывается регистр общего назначения; в качестве второго - ячейка памяти с двухсловным содержимым. Указатель, содержащийся в этой ячейке, может быть адресом как процедуры, так и поля данных. Команда не воздействует на флаги процессора.
Пример 1
; В полях данных:
Пример 2
; В полях данных:
Пример 3
Допустимо использование 32-разрядного регистра-приемника и 32-битового смещения в памяти, а также дополнительных режимов адресации 32-разрядных процессоров. В защищенном режиме вместо сегментного адреса сегмента выступает его селектор.
LEA Загрузка исполнительного адреса
Команда lea загружает в регистр, указанный в команде в качестве первого операнда,
относительный адрес второго операнда (не значение операнда!). В качестве первого
операнда следует указывать регистр общего назначения (не сегментный), в качестве
второго - ячейку памяти. Команда
lea reg,mem
эквивалентна команде
mov reg,offset mem
но у первой команды больше возможностей описания адреса интересующей нас ячейки. Команда не воздействует на флаги процессора.
Пример 1
; В полях данных:
Пример 2
; В полях данных:
Пример 3
; В полях данных:
nmb db '0123456789'
;В программном сегменте:
mov BX, off set msg
mov SI, 9 ;Смещение символа '9'
lea SI, [BX] [SI] ;31=адрес символа '9'
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.