Bài 6 · Nâng cao · 30 phút· Cập nhật 11/06/2026
Mô hình CPU 8-bit
Biên soạn bởi Nguyễn Anh Tuấn
Mô phỏng CPU 8-bit tương tác: ráp thanh ghi (register), RAM, ALU và xung nhịp; xem chu trình Nạp → Giải mã → Thực thi chạy một chương trình thật.
Đây là phần ráp tất cả lại: một CPU 8-bit hoàn chỉnh với RAM, các thanh ghi, ALU (bộ cộng ở Bài 2) và xung nhịp (Bài 1). Chọn một chương trình mẫu, bấm “Một bước” để xem từng nhịp, hoặc tự viết chương trình của riêng bạn.
Chưa có bước nào. Nhấn “Một bước” hoặc “Chạy”.
Nhấn “Một bước” để chạy chậm từng nhịp, hoặc “Chạy” để tự động.
Mỗi lệnh đi qua ba nhịp: Nạp (lấy byte lệnh từ RAM vào IR) → Giải mã (bộ điều khiển đọc opcode) → Thực thi (làm việc: cộng, lưu, nhảy…). Rồi PC tăng và lặp lại. Bấm “Một bước” và để ý màu khối sáng lên theo từng nhịp.
- ▸PC trỏ tới ô lệnh kế tiếp; sau mỗi lệnh PC + 1.
- ▸IR giữ byte lệnh; 4 bit đầu = opcode, 4 bit sau = tham số.
- ▸JMP/JZ thay đổi PC để tạo vòng lặp và rẽ nhánh.
Chỉ 10 lệnh (9 lệnh chính + NOP), mỗi byte gồm opcode (nibble cao) + tham số (nibble thấp):
Lưu ý: đây là tập lệnh dạy học, không phải hợp ngữ chuẩn
- ▸16 ô RAM, mỗi ô 1 byte; thanh ghi A, B, IR, PC + cờ ZERO, CARRY.
- ▸Cố tình BỎ bộ nhớ đệm (cache) để nhìn rõ từng lần đọc RAM.
- ▸Giới hạn 8-bit: A chỉ 0-255 - quá ngưỡng là TRÀN SỐ và dừng (cảnh báo “ồn ào”, không âm thầm).
Trung thực
Câu hỏi thường gặp
Con người viết hợp ngữ (vd LDA 14), trình dịch đổi thành mã máy nhị phân, rồi đặt sẵn các byte đó vào RAM trước khi CPU chạy. Bạn tự làm điều này ở khu “Tự viết chương trình” rồi bấm “Nạp vào CPU”.
Nhãn chỉ là tên thay cho số địa chỉ, để khỏi đếm thủ công. Khi dịch, JMP lap được đổi thành JMP tới đúng ô mà nhãn lap: đứng - nhìn khu “Nạp vào CPU” sẽ thấy nhãn biến mất, chỉ còn con số.
“Một bước” chạy đúng một nhịp xung rồi dừng để quan sát thật chậm. “Chạy” là xung nhịp tự động lặp lại, tốc độ chỉnh bằng thanh trượt (như đổi “GHz”).
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
Chu trình ba nhịp mà mỗi lệnh đi qua trong mô hình CPU là gì?
- 1
Đọc chương trình
Chương trình “
LDI 6→OUT→HLT” in ra số mấy ở đèn kết quả?Hoàn thành khi: 6 -
LDInạp thẳng 6 vào A,OUTđưa A ra đèn. - 2
Chạy nhẩm (dự đoán)
Giả sử ô 14 = 7, ô 15 = 5. Chạy nhẩm “
LDA 14→ADD 15→OUT→HLT”: sau mỗi lệnh A bằng mấy, đèn hiện số nào? Gõ thêmORG 14 / DAT 7 / DAT 5để tự kiểm tra.Hoàn thành khi: Sau
LDA 14: A = 7; sauADD 15: A = 12; đèn hiện 12. - 3
Viết: tính 9 − 4
Viết chương trình tính 9 − 4 rồi hiện kết quả. Gợi ý: đặt số 4 vào ô nhớ bằng
ORG+DAT, dùngLDI 9rồiSUB.Hoàn thành khi: Nạp không lỗi, chạy tới khi dừng, đèn hiện 5. (Mẫu:
LDI 9 / SUB 15 / OUT / HLT / ORG 15 / DAT 4.) - 4
Viết: tính 3 + 4 + 5
Viết chương trình tính tổng 3 + 4 + 5 và hiện kết quả. Gợi ý:
LDI 3rồiADDhai ô chứa 4 và 5.Hoàn thành khi: Đèn hiện 12. (Mẫu:
LDI 3 / ADD 14 / ADD 15 / OUT / HLT / ORG 14 / DAT 4 / DAT 5.) - 5
Tìm lỗi
Chương trình “
LDI 5→ADD 15→OUT” với (ORG 15,DAT 3) đáng lẽ hiện 8 rồi dừng, nhưng nó chạy mãi không dừng. Tìm và sửa lỗi.Hoàn thành khi: Thiếu
HLTsauOUT: thêmHLT→ đèn hiện 8 và CPU dừng hẳn (không chạy lan vào vùng dữ liệu). - 6
Giới hạn phần cứng
(a) A đang là 200 mà cộng thêm 100 thì điều gì xảy ra, vì sao? (b) Vì sao không thể viết phép nhân tổng quát bằng vòng lặp gói trong 16 ô?
Hoàn thành khi: (a) 200+100 = 300 > 255 → TRÀN SỐ, CPU dừng, cờ CARRY bật (8-bit chỉ chứa 0-255). (b) nhân-vòng-lặp cần ~13 lệnh + dữ liệu > 16 ô; lại chỉ có
JZnên khó điều khiển vòng đếm - giới hạn thật của phần cứng nhỏ.