WikiDer > Отрасль (информатика)
эта статья нужны дополнительные цитаты для проверка. (Июнь 2009 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
Машинный код |
---|
Общие понятия |
инструкции |
А ветвь это инструкция в компьютерная программа это может привести к тому, что компьютер начнет выполнять другую последовательность инструкций и, таким образом, отклонится от своего поведения по умолчанию при выполнении инструкций по порядку.[а] Ветвь (или разветвление, разветвленный) может также относиться к действию переключения выполнения на другую последовательность команд в результате выполнения инструкции ветвления. Инструкции ветвления используются для реализации поток управления в программных циклах и условных выражениях (т. е. выполнение определенной последовательности инструкций только при выполнении определенных условий).
Инструкция ветвления может быть либо безусловная ветвь, что всегда приводит к ветвлению, или условная ветвь, который может вызывать или не вызывать ветвление в зависимости от некоторых условий. Кроме того, в зависимости от того, как он определяет адрес новой последовательности команд («целевой» адрес), инструкция ветвления обычно классифицируется как непосредственный, косвенный или родственник, что означает, что инструкция содержит целевой адрес, или указывает, где должен быть найден целевой адрес (например, регистр или место в памяти), или указывает разницу между текущим и целевым адресами.[1]
Реализация
Механически инструкция ветвления может изменить счетчик команд (ПК) ЦПУ. Счетчик программ хранит адрес памяти следующей инструкции, которая должна быть выполнена. Следовательно, ветвление может заставить ЦП начать выборку своих инструкций из другой последовательности ячеек памяти.
Когда ветка взят, программный счетчик ЦП установлен на аргумент инструкции перехода. Таким образом, следующая инструкция становится инструкцией по этому адресу в объем памяти. Следовательно, поток управления меняется.
Когда ветка не принято, счетчик программ ЦП не изменяется. Следовательно, следующая выполняемая инструкция - это инструкция после инструкции перехода. Следовательно, поток управления не изменился.
Период, термин ветвь может использоваться при ссылке на программы на языках высокого уровня, а также на программы, написанные на Машинный код или язык ассемблера. В языки программирования высокого уровня, ветви обычно имеют форму условные утверждения различных форм, которые инкапсулируют последовательность инструкций, которая будет выполняться при выполнении условий. Инструкции безусловного перехода, такие как ПЕРЕЙТИ К используются для безоговорочного «перехода» к другой последовательности команд (начала выполнения).
Инструкции ветвления машинного уровня иногда называют Прыгать инструкции. Инструкции по переходу на машинный уровень обычно имеют безусловный и условный формы, где последние могут быть взят или не принято в зависимости от некоторых условий. Обычно существуют различные формы прыжков в одну сторону, часто называемые Прыгать и вызовы подпрограмм, известные как вызов которые автоматически сохраняют исходный адрес как адрес возврата в стеке, позволяя вызывать одну подпрограмму из нескольких мест в коде.
В процессорах с регистры флагов, более ранняя инструкция устанавливает условие в регистре флагов. Более ранняя инструкция может быть арифметика или логика инструкция. Часто это близко к ветке, хотя не обязательно инструкция немедленно перед веткой. Сохраненное условие затем используется в такой ветви, как перейти, если установлен флаг переполнения. Эта временная информация часто хранится в регистре флагов, но также может располагаться в другом месте. Конструкция регистра флага проста на более медленных и простых компьютерах. В быстрых компьютерах регистр флага может стать узким местом для скорости, потому что инструкции, которые в противном случае могли бы работать параллельно (в нескольких исполнительные единицы) необходимо установить биты флага в определенной последовательности.
Существуют также машины (или конкретные инструкции), где условие может быть проверено самой инструкцией перехода, например ветка <метка>, если регистр X отрицательный. В простых компьютерных схемах ветви сравнения выполняют больше арифметических операций и могут потреблять больше энергии, чем ветви регистров флагов. В быстрых компьютерных проектах ветви сравнения могут работать быстрее, чем ветви регистров флагов, потому что ветви сравнения могут обращаться к регистрам с большим параллелизмом, используя те же механизмы процессора, что и вычисления.
Некоторые ранние и простые архитектуры ЦП, все еще встречающиеся в микроконтроллерах, могут не реализовывать условный переход, а только условную операцию «пропустить следующую инструкцию». Таким образом, условный переход или вызов реализуется как условный пропуск инструкции безусловного перехода или вызова.
Примеры
В зависимости от компьютерная архитектура, то язык ассемблера мнемонический для инструкции перехода обычно является сокращенной формой слова Прыгать или слово ветвь, часто вместе с другими информативными буквами (или дополнительным параметром), представляющими условие. Иногда также включаются другие детали, такие как диапазон перехода (размер смещения) или специальный режим адресации, который следует использовать для определения фактического эффективного смещения.
В этой таблице перечислены инструкции ветвления или перехода на машинном уровне, встречающиеся в нескольких хорошо известных архитектурах:
условие или результат | x86 | ПДП-11, ВАКС | ARM (частично 6502) | уравнение |
---|---|---|---|---|
ноль (означает, что для sub / cmp равно) | JZ; JNZ | БЫТЬ Q; BNE | БЫТЬ Q; BNE | нуль; не ноль |
отрицательный (N), знак (S) или минус (M) | JS; JNS | ИМТ; BPL | ИМТ; BPL | отрицательный; не отрицательный |
арифметическое переполнение (флаг называется O или V) | ДЖО; JNO | БВС; BVC | БВС; BVC | перелив; не переполняться |
перенос (от add, cmp, shift и т. д.) | JC; JNC | BCS; BCC | BCS; BCC | нести; не носить |
беззнаковый ниже (ниже) | JB | BLO | BLO * | одолжить |
беззнаковый ниже или равно (ниже или равно) | JBE | BLOS | BLS * | одолжить или ноль |
беззнаковый выше или равно (выше или равно) | JAE | BHIS | BHS * | не брать в долг |
беззнаковый выше (выше) | JA | BHI | BHI * | не брать и не ноль |
подписанный меньше, чем | JL | BLT | BLT | знак ≠ переполнение |
подписанный меньше или равно | JLE | BLE | BLE | (знак ≠ переполнение) или ноль |
подписанный больше или равно | JGE | BGE | BGE | знак = переполнение |
подписанный лучше чем | JG | BGT | BGT | (знак = переполнение) а не ноль |
* x86, PDP-11, VAX и некоторые другие устанавливают флаг переноса на одолжить и снимите флаг переноса, чтобы сигнализировать без займа. РУКА, 6502, PIC и некоторые другие делают противоположное для операций вычитания. Эта инвертированная функция флага переноса для определенных инструкций отмечена (*), это, заимствовать =не нести в некоторых частях таблицы, но, если не указано иное, одолжите. Однако аддитивные операции переноса выполняются одинаково в большинстве архитектур.
Проблемы производительности с инструкциями веток
Для достижения высокой производительности современные процессоры конвейерный. Они состоят из нескольких частей, каждая из которых частично обрабатывает инструкцию, передает свои результаты следующему этапу конвейера и начинает работу над следующей инструкцией в программе. Этот дизайн предполагает, что инструкции будут выполняться в определенной неизменной последовательности. Инструкции условного перехода делают невозможным знание этой последовательности. Таким образом, условные переходы могут вызывать «сбои», при которых конвейер должен быть перезапущен в другой части программы.
Повышение производительности за счет сокращения киосков в филиалах
Некоторые методы повышают скорость за счет уменьшения задержек из условных ветвей.
Подсказки предсказания ветвления
Исторически сложилось так, что для прогнозирования ветвлений использовалась статистика, а результат использовался для оптимизации кода. Программист компилирует тестовую версию программы и запускает ее с тестовыми данными. Код теста подсчитывал, как на самом деле были взяты ветки. Статистические данные из тестового кода затем использовались компилятором для оптимизации ветвей выпущенного кода. Оптимизация будет обеспечивать, чтобы самое быстрое направление ветвления (принятое или нет) всегда было наиболее часто используемым путем потока управления. Чтобы разрешить это, процессоры должны быть спроектированы (или, по крайней мере, иметь) предсказуемую синхронизацию ветвления. Некоторые процессоры имеют наборы инструкций (например, Питание ISA), которые были разработаны с помощью «подсказок ветвлений», чтобы компилятор мог сообщить процессору, как следует использовать каждую ветвь.
Проблема с прогнозированием веток программного обеспечения заключается в том, что он требует сложного процесса разработки программного обеспечения.
Предикторы аппаратного перехода
Для запуска любого софта, оборудования предикторы ветвления перенес статистику в электронику. Предикторы перехода - это части процессора, которые угадывают результат условного перехода. Затем логика процессора делает ставку на предположение, начиная выполнять ожидаемый поток команд. Пример простой схемы аппаратного прогнозирования ветвлений - предположить, что все обратные ветки (то есть к меньшему программному счетчику) взяты (потому что они являются частью цикла), а все прямые ветки (к большему счетчику программ) не берутся. (потому что они оставляют петлю). Улучшенные предикторы ветвлений разрабатываются и проверяются статистически путем их моделирования в различных тестовых программах. Хорошие предикторы обычно подсчитывают результаты предыдущих выполнений ветки. Тогда более быстрые и дорогие компьютеры могут работать быстрее, если вложить средства в лучшую электронику прогнозирования ветвлений. В ЦП с аппаратным предсказанием ветвления подсказки ветвления позволяют предположительно лучшему предсказанию ветвления компилятора перекрывать более упрощенное аппаратное предсказание ветвления.
Безотказный код
Некоторая логика может быть написана без ветвей или с меньшим количеством ветвей. Часто можно использовать побитовые операции, условные ходы или другой предикация вместо веток.[2][3] Фактически, код без ветвлений необходим для криптографии из-за время атаки.[4]
Слот задержки
Другой метод - это слот задержки перехода. В этом подходе всегда выполняется одна инструкция после перехода. Следовательно, компьютер может использовать эту инструкцию для выполнения полезной работы независимо от того, остановился ли его конвейер. Этот подход был исторически популярен в RISC компьютеры. В семействе совместимых процессоров он усложняет многоцикловые процессоры (без конвейера), более быстрые процессоры с более длинными, чем ожидалось, конвейерами и суперскалярные процессоры (которые могут выполнять инструкции не по порядку).
Смотрите также
- Слот задержки перехода
- Предикация ветви
- Таблица ответвлений
- Условный (программирование)
- Поток управления
- Косвенное отделение
- Счетчик команд
- Подпрограмма
- Код спагетти
Заметки
- ^ По крайней мере, концептуально; увидеть внеочередное исполнение.
использованная литература
- ^ "Обзор методов динамического прогнозирования ветвлений", С. Миттал, CPE 2018
- ^ Кнут, Дональд (2008). Искусство программирования. Том 4, Пре-глава 1A (Редакция 6-го издания). С. 48–49.
- ^ «Избегая ветвей». Вики по программированию.
- ^ «Постоянная криптовалюта». BearSSL.
внешние ссылки
- Бесплатная документация для IA-32 и x86-64, предоставлено Intel
- FAQ по PDP-11
- Набор инструкций ARM