2013-06-24 3 views
7

Недавно я прошел курс цифровой логики и узнал все о AND, OR и различных других видах логики. Одна вещь, которую мы не затрагивали, которая совершенно необходима для программирования, - это заявления if, и мне очень любопытно, как они работают.Что такое инструкция «if» на уровне транзисторов?

Моя лучшая догадка заключается в том, что это будет просто мультиплексор 2: 1, и поскольку вы добавляете больше else операторов, это может быть 4: 1 и 8: 1, но это кажется слишком сложным для такой простой концепции.

Кто-нибудь знает, что на самом деле означает заявление if?

+0

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

+0

@wug это отличная идея, спасибо. – Nealon

ответ

1

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

Так if (a + 4 > 5) инструкция будет загружать a в регистр, другая инструкция добавит 4, другая инструкция будет сравнивать сумму 5. Затем команда проверит «код условия» из сравнения и либо выполнит сразу следующую инструкцию (выполнение «if body»), либо «прыжок» в место в памяти несколько (или нескольких десятков) инструкций (пропуская " if корпус ").

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

+0

хорошо, что нет, где рядом с захватывающим ... штопать. Спасибо, хотя – Nealon

+0

@Nealon - Есть компьютеры, которые намного «приближаются к силикону». Я работал над тем, где выбор следующей команды управлялся программируемым логическим массивом - по существу массивным массивом AND/OR. Положите условия и выйдите из следующего адреса инструкции, и выбор может быть между 10-20 различными «целями филиала», если это имеет смысл. –

+0

Да, мы узнали о PLA в этом классе. Это интересно, но я действительно надеялся, что это будет более интересно. По сути, (и я знаю, что я, вероятно, окутываю его), кучу «goto', верно? – Nealon

1

Правильное утверждение if означает нечто более высокоуровневое, чем транзисторная логика. Операторы if обычно реализуются как условные ветви (при отсутствии оптимизаций), либо увеличивая счетчик программы на величину по умолчанию, либо устанавливая ее на значение, указанное в ветке, на основании того, было ли условие оценено как true или false (обычно 1 или 0).

0

if - это операция управления потоком в языке программирования, а не концепция, выражаемая в цифровой логике. Если ваш класс охватывает машины, связанные с инструкциями по сборке, такие как jump (я не уверен, что я когда-либо узнал об этом), вот что делает заявление if.

-1

Как указывали выше, существуют логические компараторы, которые в конечном итоге принимают эти решения. Существует множество различных реализаций компараторов в зависимости от потребностей проекта (мощность, площадь, качели, синхронизация или нет, ect.). Компараторы состоят из ряда CMOS-мотивов NMOS/CMOS.

Посмотрите на страницу wikipedia для компараторов и посмотрите на динамический фиксированный компаратор. К сожалению, мне не хватает репутации.

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

1

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

Все инструкции, которые выполняет ваш компьютер, поступают из памяти команд, и я считаю, что есть число, представляющее адрес исполняемой команды.

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

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

enter image description here

1

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

При использовании, если заявление, как этот:

int a = 1, b = 0 
if (a > b) 
{ 
    ... 

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

my_if_statement: 
    CMP eax, ebx # intrinsically works by subtracting ebx from eax 
         # eax and ebx are not changed, but the arithmetic flags are 

         # if it was greater, jump to greater label 
    JG my_if_statement_was_true 

         # if it wasn't greater, we get here 
my_if_statement_was_false: 
         # do something 
         # we're now done, so jump to the end of the statement 
    J  my_if_statement_end 

my_if_statement_was_true: 
         # do something else 
         # now we're done with the if statement 
my_if_statement_end: 
         # program continues 

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

  1. Во-первых, инструкция CMP вычитает второй операнд из первого и отбрасывает результат. Однако регистр FLAGS обновляется с результатами арифметической операции.
  2. Затем инструкция JG проверяет, установлен ли флаг GREATER в регистре FLAGS. Так как в нашем примере (напомним, что 1> 0), он выполняет скачок.
  3. Команда перехода изменяет счетчик программ (ПК), который является регистром, который контролирует, где ЦП будет читать следующую инструкцию.
  4. Затем CPU пытается прочитать следующую инструкцию. Поскольку мы прыгнули, следующая инструкция не та, которая сразу же после ранее обработанной.

Это обзор процесса. Если вы хотите получить более подробное объяснение, я рекомендую вам написать простую программу на языке С с инструкцией if, скомпилировать ее, разобрать (используя linux objdump или эквивалент) и, возможно, прикрепить к нему отладчик и запустить его.

linux objdump manual

Чтобы показать следующая команда должна быть выполнена в gdb, используйте display/i $pc

1

Если вы просто обеспокоены реализации, если условие то, его простой,

вы, вероятно, читали цифровые дизайн Morris Mano, там простая схема для сравнения двух регистров, кстати, логика проста, если вы задумаетесь об этом.

a>b OR a<b OR a==b all these 3 instructions can be implemented easily 
    by just comparing the two registers 

Теперь, если вы обеспокоены тем, как если утверждение, что, как на самом деле это реализуется в CPU затем проходит через 3 стадии цикла Fetch, Decode и выполнение.

После этого регистры сравниваются, как указано ранее.

Надеюсь, это поможет .. :)

+0

Это был скорее вопрос безвестности, и об этом ответили некоторое время назад, спасибо. – Nealon

Смежные вопросы