Plazer-don.ru

Сварочное оборудование
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Инструкции B, BL (ARM)

Синтаксис

cond определяет, при каком условии команда будет выполнена.

target_address определяет адрес инструкции, на которую выполняется переход. Адрес перехода вычиляется следующим образом:

1. Находящееся в коде команды значение signed_immed_24 расширяется до 30 разрядов.

2. Полученная величина сдвигается влево на 2 бита, в результате чего получается 32-разрядное число со знаком, два младших бита которого равны нулю.

3. Итоговое 32-разрядное число прибавляется к текущему значению счётчика команд PC, что обеспечивает выполнение перехода (текущее значение PC равно адресу данной команды B или BL плюс 8).

Версии архитектуры

Исключения

Операция

Использование

Команды B и BL используются для организации перехода по фиксированному адресу, находящемуся в пределах от –33554432 до +33554428 байтов от команды перехода. Команда BL, кроме того, запоминает адрес возврата в регистре LR (R14); поэтому она используется для вызова подпрограмм. Для возврата из подпрограммы обычно применяется один из трёх методов:

  • команда BX LR в тех версиях архитектуры, где она имеется (таковыми являются все версии, начиная с ARMv4T, т.е. все сколько-нибудь актуальные);
  • команда счётчик команд, например:

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

Читайте также

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

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

Читайте так же:
Через сколько поверяется счетчик

Команды сдвигов Команды сдвигов используются для изменения содержимого регистров в соответствии с некоторым побитовым алгоритмом. SAR – арифметический сдвиг вправо SAL — арифметический сдвиг влево SHR — логический сдвиг вправо SHL — логический сдвиг влево ROR —. [читать подробенее]

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

11. Циклы и команда LOOP — i8086

Статья основана на материале xrnd с сайта asmworld (из учебного курса по программированию на ассемблер 16-битного процессора 8086 под DOS).

До этой части все наши программы выполнялись последовательно — в них не было ветвлений и переходов. Сегодня мы научимся делать простейшие циклы. Циклом называется повторяющееся выполнение последовательности команд. Но для начала нужно научиться объявлять метки.

Синтаксис объявления меток

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

Теперь вместо имени m1 компилятор везде будет подставлять адрес комады mov ax,4C00h. Можно объявлять метку на пустой строке перед командой:

Имя метки может состоять из латинских букв, цифр и символов подчёркивания, но должно начинаться с буквы. Имя метки должно быть уникальным. В качестве имени метки нельзя использовать директивы и ключевые слова компилятора, названия команд и регистров (в этом случае FASM покажет сообщение об ошибке). FASM различает регистр символов в именах меток. Можно также объявлять несколько меток на один адрес. Например:

Читайте так же:
Счетчик разговора за сутки

Подробнее о синтаксисе объявления меток рассказывается в части 25.

Команда LOOP

Для организации цикла предназначена команда LOOP. У этой команды один операнд — имя метки, на которую осуществляется переход. В качестве счётчика цикла используется регистр CX. Команда LOOP выполняет декремент CX, а затем проверяет его значение. Если содержимое CX не равно нулю, то осуществляется переход на метку, иначе управление переходит к следующей после LOOP команде.

Содержимое CX интерпретируется командой как число без знака. В CX нужно помещать число, равное требуемому количеству повторений цикла. Понятно, что максимально может быть 65535 повторений. Ещё одно ограничение связано с дальность перехода. Метка должна находиться в диапазоне -127…+128 байт от команды LOOP (если это не так, FASM сообщит об ошибке).

Пример цикла

В качестве примера я приведу простую программу, которая будет печатать все буквы английского алфавита. ASCII-коды этих символов расположены последовательно, поэтому можно выводить их в цикле. Для вывода символа на экран используется функция DOS 02h (выводимый байт должен находиться в регистре DL).

Команды «int 21h» и «inc dl» (строки 8 и 9) будут выполняться в цикле 26 раз. Для того, чтобы программа не закрылась сразу, используется функция DOS 08h — ввод символа с клавиатуры без эха, то есть вводимый символ не отображается. Перед этим выводится предложение нажать любую кнопку (но Reset лучше не нажимать). Для примера адрес строки объявлен с помощью метки. Символы с кодами 13 и 10 обозначают переход на следующую строку (символ 13(0Dh) называется CR — Carriage Return — возврат каретки, а символ 10(0Ah) LF — Line Feed — перевод строки . Эти символы унаследованы со времён древних телетайпов, когда текст печатался, как на печатной машинке). Так выглядит результат работы программы:

Читайте так же:
Население кыргызстана счетчик населения

Вложенные циклы

Иногда требуется организовать вложенный цикл, то есть цикл внутри другого цикла. В этом случае необходимо сохранить значение CX перед началом вложенного цикла и восстановить после его завершения (перед командой LOOP внешнего цикла). Сохранить значение можно в другой регистр, во временную переменную или в стек. Следующая программа выводит все доступные ASCII-символы в виде таблицы 16×16. Значение счётчика внешнего цикла сохраняется в регистре BX.

Как видите, всё довольно просто. Результат работы программы выглядит вот так:

Упражнение

Напишите программу для вычисления степени числа 3 по формуле

Число a — 16-битное целое без знака, число n — 8-битное целое без знака (используйте n<11, чтобы избежать переполнения). Проверьте работу программы в отладчике (нажимайте F7 на команде LOOP, чтобы осуществить переход). Результаты можете выкладывать в комментариях.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector