4502

Команды передачи управления на языке ассемблера

Лекция

Информатика, кибернетика и программирование

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

Русский

2012-11-21

45.32 KB

46 чел.

Команды передачи управления на языке ассемблера

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

  1.  безусловным — в данной точке необходимо передать управление не той команде, которая идет следующей, а другой, которая находится на некотором удалении от текущей команды;
  2.  условным — решение о том, какая команда будет выполняться следующей, принимается на основе анализа некоторых условий или данных.

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

На уроке 5 нами были рассмотрены средства организации фрагментации кода программы и ее данных на сегменты. То, какая команда программы должна выполняться следующей, микропроцессор узнает по содержимому пары регистров cs:(e)ip:

  1.  cs — сегментный регистр кода, в котором находится физический (базовый) адрес текущего сегмента кода;
  2.  eip/ip — регистр указателя команды, в котором находится значение, представляющее собой смещение в памяти следующей команды, подлежащей выполнению, относительно начала текущего сегмента кода.
  3.  Напомню, почему мы записываем регистры eip/ip через косую черту. Какой конкретно регистр будет использоваться, зависит от установленного режима адресации use16 или use32. Если указано use16, то используется ip, если use32, то используется eip.

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

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

  1.  Команды безусловной передачи управления:
  2.  команда безусловного перехода;
  3.  вызова процедуры и возврата из процедуры;
  4.  вызова программных прерываний и возврата из программных прерываний.
  5.  Команды условной передачи управления:
  6.  команды перехода по результату команды сравнения cmp;
  7.  команды перехода по состоянию определенного флага;
  8.  команды перехода по содержимому регистра ecx/cx.
  9.  Команды управления циклом:
  10.  команда организации цикла со счетчиком ecx/cx;
  11.  команда организации цикла со счетчиком ecx/cx с возможностью досрочного выхода из цикла по дополнительному условию.

 

 

 

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

Предыдущее обсуждение выявило некоторые детали механизма перехода. Команды перехода модифицируют регистр указателя команды eip/ip и, возможно, сегментный регистр кода cs. Что именно должно подвергнуться модификации, зависит:

  1.  от типа операнда в команде безусловного перехода (ближний или дальний);
  2.  от указания перед адресом перехода (в команде перехода) модификатора; при этом сам адрес перехода может находиться либо непосредственно в команде (прямой переход), либо в регистре или ячейке памяти (косвенный переход).

Модификатор может принимать следующие значения:

  1.  near ptr — прямой переход на метку внутри текущего сегмента кода. Модифицируется только регистр eip/ip (в зависимости от заданного типа сегмента кода use16 или use32) на основе указанного в команде адреса (метки) или выражения, использующего символ извлечения значения СчА — $;
  2.  far ptr — прямой переход на метку в другом сегменте кода. Адрес перехода задается в виде непосредственного операнда или адреса (метки) и состоит из 16-битного селектора и 16/32-битного смещения, которые загружаются, соответственно, в регистры cs и ip/eip;
  3.  word ptr — косвенный переход на метку внутри текущего сегмента кода. Модифицируется (значением смещения из памяти по указанному в команде адресу, или из регистра) только eip/ip. Размер смещения 16 или 32 бит;
  4.  dword ptr — косвенный переход на метку в другом сегменте кода. Модифицируются (значением из памяти — и только из памяти, из регистра нельзя) оба регистра, cs и eip/ip. Первое слово/двойное слово этого адреса представляет смещение и загружается в ip/eip; второе/третье слово загружается в cs.

Команда безусловного перехода jmp

Синтаксис команды безусловного перехода

jmp [модификатор] адрес_перехода - безусловный переход без сохранения информации о точке возврата.

Адрес_перехода представляет собой адрес в виде метки либо адрес области памяти, в которой находится указатель перехода.

Всего в системе команд микропроцессора есть несколько кодов машинных команд безусловного перехода jmp.

Их различия определяются дальностью перехода и способом задания целевого адреса.

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

Внутрисегментный переход предполагает, что изменяется только содержимое регистра eip/ip.

Можно выделить три варианта внутрисегментного использования команды jmp:

  1.  прямой короткий;
  2.  прямой;
  3.  косвенный.

Процедуры

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

  1.  механизм процедур;
  2.  макроассемблер;
  3.  механизм прерываний.

Процедура, часто называемая также подпрограммой, — это основная функциональная единица декомпозиции (разделения на несколько частей) некоторой задачи.

Процедура представляет собой группу команд для решения конкретной подзадачи и обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку.

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

Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PROC и ENDP.

Синтаксис описания процедуры таков (рис. 1).

Рис. 1. Синтаксис описания процедуры в программе

Из рис. 1 видно, что в заголовке процедуры (директиве PROC) обязательным является только задание имени процедуры. Среди большого количества операндов директивы PROC следует особо выделить [расстояние].

Этот атрибут может принимать значения near или far и характеризует возможность обращения к процедуре из другого сегмента кода. По умолчанию атрибут [расстояние] принимает значение near.

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

Более подробно вопросы, связанные с описанием и использованием процедур в программах ассемблера, рассматриваются на уроках 10 и 14. Примеры использования процедур вы можете посмотреть в приложении 7. 

Условные переходы

Микропроцессор имеет 18 команд условного перехода (см. “Описание команд”). Эти команды позволяют проверить:

  1.  отношение между операндами со знаком (“больше — меньше”);
  2.  отношение между операндами без знака (“выше — ниже”)2;
  3.  состояния арифметических флагов zf, sf, cf, of, pf (но не af).

Команды условного перехода имеют одинаковый синтаксис:

jcc метка_перехода 

Как видно, мнемокод всех команд начинается с “j” — от слова jump (прыжок), cc — определяет конкретное условие, анализируемое командой.

Что касается операнда метка_перехода, то эта метка может находится только в пределах текущего сегмента кода, межсегментная передача управления в условных переходах не допускается. В связи с этим отпадает вопрос о модификаторе, который присутствовал в синтаксисе команд безусловного перехода. В ранних моделях микропроцессора (i8086, i80186 и i80286) команды условного перехода могли осуществлять только короткие переходы — на расстояние от –128 до +127 байт от команды, следующей за командой условного перехода. Начиная с модели микропроцессора 80386 это ограничение снято, но, как видите, только в пределах текущего сегмента кода.

Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого и будет приниматься решение о передаче управления.

Источниками такого условия могут быть:

  1.  любая команда, изменяющая состояние арифметических флагов;
  2.  команда сравнения cmp, сравнивающая значения двух операндов;
  3.  состояние регистра ecx/cx.

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

Команда сравнения cmp

Команда сравнения cmp имеет интересный принцип работы. Он абсолютно такой же, как и у команды вычитания.

sub операнд_1,операнд_2. Команда cmp так же, как и команда sub, выполняет вычитание операндов и устанавливает флаги. Единственное, чего она не делает — это запись результата вычитания на место первого операнда.

Синтаксис команды cmp:

cmp операнд_1,операнд_2 (compare) — сравнивает два операнда и по результатам сравнения устанавливает флаги.

Флаги, устанавливаемые командой cmp, можно анализировать специальными командами условного перехода. Прежде чем мы их рассмотрим, уделим немного внимания мнемонике этих команд условного перехода (табл. 1). Понимание обозначений при формировании названия команд условного перехода (элемент в названии команды jcc, обозначенный нами cc) облегчит их запоминание и дальнейшее практическое использование.

Таблица 1. Значение аббревиатур в названии команды jcc

Мнемоническое обозначение

Английский

Русский

Тип операндов

E e

equal

Равно

Любые

N n

not

Не

Любые

G g

greater

Больше

Числа со знаком

L l

less

Меньше

Числа со знаком

A a

above

Выше, в смысле “больше”

Числа без знака

B b

below

Ниже, в смысле “меньше”

Числа без знака

Таблица 2. Перечень команд условного перехода для команды cmp операнд_1,операнд_2 

Типы операндов

Мнемокод команды условного перехода

Критерий условного перехода

Значения флагов для осществления перехода

Любые 

je 

операнд_1 = операнд_2 

zf = 1 

Любые 

jne 

операнд_1<>операнд_2 

zf = 0 

Со знаком 

jl/jnge 

операнд_1 < операнд_2 

sf <> of

Со знаком 

jle/jng 

операнд_1 <= операнд_2 

sf <> of or zf = 1 

Со знаком 

jg/jnle 

операнд_1 > операнд_2 

sf = of and zf = 0

Со знаком 

jge/jnl 

операнд_1 => операнд_2 

sf = of 

Без знака 

jb/jnae 

операнд_1 < операнд_2 

cf = 1 

Без знака 

jbe/jna 

операнд_1 <= операнд_2 

cf = 1 or zf=1 

Без знака 

ja/jnbe 

операнд_1 > операнд_2 

cf = 0 and zf = 0 

Без знака 

jae/jnb 

операнд_1 => операнд_2 

cf = 0 

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

Разница в названии обусловлена желанием разработчиков микропроцессора облегчить использование команд условного перехода в сочетании с определенными группами команд. Поэтому разные названия отражают скорее различную функциональную направленность. Тем не менее, то, что эти команды реагируют на одни и те же флаги делает их абсолютно эквивалентными и равноправными в программе. Поэтому в табл. 2 они сгруппированы не по названиям, а по значениям флагов (условиям), на которые они реагируют. 

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

Мнемоническое обозначение некоторых команд условного перехода отражает название флага, с которым они работают, и имеет следующую структуру: первым идет символ “j” (jump, переход), вторым — либо обозначение флага, либо символ отрицания “n”, после которого стоит название флага.

Такая структура команды отражает ее назначение.

Если символа “n” нет, то проверяется состояние флага, и если он равен 1, производится переход на метку перехода.

Если символ “n” присутствует, то проверяется состояние флага на равенство 0, и в случае успеха производится переход на метку перехода.

Мнемокоды команд, названия флагов и условия переходов приведены в табл. 3.

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

Таблица 3. Команды условного перехода и флаги

Название флага 

Номер бита в eflags/flag

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

Значение флага для осуществления перехода

Флаг переноса cf 

jc 

cf = 1 

Флаг четности pf 

jp 

pf = 1 

Флаг нуля zf 

jz 

zf = 1 

Флаг знака sf 

js 

sf = 1 

Флаг переполнения of 

11 

jo 

of = 1 

Флаг переноса cf 

jnc 

cf = 0 

Флаг четности pf 

jnp 

pf = 0 

Флаг нуля zf 

jnz 

zf = 0 

Флаг знака sf 

jns 

sf = 0 

Флаг переполнения of 

11 

jno 

of = 0 

Если внимательно посмотреть на табл. 2 и 3, видно, что многие команды условного перехода в них являются эквивалентными, так как в основе и тех, и других лежит анализ одинаковых флагов. 

Команды условного перехода и регистр ecx/cx

Архитектура микропроцессора предполагает специфическое использование многих регистров.

К примеру, регистр eax/ax/al используется как аккумулятор, а регистры bp, sp - для работы со стеком.

Регистр ecx/cx тоже имеет определенное функциональное назначение — он выполняет роль счетчика в командах управления циклами и при работе с цепочками символов. Возможно, что функционально команду условного перехода, связанную с регистром ecx/cx, правильнее было бы отнести к этой группе команд.

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

jcxz метка_перехода (Jump if cx is Zero) — переход, если cx ноль;

jecxz метка_перехода (Jump Equal ecx Zero) — переход, если ecx ноль.

Эти команды очень удобно использовать при организации цикла и при работе с цепочками символов.

Нужно отметить ограничение, свойственное команде jcxz/jecxz. В отличие от других команд условной передачи управления, команда jcxz/jecxz может адресовать только короткие переходы — на –128 байт или на +127 байт от следующей за ней команды. 

Организация циклов

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

Организовать циклическое выполнение некоторого участка программы можно, к примеру, используя команды условной передачи управления или команду безусловного перехода jmp. При такой организации цикла все операции по его организации выполняются “вручную”. Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики микропроцессора ввели в систему команд группу из трех команд, облегчающую программирование циклов. Эти команды также используют регистр ecx/cx как счетчик цикла.

Дадим краткую характеристику этим командам: 

loop метка_перехода (Loop) — повторить цикл. Команда позволяет организовать циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Работа команды заключается в выполнении следующих действий:

  1.  декремента регистра ecx/cx;
  2.  сравнения регистра ecx/cx с нулем:
  3.  если (ecx/cx) > 0, то управление передается на метку перехода;
  4.  если (ecx/cx) = 0, то управление передается на следующую после loop команду.

loope/loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0) — повторить цикл, пока cx <> 0 или zf = 0.

Команды loope и loopz — абсолютные синонимы, поэтому используйте ту команду, которая вам больше нравиться. Работа команд заключается в выполнении следующих действий:

  1.  декремента регистра ecx/cx;
  2.  сравнения регистра ecx/cx с нулем;
  3.  анализа состояния флага нуля zf:
  4.  если (ecx/cx) > 0 и zf = 1, управление передается на метку перехода;
  5.  если (ecx/cx) = 0 или zf = 0, управление передается на следующую после loop команду.

loopne/loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1.

Команды loopne и loopnz также абсолютные синонимы. Работа команд заключается в выполнении следующих действий:

  1.  декремента регистра ecx/cx;
  2.  сравнения регистра ecx/cx с нулем;
  3.  анализа состояния флага нуля zf:
  4.  если (ecx/cx) > 0 и zf = 0, управление передается на метку перехода;
  5.  если (ecx/cx)=0 или zf=1, управление передается на следующую после loop команду.

Команды loope/loopz и loopne/loopnz по принципу своей работы являются взаимообратными. Они расширяют действие команды loop тем, что дополнительно анализируют флаг zf, что дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора.

Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуют только короткие переходы (от –128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду jmp, поэтому постарайтесь освоить оба способа организации циклов. 

 


 

А также другие работы, которые могут Вас заинтересовать

76770. Соединения костей предплечья и кисти 183.33 KB
  В своей верхней части под проксимальным лучелоктевым суставом она имеет косой пучок толстых фиброзных волокон именуемый косой хордой. Проксимальный лучелоктевой сустав образуется при сочленении суставной окружности на головке луча и лучевой вырезки на проксимальном эпифизе локтевой кости. Он входит в состав локтевого сустава.
76771. Локтевой сустав 179.76 KB
  Шаровидный плечелучевой сустав изза тесной связи с другими двумя суставами утрачивает одну ось и движения в нем осуществляются по фронтальной и продольной оси. Капсула спереди и сзади тонкая возможность вывихов и укреплена по бокам внутри и снизу связками: боковыми коллатеральными: локтевой и лучевой; внутрисуставной кольцевой связкой лучевой кости; снизу квадратной – между лучевой шейкой и дистальным краем лучевой вырезки на локтевой кости. Спереди у лучевой шейки возникает слепое синовиальное выпячивание.
76772. Суставы кисти 182.29 KB
  Среди запястнопястных суставов особое место занимает запястнопястный сустав большого пальца так как в процессе антропогенеза в нем сложились специфические приспособления для противопоставления оппозициорепозицио его остальным пальцам. Они сводятся к следующему: изоляции сустава от остальных запястнопястных суставов; формированию седловидной суставной поверхности у коститрапеции и I пястной кости; наличию широкой свободной капсулы; наклону фронтальной оси к ладони что обеспечивает не только сгибание и разгибание но и смещение пальца...
76773. Развитие и строение скелета нижней конечности 185.87 KB
  Все кости проходят через три стадии остеогенеза: фиброзную хрящевую костную. Скелет нижней конечности состоит из пояса правая и левая тазовые кости и свободной части включающей бедренную кость надколенник берцовые кости голени большую и малую кости стопы с предплюсной плюсной и фалангами пальцев. В предплюсну входят кости : пяточная и таранная ладьевидная клиновидные медиальная промежуточная латеральная и кубовидная. Плюсневых костей пять – это короткие трубчатые кости.
76774. Кости таза и их соединения 183.03 KB
  Соединения костей таза: крестцовоподзвдошный сустав – плоский трехосный с очень малым объемом движений образован ушковидными суставными поверхностями крестца и подвздошной кости; имеет прочную и сильно натянутую капсулу укрепленную крестцовоподвздошными связками: вентральными межкостными и дорсальными; крестцовокопчиковый сустав – между верхушкой крестца и I копчиковым позвонком в межпозвоночном диске сустава щель зарастает после 50 лет; сустав укреплен крестцовокопчиковыми связками: вентральными дорсальными и глубокими дорсальными...
76775. Тазобедренный сустав 180.98 KB
  Суставная капсула состоящая из фиброзной и синовиальной мембран прикрепляется по краю вертлужной губы а на бедренной кости по шейке: спереди по межвертельной линии сзади – внутрь от межвертельного гребня. Внутри сустава располагается связка головки бедренной кости которая в период его формирования удерживает головку во впадине. Они кровоснабжаются следующими артериями: подвздошнопоясничной верхней ягодичной запирательной наружной половой глубокой и латеральной окружающими подвздошную кость нисходящей коленной мышечными ветвями...
76776. Коленный сустав 180.6 KB
  К внутренним связкам относятся крестообразные: передняя и задняя заполняющие межмыщелковую яму бедренной кости и межмыщелковое поле большеберцовой кости. Коленный сустав – типичный мыщелковый сложный и комплексный в нем выполняются следующие движения: вокруг фронтальной оси: сгибание и разгибание с размахом в 140150 о; сгибание тормозят крестовидные связки и сухожилие четырехглавой мышцы; мыщелки бедренной кости при этом скользят по менискам; вокруг продольной вертикальной оси объем активного вращения в среднем 15 о пассивного – 3035...
76777. Голеностопный сустав 179.01 KB
  По бокам капсула толстая и прочная спереди и сзади – тонкая рыхлая складчатая; усилена боковыми связками: медиальной дельтовидной – толстой прочной веером расходящейся от медиальной лодыжки к таранной ладьевидной и пяточной костям; в связке выделяют части: большеберцоволадьевидную большеберцовопяточную переднюю и заднюю большеберцовотаранные; латеральной в составе передней таранномалоберцовой задней таранномалоберцовой пяточномалоберцовой связок. Они кровоснабжаются мышечными ветвями задней большеберцовой и малоберцовой...
76778. Кости голени и стопы, их соединения 186.1 KB
  На диафизе большеберцовой кости располагаются: передний край острый – кверху переходит в бугристость латеральный край обращенный к малоберцовой кости и медиальный край; поверхности: медиальная латеральная и задняя с линией камбаловидной мышцы. Ядра окостенения в большеберцовой кости появляются в проксимальном эпифизе в конце плодного периода в дистальном – на 2м году жизни в диафизе – в начале плодного периода. Кости стопы подразделяются на кости предплюсны: 7 коротких губчатых костей и кости плюсны в составе 5 коротких трубчатых...