Знакомство с порядком описания команд и принятыми обозначениями 6 страница



JMP

(JuMP)

Переход безусловный

 

Схема команды: jmp метка

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

Синтаксис

Алгоритм работы:

Команда jmp в зависимости от типа своего операнда изменяет содержимое либо только одного регистра eip, либо обоих регистров cs и eip:

  • если операнд в команде jmp — метка в текущем сегменте команд (a8, 16, 32), то ассемблер формирует машинную команду, операнд которой является значением со знаком, являющимся смещением перехода относительно следующей за jmp команды. При этом виде перехода изменяется только регистр eip/ip;
  • если операнд в команде jmp — символический идентификатор ячейки памяти (m16, 32, 48), то ассемблер предполагает, что в ней находится адрес, по которому необходимо передать управление. Этот адрес может быть трех видов:
    • значением абсолютного смещения метки перехода относительно начала сегмента кода. Размер этого смещения может быть 16 или 32 бит в зависимости от режима адресации;
    • дальним указателем на метку перехода в реальном и защищенном режимах, содержащим два компонента адреса — сегментный и смещение. Размеры этих компонентов также зависят от установленного режима адресации (use16 или use32). Если текущим режимом является use16, то адрес сегмента и смещение занимают по 16 бит, причем смещение располагается в младшем слове двойного слова, отводимого под этот полный адрес метки перехода. Если текущим режимом является use32, то адрес сегмента и смещение занимают, соответственно, 16 и 32 бит, — в младшем двойном слове находится смещение, в старшем — адрес сегмента;
    • адресом в одном из 16 или 32-разрядных регистров — этот адрес представляет собой абсолютное смещение метки, на которую необходимо передать управление, относительно начала сегмента команд.

Для понимания различий механизмов перехода в реальном и защищенном режимах нужно помнить следующее. В реальном режиме микропроцессор просто изменяет cs и eip/ip в соответствии с содержимым указателя в памяти. В защищенном режиме микропроцессор предварительно анализирует байт прав доступа AR в дескрипторе, номер которого определяется по содержимому сегментной части указателя. В зависимости от состояния байта AR микропроцессор выполняет либо переход, либо переключение задач.

Состояние флагов после выполнения команды (за исключением случая переключения задач):

выполнение команды не влияет на флаги

Применение:

Команду jmp применяют для осуществления ближних и дальних безусловных переходов без сохранения контекста точки перехода.

См. также: урок 10, команды call, jcc

LAHF

(Load AH register from register Flags)

Загрузка регистра AH флагами из регистра eFlags/Flags

 

Схема команды: lahf

Назначение: извлечение содержимого младшего байта регистра eflags/flags, в котором содержатся пять флагов: cf, pf, af, zf и sf.

Синтаксис

Алгоритм работы:

команда загружает регистр ah содержимым младшего байта регистра eflags/flags. Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Из-за того, что регистр флагов непосредственно недоступен, команду lahf можно применять для анализа и последующего изменения командой sahf состояния некоторых флагов регистра eflags/flags.

;сбросить в ноль флаг cf lahf and ah,11111110b sahf

См. также: команду sahf

LDS/LES/LFS/LGS/LSS

(Load pointer into ds/es/fs/gs/ss segment register)

Загрузка сегментного регистра ds/es/fs/gs/ss указателем из памяти

 

Схема команды: lds приемник,источник les приемник,источник lfs приемник,источник lgs приемник,источник lss приемник,источник

Назначение: получение полного указателя в виде сегментной составляющей и смещения.

Синтаксис

Алгоритм работы:

Алгоритм работы команды зависит от действующего режима адресации (use16 или use32):

  • если use16, то загрузить первые два байта из ячейки памяти источник в 16-разрядный регистр, указанный операндом приемник. Следующие два байта в области источник должны содержать сегментную составляющую некоторого адреса; они загружаются в регистр ds/es/fs/gs/ss;
  • если use32, то загрузить первые четыре байта из ячейки памяти источник в 32-разрядный регистр, указанный операндом приемник. Следующие два байта в области источник должны содержать сегментную составляющую, или селектор, некоторого адреса; они загружаются в регистр ds/es/fs/gs/ss.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Таким образом, с помощью данных команд в паре регистров ds/es/fs/gs/ss и приемник оказывается полный адрес некоторой ячейки памяти. Это обстоятельство можно использовать, к примеру, при работе с цепочечными командами, где существуют жесткие соглашения на размещение адресов обрабатываемых строк. Помните, что любая загрузка сегментного регистра приводит к обновлению соответствующего теневого регистра (см. урок 16). Смотрите также описание команды cmps с примером использования.

См. также: уроки 5, 7, 11, команды lea и операторы ассемблера seg и offset

LEA

(Load Effective Address)

Загрузка эффективного адреса

 

Схема команды: lea приемник,источник

Назначение: получение эффективного адреса (смещения) источника.

Синтаксис

Алгоритм работы:

алгоритм работы команды зависит от действующего режима адресации (use16 или use32):

  • если use16, то в регистр приемник загружается 16-битное значение смещения операнда источник;
  • если use32, то в регистр приемник загружается 32-битное значение смещения операнда источник.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Данная команда является альтернативой оператору ассемблера offset. В отличие от offset команда lea допускает индексацию операнда, что позволяет более гибко организовать адресацию операндов.

;загрузить в регистр bx адрес пятогоэлемента массива mas.datamas db 10 dup (0).code... mov di,4 lea bx,mas[di];или lea bx,mas[4];или lea bx,mas+4

См . также : уроки 5, 7, 11 и команды lea, lds, les, lss, lgs, lfs, операторы ассемблера seg и offset

LEAVE

(LEAVE from procedure)

Выход из процедуры

 

Схема команды: leave

Назначение: удаление из стека области локальных (динамических) переменных, выделенной командой enter.

Синтаксис

Алгоритм работы:

команда выполняет обратные команде enter действия:

  • содержимое ebp/bp копируется в esp/sp, тем самым восстанавливается значение esp/sp, которое было до вызова данной процедуры. С другой стороны, восстановление старого значения esp/sp означает освобождение пространства в стеке, отведенного для завершающейся процедуры (локальные переменные процедуры уничтожаются);
  • из стека восстанавливается содержимое ebp/bp, которое было до входа в процедуру. После этого действия значение esp/sp также становится таким, каким оно было до входа в процедуру.

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

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команда leave не имеет операндов и выполняет обратные команде enter действия. Эта команда должна находиться непосредственно перед командой ret, которая в зависимости от соглашений конкретного языка по вызову процедур удаляет или не удаляет аргументы из стека (см. урок 14).

.286proc1 proc enter 16,0... leave retproc1 endp

См. также: урок 14 и команды enter, ret/retf

LGDT

(Load Global Descriptor Table)

Загрузка регистра глобальной дескрипторной таблицы

 

Схема команды: lgdt источник

Назначение: загрузка регистра gdtr значениями базового адреса и размера глобальной дескрипторной таблицы GDT.

Синтаксис

Алгоритм работы:

команда выполняет загрузку 16 бит размера и 32 бит значения базового адреса начала таблицы GDT в памяти в системный регистр gdtr. Эта загрузка производится в соответствии с форматом этого регистра (см. урок 16). Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команду lgdt применяют при подготовке к переходу в защищенный режим для загрузки системного регистра gdtr. В качестве операнда в команде указывается адрес области в формате 16+32. Младшее слово области — размер GDT, двойное слово по старшему адресу — значение базового адреса начала этой таблицы. Данные два компонента должны быть сформированы в памяти заранее.

.286;структура для описания псевдодескриптора gdtrpoint STRUClim dw 0adr dd 0 ENDS.datapoint_gdt point .code...;загружаем gdtr xor eax,eax mov ax,gdt_seg shl eax,4 mov point_gdt.adr,eax lgdt point_gdt...

См. также: уроки 16, 17 и команду sgdt

LIDT

(Load Interrupt Descriptor Table)

Загрузка регистра глобальной дескрипторной таблицы

 

Схема команды: lidt источник

Назначение: загрузка регистра idtr значениями базового адреса и размера глобальной дескрипторной таблицы IDT.

Синтаксис

Алгоритм работы:

Команда lidt аналогична lgdt, но для дескрипторной таблицы прерываний IDT (см. урок 17).

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команду lidt применяют при подготовке к переходу в защищенный режим для загрузки системного регистра idtr. В качестве операнда в команде указывается адрес области в формате 16+32. Младшее слово области — размер IDT, двойное слово по старшему адресу — значение базового адреса начала этой таблицы. Два данных компонента должны быть сформированы в памяти заранее.

.386;структура для описания псевдодескрипторов gdtr и idtrpoint STRUClim dw 0adr dd 0 ENDS.datapoint_idt point .code...;загружаем idtr xor eax,eax mov ax,IDT_SEG shl eax,4 mov point_idt.adr,eax lidt point_idt...

См. также: урок 17 и команду sidt

LODS/LODSB/LODSW/LODSD

(LOad String Byte/Word/Double word operands)

Загрузка строки байтов/слов/двойных слов

 

Схема команды: lods источник lodsb lodsw lodsd

Назначение: загрузка элемента из последовательности (цепочки) в регистр-аккумулятор al/ax/eax.

Синтаксис

Алгоритм работы:

  • загрузить элемент из ячейки памяти, адресуемой парой ds:esi/si, в регистр al/ax/eax. Размер элемента определяется неявно (для команды lods) или явно в соответствии с применяемой командой (для команд lodsb, lodsw, lodsd);
  • изменить значение регистра si на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:
    • df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
    • df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

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

str db ...... cld lea si,str lodsb ;загрузить первый байт из str в al

См. также: урок 11 и команды ins/insb/insw/insd, cmps/cmpsb/cmpsw/cmpsd, movs/movsb/movsw/movsd, outs, scas/scasb/scasw/scasd, stos/stosb/stosw/stosd, rep/repe/repz/repne/repnz

LOOP

(LOOP control by register cx)

Управление циклом по cx

 

Схема команды: loop метка

Назначение: организация цикла со счетчиком в регистре cx.

Синтаксис

Алгоритм работы:

  • выполнить декремент содержимого регистра ecx/cx;
  • анализ регистра ecx/cx:
    • если ecx/cx=0, передать управление следующей за loop команде;
    • если ecx/cx=1, передать управление команде, метка которой указана в качестве операнда loop.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команду loop применяют для организации цикла со счетчиком. Количество повторений цикла задается значением в регистре ecx/cx перед входом в последовательность команд, составляющих тело цикла. Помните о двух важных моментах:

  • для предотвращения выполнения цикла при нулевом ecx/cx используйте команду jecxz/jcxz. Если этого не сделать, то при изначально нулевом ecx/cx цикл повторится 4 294 967 295/65 536 раз;
  • смещение метки, являющейся операндом loop, не должно выходить из диапазона -128...+127 байт. Это смещение, как и в командах условного перехода, является относительным от значения счетчика адреса следующей за loop команды.

 

mov cx,10... jcxz m1cycl:;тело цикла loop cyclm1:

См . также : урок 10 и команды jecxz/jcxz, loope/loopz, loopne/loopnz

LOOPE/LOOPZ

LOOPNE/LOOPNZ

(LOOP control by register cx not equal 0 and ZF=1)

(LOOP control by register cx not equal 0 and ZF=0)

Управление циклом по cx c учетом значения флага ZF

 

Схема команды: loope/loopz метка loopne/loopnz метка

Назначение: организация цикла со счетчиком в регистре cx с учетом флага zf.

Синтаксис

Алгоритм работы:

  • выполнить декремент содержимого регистра ecx/cx;
  • проанализировать регистр ecx/cx:
    • если ecx/cx=0, передать управление следующей за loopxx команде;
    • если ecx/cx=1, передать управление команде, метка которой указана в качестве операнда loopxx;
  • анализ флага zf:
    • если zf=0, для команд loope/loopz это означает выход из цикла, для команд loopne/loopnz — переход к началу цикла;
    • если zf=1, для команд loope/loopz это означает переход к началу цикла, для команд loopne/loopnz — выход из цикла.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команды loopxx удобно использовать вместе с командами, которыe в результате своей работы меняют значение флага zf. Типичный пример — команда сравнения cmp.

;найти первый пробел в строке символовstr db 'Найти первый пробел'str_size=$-str... cld mov cx,str_size lea si,strcycl: lodsb cmp al,' ' loopne cycl jcxz m1 ;переход, если пробелов нет dec si ;в si — адрес пробела в строке str...m1

См. также: уроки 8, 10, 11 и команду loop

MOV

(MOVe operand)

Пересылка операнда

 

Схема команды: mov приемник,источник

Назначение: пересылка данных между регистрами или регистрами и памятью.

Синтаксис

Алгоритм работы:

копирование второго операнда в первый операнд.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

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

  • направление пересылки в команде mov всегда справа налево, то есть из второго операнда в первый;
  • значение второго операнда не изменяется;
  • оба операнда не могут быть из памяти (при необходимости можно использовать цепочечную команду movs);
  • лишь один из операндов может быть сегментным регистром;
  • желательно использовать в качестве одного из операндов регистр al/ax/eax, так как в этом случае TASM генерирует более быструю форму команды mov.

 

mov al,5 mov bl,al mov bx,ds

См . также : урок 10 и команды movs, lods/lodsb/lodsw/lodsd, stos/stosb,

stosw/stosd

MOV

(MOVe operand to/from system registers)


Дата добавления: 2019-09-13; просмотров: 257; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!