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 - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(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 เป็นต้น