6. Các lệnh so sánh¶
Những lệnh này thực hiện một lệnh số học hoặc logic trên hai đối số, loại bỏ kết quả nhưng thiết lập các cờ điều kiện. Thông thường chúng được sử dụng để kiểm tra các giá trị dữ liệu mà không thay đổi chúng trước khi thực thi một nhánh có điều kiện.
6.1. Quy ước tài liệu¶
Ký hiệu: Rd, Rm, Rn biểu thị các thanh ghi ARM R0-R7. imm8 biểu thị một giá trị tức thì có độ rộng 8 bit.
6.2. Thanh ghi trạng thái chương trình ứng dụng (APSR)¶
Thanh ghi này chứa bốn bit được kiểm tra bởi các lệnh nhánh có điều kiện. Thông thường một nhánh có điều kiện sẽ kiểm tra nhiều bit, ví dụ: bge(LABEL). Ý nghĩa của các mã điều kiện có thể phụ thuộc vào việc các toán hạng của một lệnh số học được xem là số nguyên có dấu hay không dấu. Vì vậy bhi(LABEL) giả định các số không dấu được xử lý trong khi bgt(LABEL) giả định các toán hạng có dấu.
6.3. Các bit APSR¶
Z (zero)
Bit này được đặt nếu kết quả của một phép toán là không hoặc các toán hạng của một phép so sánh bằng nhau.
N (âm)
Được đặt nếu kết quả là âm.
C (carry)
Phép cộng đặt cờ carry khi kết quả tràn ra ngoài MSB, ví dụ cộng 0x80000000 và 0x80000000. Do bản chất của số học bù hai, hành vi này bị đảo ngược khi trừ, với việc mượn được biểu thị bằng bit carry bị xóa. Vì vậy 0x10 - 0x01 được thực thi dưới dạng 0x10 + 0xffffffff sẽ đặt bit carry.
V (overflow)
Cờ overflow được đặt nếu kết quả, khi xem như một số bù hai, có dấu "sai" so với các toán hạng. Ví dụ, cộng 1 vào 0x7fffffff sẽ đặt bit overflow vì kết quả (0x80000000), khi xem như một số nguyên bù hai, là âm. Lưu ý rằng trong trường hợp này bit carry không được đặt.
6.4. Các lệnh so sánh¶
Những lệnh này thiết lập các cờ N (âm), Z (zero), C (carry) và V (overflow) của APSR (Application Program Status Register).
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Thực thi có điều kiện¶
Các lệnh it và ite cung cấp phương tiện để thực thi có điều kiện từ một đến bốn lệnh tiếp theo mà không cần nhãn.
it(<condition>) Nếu thì
Thực thi lệnh tiếp theo nếu <condition> là đúng:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) Nếu thì, ngược lại
Nếu <condition> là đúng, thực thi lệnh tiếp theo, ngược lại thực thi lệnh sau đó. Vì vậy:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Điều này có thể được mở rộng để kiểm soát việc thực thi lên đến bốn lệnh tiếp theo: it[x[y[z]]] trong đó x,y,z=t/e; ví dụ: itt, itee, itete, ittte, itttt, iteee, v.v.