6. Инструкции сравнения¶
Они выполняют арифметическую или логическую инструкцию над двумя аргументами, отбрасывая результат, но устанавливая флаги условий. Обычно они используются для проверки значений данных без их изменения перед выполнением условного перехода.
6.1. Соглашения документа¶
Обозначения: Rd, Rm, Rn обозначают регистры ARM R0-R7. imm8 обозначает непосредственное значение шириной 8 бит.
6.2. Регистр состояния прикладной программы (APSR)¶
Он содержит четыре бита, которые проверяются инструкциями условного перехода. Обычно условный переход проверяет несколько бит, например bge(LABEL). Значение кодов условий может зависеть от того, рассматриваются ли операнды арифметической инструкции как знаковые или беззнаковые целые числа. Так, bhi(LABEL) предполагает, что обрабатывались беззнаковые числа, тогда как bgt(LABEL) предполагает знаковые операнды.
6.3. Биты APSR¶
Z (ноль)
Устанавливается, если результат операции равен нулю или операнды сравнения равны.
N (отрицательный)
Устанавливается, если результат отрицательный.
C (перенос)
Сложение устанавливает флаг переноса, когда результат выходит за пределы старшего значащего бита (MSB), например при сложении 0x80000000 и 0x80000000. В силу природы арифметики дополнения до двух это поведение обратно при вычитании, причём заём обозначается сброшенным битом переноса. Так, 0x10 - 0x01 выполняется как 0x10 + 0xffffffff, что установит бит переноса.
V (переполнение)
Флаг переполнения устанавливается, если результат, рассматриваемый как число в дополнительном коде, имеет «неправильный» знак по отношению к операндам. Например, добавление 1 к 0x7fffffff установит бит переполнения, поскольку результат (0x80000000), рассматриваемый как целое в дополнительном коде, отрицателен. Заметьте, что в этом случае бит переноса не устанавливается.
6.4. Инструкции сравнения¶
Они устанавливают флаги N (отрицательный), Z (ноль), C (перенос) и V (переполнение) регистра APSR (Регистр состояния прикладной программы).
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Условное выполнение¶
Инструкции it и ite предоставляют средство условного выполнения от одной до четырёх последующих инструкций без необходимости в метке.
it(<condition>) If then (если, то)
Выполнить следующую инструкцию, если <condition> истинно:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else (если, то, иначе)
Если <condition> истинно, выполнить следующую инструкцию, в противном случае выполнить следующую за ней. Таким образом:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Это может быть расширено для управления выполнением до четырёх последующих инструкций: it[x[y[z]]], где x,y,z=t/e; например, itt, itee, itete, ittte, itttt, iteee и т. д.