Основы программирования



              

RTL: машинно-независимый Ассемблер - часть 2


R2 := R0 +R1

Команды перехода записываются следующим образом: фрагмент программы, на который осуществляется переход, отмечается меткой. Метка ставится между командами, т.е. строка с меткой всегда пустая (это позволяет добавлять в текст новые команды, не трогая строку с меткой). Сам переход выполняется с помощью команды goto, после которой указывается метка перехода, например,

L: . . . goto L;

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

if (eq) goto L;

осуществляет переход на метку L в случае, когда результат предыдущей команды равен нулю (eq — от слова equal), т.е. в регистре CC0 установлен бит z (от слова zero). Большинство арифметических команд автоматически устанавливают биты-признаки результата в регистре флагов CC0. Очень часто требуется просто сравнить два числа, никуда не записывая результат. Команда сравнения присутствуют в системе команд любого процессора, чаще всего она называется cmp (от слова compare). Логически команду сравнения следует понимать как вычитание двух чисел, при этом результат как бы помещается в регистр флагов. На самом деле, в регистре флагов от результата остаются лишь биты-признаки (равен ли он нулю, больше нуля и т.п.). В RTL команда сравнения двух регистров R0 и R1 записывается следующим образом:

CC0 := R0 ? R1;

Результат как бы помещается в регистр флагов CC0.

В командах условного перехода, таких как

if (eq) goto L;

можно использовать следующие условия:

eq результат равен нулю (equal) ne результат не равен нулю (not equal) g результат больше нуля (greater) l результат меньше нуля (less) ge результат больше или равен нулю (greater or equal) le результат меньше или равен нулю (less or equal)

Перечисленные сравнения используются для чисел со знаком. Для неотрицательных чисел (например, в случае сравнения адресов памяти) вместо слов "больше" и "меньше" используются слова "выше" и "ниже" (above и below):

a первое число выше второго (above) b первое число ниже второго (below) ae первое число выше или равно второму (above or equal) be первое число ниже или равно второму (below or equal)

Приведем простой пример реализации конструкции "если":

если R0 == R1 l то R2 := 77; конец если

На RTL этот фрагмент реализуется так:

СС0 := R0 - R1; if (ne) goto L; R2 := 77; L:

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




Содержание  Назад  Вперед