6. Instruksi perbandingan

Instruksi-instruksi ini melakukan instruksi aritmetika atau logika pada dua argumen, membuang hasilnya tetapi menyetel flag kondisi. Biasanya instruksi ini digunakan untuk menguji nilai data tanpa mengubahnya sebelum menjalankan cabang kondisional.

6.1. Konvensi dokumen

Notasi: Rd, Rm, Rn menunjukkan register ARM R0-R7. imm8 menunjukkan nilai langsung yang memiliki lebar 8 bit.

6.2. Application Program Status Register (APSR)

Register ini berisi empat bit yang diuji oleh instruksi cabang kondisional. Biasanya cabang kondisional akan menguji beberapa bit, misalnya bge(LABEL). Arti kode kondisi dapat bergantung pada apakah operand instruksi aritmetika dipandang sebagai bilangan bulat bertanda tangan atau tidak bertanda tangan. Dengan demikian bhi(LABEL) mengasumsikan bilangan tak bertanda tangan sedangkan bgt(LABEL) mengasumsikan operand bertanda tangan.

6.3. Bit APSR

  • Z (nol)

Ini disetel jika hasil operasi adalah nol atau operand perbandingan sama.

  • N (negatif)

Disetel jika hasilnya negatif.

  • C (carry)

Penjumlahan menyetel flag carry ketika hasil meluap keluar dari MSB, misalnya menambahkan 0x80000000 dan 0x80000000. Karena sifat aritmetika komplemen dua, perilaku ini terbalik pada pengurangan, dengan pinjaman ditunjukkan oleh bit carry yang clear. Dengan demikian 0x10 - 0x01 dieksekusi sebagai 0x10 + 0xffffffff yang akan menyetel bit carry.

  • V (overflow)

Flag overflow disetel jika hasilnya, dipandang sebagai bilangan komplemen dua, memiliki tanda "salah" dalam hubungannya dengan operand. Misalnya menambahkan 1 ke 0x7fffffff akan menyetel bit overflow karena hasilnya (0x80000000), dipandang sebagai bilangan bulat komplemen dua, adalah negatif. Perhatikan bahwa dalam kasus ini bit carry tidak disetel.

6.4. Instruksi perbandingan

Instruksi ini menyetel flag N (negatif), Z (nol), C (carry) dan V (overflow) dari APSR (Application Program Status Register).

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. Eksekusi kondisional

Instruksi it dan ite menyediakan cara untuk mengeksekusi satu hingga empat instruksi berikutnya secara kondisional tanpa memerlukan label.

  • it(<condition>) If then

Eksekusi instruksi berikutnya jika <condition> benar:

cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
  • ite(<condition>) If then else

Jika <condition> benar, eksekusi instruksi berikutnya, jika tidak eksekusi instruksi setelahnya. Dengan demikian:

cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here

Ini dapat diperluas untuk mengontrol eksekusi hingga empat instruksi berikutnya: it[x[y[z]]] di mana x,y,z=t/e; misalnya itt, itee, itete, ittte, itttt, iteee, dll.