6. คำสั่งเปรียบเทียบ

คำสั่งเหล่านี้ดำเนินการคำสั่งคำนวณหรือตรรกะกับอาร์กิวเมนต์สองตัว ทิ้งผลลัพธ์แต่ตั้งแฟล็กเงื่อนไข โดยทั่วไปใช้เพื่อทดสอบค่าข้อมูลโดยไม่เปลี่ยนแปลงก่อนที่จะดำเนินการ branch แบบมีเงื่อนไข

6.1. รูปแบบของเอกสาร

สัญกรณ์: Rd, Rm, Rn แทน ARM registers R0-R7 imm8 แทนค่าทันทีที่มีความกว้าง 8 บิต

6.2. Application Program Status Register (APSR)

ประกอบด้วยสี่บิตที่ถูกทดสอบโดยคำสั่ง branch แบบมีเงื่อนไข โดยทั่วไป branch แบบมีเงื่อนไขจะทดสอบหลายบิต เช่น bge(LABEL) ความหมายของรหัสเงื่อนไขอาจขึ้นอยู่กับว่าตัวถูกดำเนินการของคำสั่งคำนวณถูกมองว่าเป็นจำนวนเต็มแบบมีเครื่องหมายหรือไม่มีเครื่องหมาย ดังนั้น bhi(LABEL) สมมติว่าตัวเลขไม่มีเครื่องหมายถูกประมวลผลในขณะที่ bgt(LABEL) สมมติว่าตัวถูกดำเนินการมีเครื่องหมาย

6.3. บิตของ APSR

  • Z (ศูนย์)

ถูกตั้งค่าหากผลลัพธ์ของการดำเนินการเป็นศูนย์ หรือตัวถูกดำเนินการของการเปรียบเทียบเท่ากัน

  • N (ลบ)

ถูกตั้งค่าหากผลลัพธ์เป็นลบ

  • C (carry)

การบวกตั้งแฟล็ก carry เมื่อผลลัพธ์ overflow ออกจาก MSB เช่น การบวก 0x80000000 และ 0x80000000 โดยธรรมชาติของการคำนวณแบบ two's complement พฤติกรรมนี้จะกลับกันในการลบ โดย borrow ถูกบ่งชี้ด้วยบิต carry ที่ถูก clear ดังนั้น 0x10 - 0x01 จะดำเนินการเป็น 0x10 + 0xffffffff ซึ่งจะตั้งบิต carry

  • V (overflow)

แฟล็ก overflow ถูกตั้งค่าหากผลลัพธ์ เมื่อมองเป็นจำนวน two's complement มีเครื่องหมาย "ผิด" เมื่อเทียบกับตัวถูกดำเนินการ ตัวอย่างเช่น การบวก 1 เข้ากับ 0x7fffffff จะตั้งบิต overflow เพราะผลลัพธ์ (0x80000000) เมื่อมองเป็นจำนวนเต็ม two's complement คือลบ โปรดทราบว่าในกรณีนี้บิต carry ไม่ได้ถูกตั้งค่า

6.4. คำสั่งเปรียบเทียบ

คำสั่งเหล่านี้ตั้งแฟล็ก N (ลบ), Z (ศูนย์), C (carry) และ V (overflow) ของ 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. การดำเนินการแบบมีเงื่อนไข

คำสั่ง it และ ite ให้วิธีการดำเนินการแบบมีเงื่อนไขของคำสั่งถัดไปหนึ่งถึงสี่คำสั่งโดยไม่ต้องใช้ label

  • it(<condition>) If then

ดำเนินการคำสั่งถัดไปหาก <condition> เป็น true:

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

หาก <condition> เป็น true ให้ดำเนินการคำสั่งถัดไป มิฉะนั้นดำเนินการคำสั่งถัดจากนั้น ดังนั้น:

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 เป็นต้น