ARM (Advanced RISC Machines) là một kiến trúc tập lệnh được sử dụng rộng rãi trong các thiết bị điện tử, từ điện thoại thông minh đến máy chủ. Hiểu về số lượng và chức năng của thanh ghi trong ARM là rất quan trọng cho việc lập trình và tối ưu hóa hiệu năng. Vậy ARM có bao nhiêu thanh ghi?
Theo tài liệu tham khảo của ARM, hầu hết các phiên bản ARM đều có 30 thanh ghi đa năng 32-bit. Ngoại lệ duy nhất là các bộ xử lý dựa trên ARMv6-M và ARMv7-M. Trong số này, 16 thanh ghi đầu tiên (r0-r15) có thể truy cập ở chế độ người dùng, trong khi các thanh ghi còn lại chỉ khả dụng trong chế độ đặc quyền (privileged mode). Bài viết này sẽ tập trung vào 16 thanh ghi r0-r15, được chia thành hai nhóm: thanh ghi đa năng và thanh ghi mục đích đặc biệt.
Phân loại thanh ghi ARM
# | Bí danh | Mục đích sử dụng |
---|---|---|
R0 | – | Đa năng |
R1 | – | Đa năng |
R2 | – | Đa năng |
R3 | – | Đa năng |
R4 | – | Đa năng |
R5 | – | Đa năng |
R6 | – | Đa năng |
R7 | – | Lưu trữ số hiệu Syscall |
R8 | – | Đa năng |
R9 | – | Đa năng |
R10 | – | Đa năng |
R11 | FP | Con trỏ khung (Frame Pointer) |
R12 | IP | Gọi nội bộ thủ tục (Intra Procedural Call) |
R13 | SP | Con trỏ ngăn xếp (Stack Pointer) |
R14 | LR | Thanh ghi liên kết (Link Register) |
R15 | PC | Bộ đếm chương trình (Program Counter) |
CPSR | – | Thanh ghi trạng thái chương trình hiện tại (Current Program Status Register) |


So sánh thanh ghi ARM và x86
Bảng dưới đây so sánh tương quan giữa các thanh ghi ARM và Intel x86:
ARM | Mô tả | x86 |
---|---|---|
R0 | Đa năng | EAX |
R1-R5 | Đa năng | EBX, ECX, EDX, ESI, EDI |
R6-R10 | Đa năng | – |
R11 (FP) | Con trỏ khung | EBP |
R12 (IP) | Gọi nội bộ thủ tục | – |
R13 (SP) | Con trỏ ngăn xếp | ESP |
R14 (LR) | Thanh ghi liên kết | – |
R15 (PC) | Bộ đếm chương trình | EIP |
CPSR | Thanh ghi trạng thái/Cờ | EFLAGS |
Chức năng của một số thanh ghi quan trọng
R0-R12: Được sử dụng để lưu trữ các giá trị tạm thời, con trỏ đến bộ nhớ,… R0 có thể được sử dụng như bộ tích lũy trong các phép toán số học hoặc lưu trữ kết quả của hàm được gọi trước đó. R7 lưu trữ số hiệu syscall. R11 hoạt động như con trỏ khung, giúp theo dõi ranh giới trên ngăn xếp. R0-R3 cũng được sử dụng để lưu trữ bốn đối số đầu tiên của một hàm.
R13 (SP): Con trỏ ngăn xếp, trỏ đến đỉnh của ngăn xếp. Ngăn xếp là một vùng nhớ được sử dụng để lưu trữ dữ liệu cụ thể của hàm và được thu hồi khi hàm trả về.
R14 (LR): Khi một hàm được gọi, LR sẽ được cập nhật với địa chỉ bộ nhớ của lệnh tiếp theo sau khi hàm được gọi. Điều này cho phép chương trình quay lại hàm “cha” sau khi hàm “con” hoàn thành.
R15 (PC): Bộ đếm chương trình, tự động tăng lên theo kích thước của lệnh được thực thi. PC lưu trữ địa chỉ của lệnh hiện tại cộng thêm 8 (hai lệnh ARM) trong chế độ ARM và cộng thêm 4 (hai lệnh Thumb) trong chế độ Thumb(v1). Khác với x86, PC trong ARM không trỏ đến lệnh tiếp theo sẽ được thực thi mà trỏ đến lệnh tiếp theo cộng thêm hai lệnh nữa. Điều này là do các bộ xử lý ARM cũ luôn tìm nạp hai lệnh trước lệnh hiện tại để tăng hiệu suất.
Kết luận
Số lượng thanh ghi trong ARM là 30 (32-bit), với 16 thanh ghi (r0-r15) thường được sử dụng nhất trong lập trình. Mỗi thanh ghi có chức năng riêng, đóng vai trò quan trọng trong việc thực thi chương trình và quản lý bộ nhớ. Hiểu rõ về các thanh ghi này sẽ giúp lập trình viên viết mã hiệu quả hơn trên kiến trúc ARM.