Обычно флаги ЦП используются для выполнения условных операций.
(Исключением является флаг переноса, который используется как для условных операций, так и для переноса в операциях, таких как надстройка-приносить или вычитать с заимствованием.)
На процессорах ARM вы можете выполнить любую инструкцию, основанную на нулевом флаге: например, инструкция ldmeqda
будет делать то же самое, что и инструкция ldmda
, если нольфлаг установлен;он ничего не сделает, когда флаг нуля будет снят.
Обычно вы сначала выполняете вычитание (используя инструкцию cmp
), чтобы сравнить два числа.Нулевой флаг устанавливается, если оба числа равны.Следующая инструкция (и) должна выполняться только в том случае, если два числа (не) равны, поэтому вы выполняете инструкции, основываясь на состоянии нулевого флага.
(Инструкция cmp
выполняет вычитание и отбрасывает результат! Это означает, что эта инструкция устанавливает флаги только на основе результата вычитания. Это полезно, когда C o MP с двумя числамиВот почему инструкция называется cmp
.)
На большинстве других процессоров, которые имеют флаги (не у всех процессоров они есть), вы можете выполнять только переходы (ветки), основываясь на состояниях флагов.
Что вы делаете, вы перепрыгиваете через инструкции, которые не должны выполняться, если флаг имеет неправильное состояние.
Пример (x86):
someloop:
mov eax, [esi]
add esi, 20
add eax, 1234
# The zero flag will be set if the result is 0
# The next instruction will jump if the zero flag is set
jz skipif
# We only get here if the zero flag is clear
# This corresponds to "if(eax!=0)" in C
mov [esi-10],bl
skipif:
dec edx
# The zero flag is set if edx is not 0
# Jump back to "someloop" if this is the case
# This corresponds to a "do { ... } while((--edx)!=0);"
# loop in C
jnz someloop