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 (перенесення)

Додавання встановлює прапорець перенесення, коли результат виходить за межі старшого біту, наприклад при додаванні 0x80000000 та 0x80000000. Через природу арифметики доповнення до двох ця поведінка є зворотною при відніманні: запозичення позначається очищеним бітом перенесення. Таким чином, 0x10 - 0x01 виконується як 0x10 + 0xffffffff, що встановить біт перенесення.

  • V (переповнення)

Прапорець переповнення встановлюється, якщо результат, розглянутий як число у доповненні до двох, має «неправильний» знак відносно операндів. Наприклад, додавання 1 до 0x7fffffff встановить біт переповнення, оскільки результат (0x80000000), розглянутий як ціле число у доповненні до двох, є від’ємним. Зауважте, що в цьому випадку біт перенесення не встановлюється.

6.4. Інструкції порівняння

Вони встановлюють прапорці N (від’ємне), Z (нуль), C (перенесення) та V (переповнення) APSR (регістру стану програми).

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. Умовне виконання

Інструкції it та ite надають засіб умовного виконання від однієї до чотирьох наступних інструкцій без необхідності використання мітки.

  • it(<condition>) Якщо, то

Виконати наступну інструкцію, якщо <condition> є істинною:

cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
  • ite(<condition>) Якщо, то, інакше

Якщо <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 тощо.