Использование VIRTUAL для данных, адресованных регистром — КиберПедия 

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Использование VIRTUAL для данных, адресованных регистром

2022-10-04 24
Использование VIRTUAL для данных, адресованных регистром 0.00 из 5.00 0 оценок
Заказать работу

 

mov еах, string

virtual    at  eax

еах.Char1        db?

eax.Char2        db?

eax.Char3        db?

eax.Char4        db?

end virtual           

mov bl, [eax.Char1]

mov bl, [eax.Char2]

mov bl, [eax.Char3]

mov bl, [eax.Char4]

Префикс еах. делает код интуитивно понятным и более «читабельным». Использование таких меток не вызывает ошибок при компиляции, т. к. имя регистра ЕАХ является частью имени метки, а символ «точка» рассматривается в данном контексте как обычный символ, подобно любому другому символу.

Более полезной директива virtual бывает при использовании регистров для адресации структур данных.

Переходы

 

Переход - это передача управления другой команде. Фактически переход осуществляется после выполнения каждой команды. В регистре EIP (IP, RIP) находится адрес команды, которая выполнится следующей. После выполнения команды процессор выполняет команду, находящуюся в памяти, на которую указывает EIP (IP, RIP). Этот регистр доступен только для чтения и изменить его нельзя - он изменяется самим процессором. Но иногда надо выполнить не следующую команду, а команду, которая находится, скажем, через 20 команд. Для этого есть команды переходов. Переходы бывают безусловные и условные.

Есть три основные команды безусловной передачи управления: JMP, CALL и RET. Фактически команда JMP изменяет регистр EIP (IP, RIP) на значение, которое было указано в качестве операнда. Операндом может быть непосредственно значение в памяти, регистр, содержащий адрес, или непосредственно значение адреса. Если привести эквивалент команды jmp<адрес>, то он будет такой:

moveip, <адрес>

Команда CALL производит переход с сохранением в стеке адреса следующей команды, для того чтобы функция (или процедура), на которую производится переход, могла вернуться назад для дальнейшего выполнения вызвавшего её кода. У этой команды формат такой же. что и у команды JМР. Эквивалент команды CALL:

pusheip

jmp<адрес>

Команда RET берёт из верхушки стека адрес возврата и переходит по нему. Она не принимает никаких параметров. Эквивалент команды RET:

popeip

 

Также существует команда RETN, которая принимает один операнд. Операнд задаёт количество байтов, которое необходимо «вытолкнуть» из стека перед возвращением из процедуры. Эквивалент команды RETN n следующий:

poptemp

subesp, n

moveip, temp

Для дальнего возврата, т. е. возврата, когда произошла межсегментная передача управления, предназначена команда RETF. Инструкция RETF также может принимать параметр, подобно инструкции RETN. Эквивалент инструкции RETF n следующий:

pop temp_eip

pop temp_cs

sub esp, n

mov cs, temp_cs

moveip, temp_eip

Если передача (возврат) управления осуществляется на другой уровень привилегий, то происходит переключение стека. Эквиваленты команд, которые были приведены выше, никогда не сработают, потому что регистр EIP изменить нельзя; примеры были приведены нами только для лучшего понимания предмета.

 

Команды JMP и CALL могут принимать в качестве операнда как значение памяти, так и непосредственный адрес. Чаще всего в качестве операнда выступает непосредственно адрес (т. е. метка). В таком случае компилятор анализирует близость адреса и, если он близкий, то генерирует короткий опкод инструкции, в противном случае - длинный опкод инструкции. Т. е. короткий вариант инструкции может генерироваться только тогда, когда операнд не заключён в скобки (или не указано ptr) и не является регистром. Короткий вариант инструкции используется, когда происходит переход не далее чем на 127 байт вперёд и 128 байт назад.

Команды условного перехода передают управление, только если выполнено условие. Таких команд много, и каждая передаёт управление в зависимости от значения некоторого флага в регистре флагов. Например, команда JZ передаёт управление другому адресу, только если выставлен флаг ZF. Команды условного перехода принимают в качестве параметра ближнюю метку, т. е. могут передать управление не далее чем на 127 байт вперёд и 128 байт назад.

Команды условного перехода чаще всего используются вместе с инструкциями сравнения. Чаще всего используемая инструкция сравнения - это команда СМР. Она сравнивает операнды и изменяет регистр флагов.

Формат команды:

СМР < операнд1 >, <операнд2>

В качестве первого операнда может выступать регистр или значение памяти любого размера (1, 2, 4, 8 байт). В качестве второго операнда может выступать регистр, значение памяти или непосредственное значение. Значение не может быть 64-битным. Одновременно двух значений памяти быть не может. Если 32-битное значение сравнивается с 64-битным, то оно расширяется нулями. В табл. приведены команды условных переходов (условия указаны после выполнения команды cmpx,y)

 

 

 

Иногда имеет смысл использовать команду TEST. Формат этой команды почти такой же, как и у команды СМР, но только в качестве второго операнда не может выступать значение памяти(т.е. только регистр или непосредственное значение). Эта команда осуществляет операцию «логического И» и изменяет только флаги SF, ZF, РЕ Команда TEST полезна для проверки соответствия значения операнда некоторой битовой маске.

 

Безымянные метки

 

Компилятор FASM позволяет создавать безымянные метки. Безымянные метки -это метки с именем @@:

Для осуществления перехода на безымянную метку нужно указать в качестве метки значения: если нужен переход на ближайшую метку после команды перехода, то следует указать @f, а если надо перейти на ближайшую метку до команды перехода, то @b. Пример приведён в листинге. В некоторых случаях (например, при реализации сложных алгоритмов) безымянные метки бывают очень полезными, т. к. без них код буквально кишит похожими друг на друга метками.

 

 

Работа с битами

 

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

bt* <операнд>, <номер бита>

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

Команда ВТ заносит значение указанного бита во флаг CF в регистре флагов. Команда ВТС заносит значение указанного бита во флаг CF и производит его инвертирование в операнде. Команда BTR заносит значение указанного бита во флаг CF и обнуляет его в операнде. Команда BTS заносит значение указанного бита во флаг CF и заносит в указанный бит в операнде единицу. Как видно, все указанные команды заносят значение указанного бита во флаг CF, после чего можно использовать команды условного перехода JC и JNC. Пример использования команды ВТ приведён в листинге

 

movax, 4;ax = 100b

btax, 2; проверка третьего бита в регистре ах

jcmetka; будет произведён прыжок на метку

metka:

Использование команд ВТ, BTC, BTR, BTS поможет при оптимизации кода программы; они могут заменить команду TEST для проверки значения конкретного бита.

 

Близкие и дальние переходы.

Переходы в ЯАкодируются от слова Jump.

Например, безусловный переход:

JMPоp; аналог GOTOop

где ор – имя команды, которой передается управление (т.е. метка).

Команды перехода модифицируют указатель команд IPили пару CS:IP.

Команда перехода является специальным случаем пересылки данных.

- если команда перехода изменяет только IP (т.е. переход внутри сегмента), то переход называется близким переходом илиNEAR.

IP-> NEAR

- если переход изменяет пару регистров CS:IP, - это межсегментный переход или дальний переход FAR.

CS:IP ->FAR

Обычно адрес перехода ассоциируется с меткой команды.

       Метка – это имя команды,расположенной до мнемоники команды и отделенная двоеточием.

Любая метка  (включая имя процедуры) имеет атрибут NEAR или FAR.

Адресация в переходах.

а) Прямая адресация.

Команда содержит в себе базовый адрес сегмента и смещение. Это допускается только в командах межсегментного перехода или вызова процедур. Метки, которым передается управление, должны иметь атрибут FAR.

Например,

       JMPCATS

где JMP – аналог GOTO,CATS – метка или имя процедуры.

б) Косвенная(базовая) адресация

Адрес перехода содержится в регистре или в ячейке памяти. Используется для межсегментных и внутрисегментных переходов.

Например,

JMPAX;

       JMPNEARCOD[BX]

Во второй команде явно указывается, что переход близкий.

в) Относительная адресация

Место перехода указывается как расстояние от самой команды перехода. Эффективный адрес вычисляется суммированием индекса смещения в команде и текущего значения в IP.

Имеется 2 типа переходов:

1) с 8-битовым (1Б) индексным смещением. Обеспечивает передачу управления в диапазоне (-128:127Б) от текущей команды SHORT.

2) с 16-битовым (2Б) индексным смещением. Обеспечивает передачу управления в диапазоне (-32 768:32767Б) от текущей команды NEAR.

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

Например,

movw, offsetL1; в ячейку памяти w записывается смещение L1 относительно текущей команды offset

   ...

JMPwилиJMPSHORTw; но тогда проверяется корректность команды, т.е. действительно ли расстояние SHORT.

 

Команды условных переходов

Делятся на 2 группы:

а) анализирующие результаты предыдущей команды (FLAGS), имеют только 1-байтовое смещение. Если условный переход осуществляется на команду, отстоящую более чем на 127Б, то используется комбинация условных и безусловных переходов.

Например:

Требуется NEAR переход на метку ZERO по флагу ZF=1, тогда:

       ………..

       JNZCONTINUE

       JMPZERO

       CONTINUE

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

E – equal (=)

N – not (не)

    Z – zero(ноль)

    G – greater (больше для целых со знаком)

L –less (меньше для целых со знаком)

A – above (больше для беззнаковых целых)

B –below (меньше для беззнаковых целых)

 

В условных переходах после J указывается от одной до трех букв условий (из перечисленных выше).

Например, по условию ор1<ор2 можно записать:

- Длязнаковых JL ADR

JNGE ADR

- Для беззнаковых JB ADR

JNAE ADR

б) команды управления циклом

LOOP ор; управление циклом по счетчику, где ор – метка первойкоманды цикла. Цикл управляется счетчиком в СХ.

Команда LOOP уменьшает содержимое СХ и передает управление на метку, если результат не равен 0, иначе управление передается команде следующей за LOOP.

Обычно цикл оформляется следующим образом:

movCX,N; N – число повторов

L: ………;начало цикла

…………

LOOPL

 

Команда LOOPэквивалентна 3-м командам:

    DEC CX

    CMPCX, 0

    JNE L

 

 

Особенности команды LOOP:

- счетчик цикла находится только в CX;

- начальное значение загружается в CX до входа в цикл;

- команды прохода цикла выполняются хотя бы один раз, но до начала цикла CX должен быть больше 0;

- LOOPосуществляет короткий. Следовательно, проход цикла должен превышать 30-40 команд; если нужен более длинный проход цикла, то используется сочетание условных и безусловных переходов;

- CX может использоваться как операнд в цикле, но не должен изменяться другими командами.

Есть и другие переходы по циклу. Например, с дополнительным условием, а именно с учетом флага ZF.

Можно использовать 2 эквивалентные записи:

LOOPEop

LOOPZop

Здесь цикл повторяется CX раз, пока ZF=1, что соответствует сложному условию передачи управления меткиOP.

CX<>0 ANDZF=1.

Другой случай эквивалентных команд:

LOOPNEop

LOOPNZop

Цикл повторяется CX раз, пока ZF=1.

Эти команды управления циклом обычно используются для решения задач поиска или сортировки. Их основной недостаток состоит в том, что причина выхода из цикла неочевидна, и требуется дополнительный анализ по окончании цикла.

 

 

Резюме

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


 


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

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.062 с.