7. Các lệnh rẽ nhánh

Các lệnh này khiến quá trình thực thi nhảy đến vị trí đích thường được chỉ định bởi một nhãn (xem chỉ thị assembler label()). Các nhánh có điều kiện và các lệnh itite kiểm tra các cờ N (âm), Z (không), C (nhớ) và V (tràn) của Thanh ghi Trạng thái Chương trình Ứng dụng (APSR) để xác định xem nhánh có được thực thi hay không.

Hầu hết các lệnh assembler được cung cấp (bao gồm cả các thao tác di chuyển) đều đặt cờ, nhưng có các lệnh so sánh rõ ràng để cho phép kiểm tra các giá trị.

Chi tiết thêm về ý nghĩa của các cờ điều kiện được cung cấp trong phần lệnh so sánh.

7.1. Quy ước tài liệu

Ký hiệu: Rm biểu thị các thanh ghi ARM R0-R15. LABEL biểu thị một nhãn được định nghĩa bằng chỉ thị assembler label(). <condition> biểu thị một trong các chỉ định điều kiện sau:

  • eq Bằng nhau (kết quả bằng không)

  • ne Không bằng nhau

  • cs Cờ nhớ được đặt

  • cc Cờ nhớ bị xóa

  • mi Âm (negative)

  • pl Dương (positive)

  • vs Cờ tràn được đặt

  • vc Cờ tràn bị xóa

  • hi > (so sánh không dấu)

  • ls <= (so sánh không dấu)

  • ge >= (so sánh có dấu)

  • lt < (so sánh có dấu)

  • gt > (so sánh có dấu)

  • le <= (so sánh có dấu)

7.2. Rẽ nhánh đến nhãn

  • b(LABEL) Rẽ nhánh vô điều kiện

  • beq(LABEL) rẽ nhánh nếu bằng nhau

  • bne(LABEL) rẽ nhánh nếu không bằng nhau

  • bge(LABEL) rẽ nhánh nếu lớn hơn hoặc bằng

  • bgt(LABEL) rẽ nhánh nếu lớn hơn

  • blt(LABEL) rẽ nhánh nếu nhỏ hơn (<) (có dấu)

  • ble(LABEL) rẽ nhánh nếu nhỏ hơn hoặc bằng (<=) (có dấu)

  • bcs(LABEL) rẽ nhánh nếu cờ nhớ được đặt

  • bcc(LABEL) rẽ nhánh nếu cờ nhớ bị xóa

  • bmi(LABEL) rẽ nhánh nếu âm

  • bpl(LABEL) rẽ nhánh nếu dương

  • bvs(LABEL) rẽ nhánh nếu cờ tràn được đặt

  • bvc(LABEL) rẽ nhánh nếu cờ tràn bị xóa

  • bhi(LABEL) rẽ nhánh nếu cao hơn (không dấu)

  • bls(LABEL) rẽ nhánh nếu thấp hơn hoặc bằng (không dấu)

7.3. Các nhánh dài

Mã được tạo ra bởi các lệnh rẽ nhánh được liệt kê ở trên sử dụng độ rộng bit cố định để chỉ định đích rẽ nhánh, là tương đối so với PC. Do đó, trong các chương trình dài khi lệnh rẽ nhánh ở xa đích, trình lắp ráp sẽ tạo ra lỗi "branch not in range". Điều này có thể được khắc phục bằng các biến thể "rộng" như

  • beq_w(LABEL) rẽ nhánh dài nếu bằng nhau

Các nhánh rộng sử dụng 4 byte để mã hóa lệnh (so với 2 byte cho các lệnh rẽ nhánh tiêu chuẩn).

7.4. Chương trình con (hàm)

Khi vào một chương trình con, bộ xử lý lưu địa chỉ trả về trong thanh ghi r14, còn được gọi là thanh ghi liên kết (lr). Việc trả về lệnh sau lời gọi chương trình con được thực hiện bằng cách cập nhật bộ đếm chương trình (r15 hoặc pc) từ thanh ghi liên kết. Quá trình này được xử lý bởi các lệnh sau.

  • bl(LABEL)

Chuyển quyền thực thi đến lệnh sau LABEL, lưu địa chỉ trả về vào thanh ghi liên kết (r14).

  • bx(Rm) Rẽ nhánh đến địa chỉ được chỉ định bởi Rm.

Thông thường bx(lr) được sử dụng để trả về từ một chương trình con. Đối với các chương trình con lồng nhau, thanh ghi liên kết của các phạm vi ngoài phải được lưu (thường trên ngăn xếp) trước khi thực hiện các lời gọi chương trình con bên trong.