Инструкция условного перехода? - PullRequest
1 голос
/ 12 октября 2009

Курс по разработке компилятора:

Что подразумевается под инструкцией условного перехода? Я программист на C / C ++, поэтому, если в этой парадигме есть примеры кода, вы могли бы поделиться, чтобы я лучше понял это.

Что они подразумевают под неограниченными инструкциями условного перехода?

Пример выписки из книги:

Многие процессоры имеют условный переход инструкции только для условных прыжки с ограниченным диапазоном. За Например, цель прыжка может не дальше 128 байт из текущего счетчика программы. Иногда ассемблер для такого процессор по-прежнему позволяет неограниченное условные переходы.

Должен ли я знать программирование на ассемблере, чтобы понять это?

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

Ответы [ 6 ]

3 голосов
/ 12 октября 2009

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

Возьмите условный переход x86, например JNZ, что означает «переход, если не установлен нулевой флаг процессора» ( флажки процессора будут установлены или сброшены предыдущей арифметической операцией).

Опкод JNZ имеет операнд, который говорит, как далеко прыгнуть. Для опкода JNZ операнд кодируется с использованием одного байта (т. Е. Только первый байт после кода операции интерпретируется как операнд; следующий байт - начало следующего опкода), поэтому он может указывать переход не дальше чем плюс или минус 128 байтов.

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

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

Это означает, что когда вы пишете в сборке высокого уровня, вы можете написать ...

jnz distant_label
[other instructions]
distant_label:

... даже если удаленная метка удалена более чем на 128 байтов. Как это можно сделать, если сам процессор поддерживает только короткие условные переходы? Возможно, потому что ассемблер (который «собирает» ваш язык ассемблера, как компилятор) автоматически вставляет некоторые дополнительные необходимые коды операций, так что то, что на самом деле в конечном итоге выдается, выглядит как ...

jz nearby_label
jmp distant_label
nearby_label:
[other instructions]
distant_label:

... где:

  • Вместо jnz distant_label есть jmp distant_label - JMP - это безусловный прыжок, который имеет больший операнд и может прыгать на неограниченное расстояние
  • Вместо jnz distant_label есть jz nearby_label - «JNZ» заменяется на «JZ», что означает вместо «перейти к удаленной метке, если флаг не равен нулю», это «перейти к ближайшей метке, так что не делайте» не делать дальний переход, если флаг равен нулю »(что в конечном итоге означает то же самое, что вы написали, потому что« прыжок, если не ноль »означает то же самое, что и« не переходите, если ноль »).
3 голосов
/ 12 октября 2009

Я думаю, что это отвечает на ваш вопрос: например, в серии Microchip PIC18F у вас есть команда bra (ветвь) и команда goto. Они фактически одинаковы, но разница в том, что команда bra может перемещаться только в местоположение от -1024 до +1023 слов из своего местоположения и использует только одно слово программной памяти. Команда goto может перепрыгнуть в любом месте в памяти программ, но она требует двух слов памяти программ, чтобы разрешить прыжок в любом месте.

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

Эти дополнительные слова могут иметь значение, если, конечно, у вас есть, скажем, 2К слов памяти программ.

bra и goto сами по себе являются безусловными прыжками; однако есть несколько команд условного перехода, таких как bc (переход, если переносить), bz (переход, если ноль), bnz (переход, если не ноль) и т. д., которые все проверяют регистры состояния из последней (арифметическая) операция, и выполнять ветвление только в том случае, если указанное условие было истинным.

Если вам нужно условное goto, то у вас будет что-то вроде

DELAY
    nop
    nop
    decfsnz DelayCount
    goto DONE_WITH_DELAY
    bra DELAY

Где мы выполняем два бездействия, чтобы «поспать» на мгновение; уменьшаем «переменную» с именем DelayCount, и если DelayCount равен нулю, то мы безоговорочно переходим к коду, помеченному DONE_WITH_DELAY; если он не равен нулю, мы возвращаемся к метке DELAY и делаем это снова. (decfsnz означает «Уменьшение f, пропустите, если не ноль)

3 голосов
/ 12 октября 2009

Относительно условной ветви вы можете начать с этого определения:

Отрасль (информатика) :

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

Операторы if, for, while C компилируются в операторы сборки условного перехода. В то время как оператор goto компилируется в оператор безусловного перехода.

Относительно ограниченного / неограниченного диапазона прыжка: диапазон - это «расстояние» в памяти между адресом инструкции перехода и адресом, на который следует перейти. Статья Program counter в Википедии может дать вам больше информации по этому вопросу.

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

2 голосов
/ 12 октября 2009

Условный переход логически перевернул бы это выражение if:

if(a == b)
{
  // do something
}

// do something else

в это:

if(!(a==b)) goto somethingElse;
// do something

somethingElse:
// do something else

Строка if(!(a==b)) станет командой ассемблера:

CMP A, B
JNE somethingElse

Теперь, что касается "неограниченного условного прыжка", я предполагаю, что они означают дальний прыжок?

1 голос
/ 12 октября 2009

Условный скачок похож на

if (condition) goto

в C. Безусловный скачок похож на

goto

в кл.

Я не знаю, что значит "безлимитный". Это может быть характерно для конкретного обсуждаемого процессора.

0 голосов
/ 12 октября 2009

В короткие сроки:

Условное означает что-то вроде

if(condition)
{
  //condition met
}
else
{
  //condition no met
}

Это означает, что выполнение программы изменяется в зависимости от условного выражения.

Безусловные переходы - это типичные реализации компилятором операторов goto или вызовов функций.

...