Иллюстрированный самоучитель по Assembler

       

MP Безусловный переход


Команда jmp передает управление в указанную точку того же или другого программного сегмента. Адрес возврата не сохраняется. Команда не воздействует на флаги процессора.

Команда jmp имеет пять разновидностей:

- переход прямой короткий (в пределах -128... + 127 байтов);

- переход прямой ближний (в пределах текущего программного сегмента) ;

- переход прямой дальний (в другой программный сегмент);

- переход косвенный ближний;

- переход косвенный дальний.

Все разновидности переходов имеют одну и ту же мнемонику jmp, хотя и различающиеся коды операций. Во многих случаях транслятор может определить вид перехода по контексту, в тех же случаях, когда это невозможно, следует использовать атрибутные операторы:

short - прямой короткий переход;

near ptr - прямой ближний переход;



far ptr - прямой дальний переход;

word ptr - косвенный ближний переход;

dword ptr - косвенный дальний переход.

Примеры прямого короткого перехода

jmp short shpt ;Переход на метку shpt

;в пределах +127...-128 байтов

jmp shpt ;To же самое, если shpt

;находится выше по тексту программы

Примеры прямого ближнего перехода

jmp pt ;Переход на метку pt

;в пределах текущего сегмента

jmp near ptr pt ;To же самое

Примеры косвенных ближних переходов

Пример 1

mov BX,offset pt ;ВХ=адрес точки перехода

jmp BX ;Переход в точку pt

Пример 2

;В полях данных:

addr dw pt ;Ячейка с адресом точки перехода

;В программном сегменте:

jmp DS:addr ;Переход в точку pt

jmp word ptr addr ;To же самое

Пример 3

; В полях данных:

addr dw pt ;Ячейка с адресом точки перехода

;В программном сегменте:

mov DI,offset addr ;В1=адрес ячейки с адресом

;точки перехода

jmp [DI] ;Переход в точку pt

Пример 4

;В полях данных:

tbl dw ptl ;Ячейка с адресом 1

dw pt2 ;Ячейка с адресом 2

dw pt3 ;Ячейка с адресом 3

;В программном сегменте:

mov BX,offset tbl ;BX=aflpec таблицы адресов переходов

mov SI, 4 ;31=смещение к адресу pt3

call [BX][SI] ;Переход в точку pt3

Примеры прямых дальних переходов


jmp far ptr farpt ;Переход на метку farpt в

;другом программном сегменте

jmp farpt ;Переход на метку farpt в другом

;программном сегменте, если farpt

;объявлена дальней меткой

;директивой farpt label far

Примеры косвенных дальних переходов

Пример 1

; В полях данных:

addr dd pt ;Поле с двухсловным

;адресом точки перехода ;В программном сегменте:

jmp DS:addr ;Переход в точку pt

jmp dword ptr addr ;To же самое

Пример 2

; В полях данных:

addr dd pt ;Поле с двухсловным

;адресом точки перехода

;В программном сегменте:

mov DI,offset addr ;DI =адрес поля с адресом

;точки перехода jmp [DI] ;Переход в точку pt

Допустимо использование дополнительных режимов адресации 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 ;Регистр АН отображает

;состояние регистра флагов

or AH,80h ;Установка бита 7 = SF

sahf ;Загрузка АН в регистр

;флагов, где теперь SF = 1

Пример 2

lahf ;Регистр АН отображает

;состояние регистра флагов

and AH,0BFh ;Сброс бита 6 = ZF

sahf ;Загрузка АН в регистр

;флагов, где теперь ZF = О

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

; В полях данных:

addr dd myproc ;Двухсловный адрес процедуры

;myproc

;В программном сегменте:

Ids SI,addr ;DS:SI -> myproc

Пример 2

; В полях данных:

mem dw 25 ;Ячейка памяти с

; произвольным содержимым

addr dd myproc ;Двухсловный адрес этой

;ячейки

;В программном сегменте:

mov BX,offset addr ;ВХ=адрес ячейки addr

Ids DX, [BX] ;DХ=смещение ячейки mem,

;DS=сегментный адрес ячейки

;mem

Пример 3

; В полях данных:

dptr dd procl ;Полный адрес процедуры

; р г о с 1

dd proc2 ;Полный адрес процедуры

;ргос2

dd ргосЗ ;Полный адрес процедуры

; р г о с 3

;В программном сегменте:

mov SI, 8 ; Смещение к адресу ргосЗ

Ids DI,dptr[SI] ;DS:DI ® ргосЗ

Допустимо использование 32-разрядного регистра-приемника и 32-битового смещения в памяти, а также дополнительных режимов адресации 32-разрядных процессоров. В защищенном режиме вместо сегментного адреса сегмента выступает его селектор.

LEA Загрузка исполнительного адреса

Команда lea загружает в регистр, указанный в команде в качестве первого операнда, относительный адрес второго операнда (не значение операнда!). В качестве первого операнда следует указывать регистр общего назначения (не сегментный), в качестве второго - ячейку памяти. Команда

lea reg,mem



эквивалентна команде

mov reg,offset mem

но у первой команды больше возможностей описания адреса интересующей нас ячейки. Команда не воздействует на флаги процессора.

Пример 1

; В полях данных:

message db ; 'Идут измерения'

;В программном сегменте:

lea SI,message ;DS:SI -> message

Пример 2

; В полях данных:

nmb db '0123456789'

;В программном сегменте:

mov SI,7 ;Смещение символа '7'

lea DX,nmb[SI] ;ВХ=адрес символа '7'

Пример 3

; В полях данных:

nmb db '0123456789'

;В программном сегменте:

mov BX, off set msg

mov SI, 9 ;Смещение символа '9'

lea SI, [BX] [SI] ;31=адрес символа '9'

Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.


Содержание раздела