Процессор имеет инструкции "Ветвление, если", что при выполнении определенного условия он разветвляется, а в противном случае он переходит к следующей инструкции.
Так
if(A)
{
dosomething;
}
станет
load A into register 0
if the zero flag is set (ie, register 0 contains 0x00) then jump to endcondition)
dosomething
endcondition:
Более сложные условия (if(A || B && C)
) становятся последовательностью инструкций, которая оставляет регистр в нулевом или нулевом состоянии, поэтому команда branchif может переходить или не переходить на основе условных флагов.
Существует много условных флагов (ноль, перенос, отрицание, переполнение и т. Д.), И некоторые команды ветвления также работают в более сложных условиях (т. Е. Могут фактически проверять, равен ли регистр другому регистру, а не просто смотря на флаги). Каждая архитектура отличается и делает компромиссы, поэтому набор инструкций полон, но также быстр и компактен.
Как указывает Муча в комментариях, некоторые архитектуры позволяют применять условные выражения к некоторым, многим или даже ко всем инструкциям, поэтому вы можете иметь не только инструкции «ветвь если», но также «и если», добавить if ',' move if 'и т. д.
x86 очень, очень, очень сложен, за исключением этого простого объяснения, как только вы приступите к конвейерной обработке, выполнению не по порядку, кешированию, микрокоду и всем другим сложным темам. Для большинства целей приведенного выше объяснения достаточно. Однако, если вы пишете очень и очень тщательно разработанный алгоритм, созданный вручную, вам придется учитывать эти факторы для максимальной производительности и пропускной способности.
Это тема для другого вопроса, хотя ...
-Adam