Tập thanh ghi (Registers)

  • Khái niệm chung về thanh ghi:

    • Thanh ghi (Register) là các ô nhớ dung lượng nhỏ (thường từ 8 bit, 16 bit, 32 bit đến 64 bit) nhưng có tốc độ truy xuất nhanh nhất trong toàn bộ hệ thống máy tính, được tích hợp trực tiếp ngay bên trong chip vi xử lý.

    • Khác với bộ nhớ RAM nằm bên ngoài bo mạch chủ, CPU không mất thời gian gửi tín hiệu qua các tuyến Bus dài để đọc hay ghi thanh ghi. Nhờ đó, việc trao đổi thông tin với thanh ghi chỉ mất một phần nhỏ của chu kỳ xung nhịp.

    • Thanh ghi đóng vai trò là “bàn làm việc tức thời” của CPU, nơi lưu lại địa chỉ đang thực hiện, mã lệnh đang chạy và các kết quả tính toán tạm thời trước khi trả về bộ nhớ chính hoặc thiết bị ngoại vi.

  • Phân loại thanh ghi:

    • Thanh ghi chuyên dụng (Special-Purpose Registers): Là các thanh ghi phục vụ cho mục đích điều khiển hoạt động nội bộ của CPU, người dùng thông thường không thể tự ý ghi đè dữ liệu tùy ý (gồm: PC, IR, SP, MAR, MDR…).

    • Thanh ghi đa năng (General-Purpose Registers) và thanh ghi tích lũy (Accumulator): Là các thanh ghi mà lập trình viên và phần mềm có thể trực tiếp can thiệp để lưu trữ dữ liệu, tính toán số liệu và thao tác logic.

2.1.3.1. Thanh ghi địa chỉ chương trình (Program Counter – PC)

  • Khái niệm và tên gọi:

    • Thanh ghi đếm chương trình (Program Counter – PC), trong một số dòng kiến trúc vi xử lý (như dòng x86 của Intel) còn được gọi là con trỏ chỉ lệnh (Instruction Pointer – IP).

    • Đây là một thanh ghi chuyên dụng đóng vai trò là “kim chỉ nam” dẫn đường cho CPU trong suốt quá trình vận hành chương trình.

  • Chức năng hoạt động:

    • Giữ địa chỉ ô nhớ trong bộ nhớ RAM nơi chứa mã lệnh tiếp theo chuẩn bị được đưa vào CPU để xử lý.

    • Độ rộng bit của thanh ghi PC quyết định trực tiếp khả năng định vị không gian bộ nhớ của bộ xử lý (ví dụ: CPU có đường địa chỉ 16 bit thì thanh ghi PC cũng có độ rộng 16 bit để có thể trỏ tới $2^{16} = 65.536$ vị trí ô nhớ khác nhau).

  • Quy tắc làm việc trong chu trình thực thi:

    • Khi CPU bắt đầu một chu trình mới, giá trị chứa trong PC được gửi qua thanh ghi địa chỉ bộ nhớ (MAR) ra Bus địa chỉ để định vị lệnh trong RAM.

    • Ngay khi mã lệnh được nạp thành công vào bên trong CPU, giá trị của PC sẽ tự động tăng lên để trỏ sẵn tới ô nhớ của lệnh kế tiếp. Mức tăng này phụ thuộc vào kích thước của từ lệnh (tăng 1 byte, 2 byte hoặc 4 byte).

    • Khi gặp các lệnh điều khiển rẽ nhánh hay nhảy vị trí (JUMP, CALL, BRANCH), Khối điều khiển (CU) sẽ ghi đè địa chỉ mới trực tiếp vào thanh ghi PC, làm cho CPU đổi hướng thực thi sang một phân đoạn chương trình hoàn toàn mới thay vì chạy tuần tự từ trên xuống.

  • Ví dụ thực tế:

    • Một chương trình gồm 3 câu lệnh đặt liên tiếp tại các ô nhớ 100, 101, 102:

      • Ban đầu, PC = 100. CPU nạp lệnh tại ô 100.

      • Ngay sau khi nạp xong, PC tự nhảy lên 101.

      • Nếu tại ô 100 là lệnh nhảy JUMP 200, CPU sẽ nạp đè số 200 vào PC, khiến lệnh được nạp ở lượt tiếp theo là lệnh nằm tại ô 200.

2.1.3.2. Thanh ghi lệnh (Instruction Register – IR)

  • Khái niệm và vị trí:

    • Thanh ghi lệnh (Instruction Register – IR) là thanh ghi chuyên dụng nằm ở đầu vào của Khối điều khiển (CU).

    • IR đóng vai trò là “hộp chứa chỉ thị công việc hiện hành” của CPU.

  • Chức năng hoạt động:

    • Lưu trữ chính xác chuỗi bit của mã lệnh vừa được nạp từ bộ nhớ chính (RAM) về thông qua tuyến Bus dữ liệu và thanh ghi đệm dữ liệu (MDR).

    • Giữ nguyên vẹn mã lệnh này trong suốt thời gian Khối điều khiển giải mã và chỉ đạo các bộ phận khác thực hiện.

  • Cơ chế bóc tách nội dung của IR:

    • Sau khi mã lệnh được khóa chặt trong thanh ghi IR, bộ giải mã lệnh (Instruction Decoder) bên trong khối CU sẽ chia từ mã lệnh thành các phần trường bit chuyên trách:

      • Phần mã thao tác (Opcode): Cho biết CPU phải làm hành động gì (như: Đọc, Ghi, Cộng, Nhảy…).

      • Phần toán hạng / địa chỉ (Operand / Address field): Cho biết dữ liệu cần tính toán nằm ở thanh ghi nào hoặc nằm tại ô nhớ RAM nào.

    • Người lập trình không thể đọc hay ghi giá trị trực tiếp vào thanh ghi IR thông qua các câu lệnh; chỉ có cơ chế nạp lệnh tự động của phần cứng CPU mới được quyền cập nhật giá trị cho IR.

2.1.3.3. Thanh ghi con trỏ ngăn xếp (Stack Pointer – SP) và thanh ghi cơ sở (Base)

  • Thanh ghi con trỏ ngăn xếp (Stack Pointer – SP):

    • Vùng nhớ ngăn xếp (Stack): Là một vùng nhớ đặc thù trong RAM hoạt động theo cơ chế vào sau – ra trước (LIFO: Last In, First Out), được hệ điều hành và CPU dùng để tạm cất các dữ liệu phục vụ lời gọi hàm (Subroutine), chương trình con và địa chỉ quay về khi có ngắt.

    • Chức năng của SP: Là thanh ghi lưu giữ địa chỉ ô nhớ hiện tại của đỉnh ngăn xếp (vị trí dữ liệu mới nhất được nạp vào).

    • Cách vận hành khi thêm/bớt dữ liệu:

      • Khi thực hiện lệnh cất dữ liệu vào ngăn xếp (PUSH), giá trị địa chỉ trong thanh ghi SP tự động thay đổi (giảm hoặc tăng tùy kiến trúc bộ nhớ) và dữ liệu được ghi vào vị trí mới đó.

      • Khi thực hiện lệnh lấy dữ liệu ra khỏi ngăn xếp (POP), dữ liệu từ vị trí SP đang trỏ tới sẽ được đưa về thanh ghi, đồng thời giá trị SP tự động cập nhật để trỏ về phần tử liền kề trước đó.

    • Ý nghĩa: Giúp CPU có thể gọi lồng hàng loạt hàm hay xử lý các sự cố ngắt mà không bị mất dấu đường dẫn quay lại luồng chương trình chính.

  • Thanh ghi cơ sở (Base Register – thường ký hiệu là Base hoặc BP / EBX):

    • Khái niệm: Là thanh ghi dùng để lưu giữ một địa chỉ nền tảng ban đầu (gọi là địa chỉ cơ sở – Base Address) của một mảng dữ liệu, một cấu trúc bảng hoặc một phân đoạn bộ nhớ (Segment).

    • Cơ chế định vị địa chỉ cơ sở (Base Addressing):

      • Khi cần truy xuất một phần tử trong danh sách dữ liệu, CPU không cần chỉ định cứng địa chỉ ô nhớ tuyệt đối mà sẽ lấy giá trị trong Thanh ghi cơ sở cộng với một độ dời (Offset / Displacement) có trong lệnh:

        $$\text{Địa chỉ thực tế} = \text{Giá trị thanh ghi cơ sở (Base)} + \text{Độ dời (Offset)}$$
    • Ứng dụng thực tế: Cho phép các chương trình có tính tái định vị (Relocatability). Khi hệ điều hành nạp một chương trình vào bất kỳ vùng trống nào trong RAM, chương trình vẫn chạy chuẩn xác chỉ bằng cách nạp địa chỉ đầu vùng nhớ vào thanh ghi cơ sở mà không cần sửa đổi toàn bộ các câu lệnh bên trong.

2.1.3.4. Các thanh ghi đa năng và thanh ghi tích lũy (Accumulator)

  • Thanh ghi tích lũy (Accumulator – ACC):

    • Khái niệm: Là thanh ghi quan trọng và xuất hiện sớm nhất trong lịch sử thiết kế kiến trúc vi xử lý, gắn liền trực tiếp với ngõ vào và ngõ ra của khối số học & logic ALU.

    • Chức năng chính:

      • Lưu trữ sẵn một trong các toán hạng tham gia vào phép tính của ALU.

      • Tiếp nhận và lưu giữ kết quả cuối cùng vừa được tính toán xong bởi ALU.

    • Ví dụ: Khi thực thi lệnh cộng một số với một ô nhớ, kết quả cộng sẽ tự động ghi đè trở lại vào thanh ghi Accumulator để sẵn sàng cho các phép tính kế tiếp mà không cần tốn chu kỳ gửi ra RAM.

  • Các thanh ghi đa năng (General-Purpose Registers – GPRs):

    • Khái niệm: Là tập hợp các thanh ghi nằm trong Datapath mà lập trình viên và trình biên dịch được toàn quyền sử dụng thông qua các lệnh hợp ngữ (Assembly). Trong các dòng chip như x86, chúng thường mang các ký hiệu quen thuộc như AX, BX, CX, DX (hoặc EAX, EBX, ECX, EDX trên nền tảng 32-bit; RAX, RBX… trên nền tảng 64-bit).

    • Chức năng thực tế của từng thanh ghi đa năng:

      • Thanh ghi dữ liệu chung: Tạm giữ các hằng số, biến số, chuỗi ký tự đang dùng trong các vòng lặp.

      • Thanh ghi đếm (Counter): Làm biến đếm số lần lặp tự động cho các vòng lặp (như thanh ghi CX trong lệnh LOOP của vi xử lý Intel).

      • Thanh ghi trỏ địa chỉ gián tiếp: Dùng để chứa tạm địa chỉ con trỏ để CPU truy xuất nhanh dữ liệu trong RAM.

    • Lợi ích: Càng trang bị nhiều thanh ghi đa năng, CPU càng giảm thiểu được số lần phải đọc/ghi ra bộ nhớ ngoài RAM, giúp tốc độ thực thi của các phần mềm và hệ điều hành tăng lên đáng kể.