Kiến trúc máy tính là một trong những nền tảng quan trọng nhất đối với bất kỳ ai theo đuổi lĩnh vực công nghệ thông tin, từ lập trình viên, kỹ sư phần mềm đến các chuyên gia phần cứng. Chương 2 của môn học này thường đi sâu vào cấu trúc và hoạt động của bộ xử lý trung tâm (CPU), bao gồm các khái niệm về tập lệnh, chế độ địa chỉ, và chu trình thực thi lệnh. Đây là những kiến thức cốt lõi giúp bạn hiểu cách máy tính thực sự hoạt động ở cấp độ thấp. Việc nắm vững các khái niệm này không chỉ thông qua lý thuyết mà còn qua thực hành giải bài tập kiến trúc máy tính chương 2 là cực kỳ quan trọng để củng cố kiến thức và phát triển tư duy logic trong việc phân tích hệ thống máy tính. Bài viết này của Trandu.vn sẽ cung cấp một cái nhìn tổng quan sâu sắc về các dạng bài tập thường gặp, phương pháp giải chi tiết và những lời khuyên hữu ích để bạn chinh phục chương học đầy thử thách nhưng cũng không kém phần thú vị này.
Có thể bạn quan tâm: Tải Slide Về Máy Tính: Hướng Dẫn Toàn Diện Cho Mọi Nền Tảng
Kiến Trúc Máy Tính Chương 2: Tổng Quan Các Dạng Bài Tập Cốt Lõi
Chương 2 trong kiến trúc máy tính thường tập trung vào cấu trúc bộ xử lý và ngôn ngữ máy. Các bài tập trong chương này chủ yếu xoay quanh việc phân tích cấu trúc thanh ghi, giải mã và thực thi các lệnh, tính toán địa chỉ hiệu dụng, cũng như các vấn đề liên quan đến biểu diễn số học trong máy tính. Mục tiêu chính là giúp người học hiểu rõ mối quan hệ giữa các thành phần phần cứng cơ bản và cách chúng phối hợp để xử lý dữ liệu và lệnh. Việc thực hành thường xuyên với các dạng bài tập kiến trúc máy tính chương 2 sẽ củng cố khả năng đọc hiểu mã máy, phân tích luồng điều khiển và dữ liệu, từ đó xây dựng nền tảng vững chắc cho các chương học phức tạp hơn.
Khái Niệm Cơ Bản Trong Kiến Trúc Máy Tính Chương 2
Trước khi đi sâu vào các dạng bài tập, việc ôn lại các khái niệm cơ bản của Kiến trúc Máy tính Chương 2 là điều cần thiết. Chương này thường đề cập đến những thành phần cốt lõi của đơn vị xử lý trung tâm (CPU) và cách nó tương tác với bộ nhớ để thực hiện các chương trình.
Cấu Trúc Thanh Ghi và Bộ Nhớ
Trong kiến trúc máy tính, thanh ghi (register) là các vị trí lưu trữ dữ liệu tốc độ cao bên trong CPU, được sử dụng để tạm thời lưu trữ dữ liệu và địa chỉ trong quá trình xử lý lệnh. Số lượng và chức năng của các thanh ghi có thể khác nhau tùy thuộc vào kiến trúc, nhưng chúng thường bao gồm thanh ghi đa năng (general-purpose registers), thanh ghi đếm chương trình (program counter – PC), thanh ghi lệnh (instruction register – IR), thanh ghi địa chỉ bộ nhớ (memory address register – MAR) và thanh ghi đệm dữ liệu bộ nhớ (memory data register – MDR). Mỗi thanh ghi đóng vai trò quan trọng trong việc quản lý luồng dữ liệu và điều khiển hoạt động của CPU.
Bộ nhớ (memory) là nơi lưu trữ chương trình và dữ liệu. Trong ngữ cảnh của chương 2, trọng tâm thường là bộ nhớ chính (main memory) hay RAM, nơi các lệnh và dữ liệu được nạp vào để CPU có thể truy cập. Bộ nhớ được tổ chức thành các ô nhớ, mỗi ô có một địa chỉ duy nhất. Việc hiểu cách CPU truy cập, đọc và ghi dữ liệu vào các địa chỉ bộ nhớ khác nhau là cực kỳ quan trọng. Các bài tập về cấu trúc thanh ghi và bộ nhớ thường yêu cầu phân tích cách dữ liệu di chuyển giữa CPU và bộ nhớ, cũng như tác động của các lệnh đến nội dung của thanh ghi và ô nhớ.
Tập Lệnh và Chế Độ Địa Chỉ
Tập lệnh (instruction set) là tập hợp các lệnh mà một CPU cụ thể có thể hiểu và thực thi. Mỗi lệnh có một mã hoạt động (opcode) và các toán hạng (operands). Toán hạng có thể là dữ liệu trực tiếp, địa chỉ bộ nhớ hoặc tên thanh ghi. Hiểu được cú pháp và ý nghĩa của từng lệnh là chìa khóa để phân tích các đoạn mã máy hoặc viết các chương trình đơn giản ở cấp độ thấp.
Chế độ địa chỉ (addressing modes) mô tả cách CPU xác định vị trí của toán hạng (dữ liệu hoặc địa chỉ) mà một lệnh cần truy cập. Có nhiều chế độ địa chỉ khác nhau, mỗi chế độ có ưu và nhược điểm riêng. Các chế độ phổ biến bao gồm:
- Địa chỉ tức thời (Immediate Addressing): Toán hạng là một phần của lệnh.
- Địa chỉ thanh ghi (Register Addressing): Toán hạng nằm trong một thanh ghi.
- Địa chỉ trực tiếp (Direct Addressing): Địa chỉ bộ nhớ của toán hạng được cung cấp trực tiếp trong lệnh.
- Địa chỉ gián tiếp (Indirect Addressing): Lệnh chứa địa chỉ của một vị trí bộ nhớ, và vị trí đó chứa địa chỉ thực của toán hạng.
- Địa chỉ thanh ghi gián tiếp (Register Indirect Addressing): Một thanh ghi chứa địa chỉ thực của toán hạng.
- Địa chỉ tương đối (Relative Addressing): Địa chỉ của toán hạng được tính bằng cách cộng nội dung của thanh ghi đếm chương trình (PC) với một giá trị dịch chuyển (offset) trong lệnh.
- Địa chỉ chỉ mục (Indexed Addressing): Địa chỉ của toán hạng được tính bằng cách cộng một hằng số với nội dung của một thanh ghi chỉ mục.
Các bài tập về tập lệnh và chế độ địa chỉ thường yêu cầu bạn giải thích tác động của một lệnh đến các thanh ghi và bộ nhớ, hoặc tính toán địa chỉ hiệu dụng (effective address) của toán hạng dựa trên chế độ địa chỉ được sử dụng. Việc thành thạo các chế độ địa chỉ là yếu tố then chốt để giải quyết nhiều bài tập kiến trúc máy tính chương 2 phức tạp.
Chu Trình Lệnh (Fetch-Decode-Execute)
Chu trình lệnh, còn được gọi là chu trình nạp-giải mã-thực thi (Fetch-Decode-Execute Cycle), là quá trình cơ bản mà CPU thực hiện để xử lý một lệnh. Quá trình này bao gồm các bước chính sau:

Có thể bạn quan tâm: Hướng Dẫn Tắt Chế Độ Tắt Màn Hình Máy Tính Chi Tiết Nhất
- Nạp lệnh (Fetch Instruction): CPU đọc lệnh từ địa chỉ bộ nhớ được chỉ định bởi thanh ghi đếm chương trình (PC) và lưu nó vào thanh ghi lệnh (IR). Sau đó, PC được tăng lên để trỏ đến lệnh tiếp theo.
- Giải mã lệnh (Decode Instruction): Đơn vị điều khiển (Control Unit) của CPU phân tích mã hoạt động (opcode) của lệnh trong IR để xác định loại lệnh và các toán hạng cần thiết.
- Thực thi lệnh (Execute Instruction): Đơn vị số học/logic (Arithmetic Logic Unit – ALU) hoặc các đơn vị chức năng khác của CPU thực hiện thao tác được chỉ định bởi lệnh. Điều này có thể bao gồm việc đọc dữ liệu từ bộ nhớ hoặc thanh ghi, thực hiện các phép tính số học/logic, hoặc ghi kết quả trở lại bộ nhớ hoặc thanh ghi.
- Ghi kết quả (Write Back): Kết quả của phép toán được ghi vào một thanh ghi hoặc một vị trí bộ nhớ.
Chu trình này lặp đi lặp lại cho mỗi lệnh trong chương trình. Hiểu rõ từng bước của chu trình lệnh giúp bạn hình dung được luồng hoạt động của CPU và cách các thành phần phần cứng phối hợp với nhau. Các bài tập liên quan có thể yêu cầu bạn mô tả trạng thái của các thanh ghi sau mỗi bước của chu trình lệnh hoặc phân tích thời gian thực thi của một đoạn mã dựa trên số chu kỳ xung nhịp (clock cycles) mà mỗi lệnh yêu cầu.
Các Dạng Bài Tập Thường Gặp và Phương Pháp Giải
Các bài tập kiến trúc máy tính chương 2 thường đòi hỏi sự kết hợp giữa lý thuyết và kỹ năng phân tích thực tế. Dưới đây là một số dạng bài tập phổ biến cùng với phương pháp giải chi tiết.
Dạng 1: Phân Tích Tập Lệnh và Chế Độ Địa Chỉ
Mục đích: Kiểm tra khả năng hiểu các lệnh ngôn ngữ máy và cách chúng tương tác với các chế độ địa chỉ để truy cập dữ liệu.
Bài tập ví dụ:
Giả sử một kiến trúc máy tính đơn giản có các thanh ghi R1, R2, R3 và một tập lệnh bao gồm:
- LOAD dest, source: Nạp dữ liệu từ source vào thanh ghi dest.
- STORE source, dest: Lưu dữ liệu từ thanh ghi source vào vị trí bộ nhớ dest.
- ADD dest, op1, op2: Cộng op1 với op2, kết quả lưu vào dest.
- SUB dest, op1, op2: Trừ op2 từ op1, kết quả lưu vào dest.
Các chế độ địa chỉ được hỗ trợ:
- #value: Địa chỉ tức thời (immediate).
- (Rn): Địa chỉ thanh ghi gián tiếp.
- [address]: Địa chỉ trực tiếp.
- offset(Rn): Địa chỉ chỉ mục (offset cộng với nội dung thanh ghi).
Ban đầu, nội dung các thanh ghi và một số ô nhớ như sau:
- R1 = 1000h (địa chỉ)
- R2 = 500h (giá trị)
- R3 = 10h (giá trị)
- Bộ nhớ:
- Địa chỉ 1000h chứa giá trị 20h
- Địa chỉ 1010h chứa giá trị 30h
- Địa chỉ 1020h chứa giá trị 40h
- Địa chỉ 1030h chứa giá trị 50h
- Địa chỉ 100h chứa giá trị 60h
Hãy xác định nội dung của R1, R2, R3 và các ô nhớ bị ảnh hưởng sau khi thực hiện lần lượt các lệnh sau:
- LOAD R1, #FFh
- ADD R2, R2, R3
- LOAD R3, [1000h]
- STORE R2, 100h(R1)
- SUB R1, R1, #5
Phương pháp giải:
Giải từng lệnh một, cập nhật trạng thái của thanh ghi và bộ nhớ sau mỗi lệnh.
Lời giải chi tiết:
Trạng thái ban đầu:
- R1 = 1000h
- R2 = 500h
- R3 = 10h
- Mem[1000h] = 20h
- Mem[1010h] = 30h
- Mem[1020h] = 40h
- Mem[1030h] = 50h
- Mem[100h] = 60h
1. LOAD R1, #FFh
- Chế độ địa chỉ: Địa chỉ tức thời (#FFh). Giá trị FFh (255 thập phân) sẽ được nạp trực tiếp vào R1.
- Kết quả: R1 = FFh.
- Trạng thái sau lệnh 1:
- R1 = FFh
- R2 = 500h
- R3 = 10h
- Bộ nhớ không đổi.
2. ADD R2, R2, R3
- Chế độ địa chỉ: Địa chỉ thanh ghi (R2 và R3). Lệnh sẽ cộng nội dung của R2 với R3 và lưu kết quả vào R2.
- Thực hiện: R2 = R2 + R3 = 500h + 10h = 510h.
- Kết quả: R2 = 510h.
- Trạng thái sau lệnh 2:
- R1 = FFh
- R2 = 510h
- R3 = 10h
- Bộ nhớ không đổi.
3. LOAD R3, [1000h]
- Chế độ địa chỉ: Địa chỉ trực tiếp ([1000h]). Lệnh sẽ nạp giá trị từ ô nhớ tại địa chỉ 1000h vào R3.
- Thực hiện: Giá trị tại Mem[1000h] là 20h. Nạp 20h vào R3.
- Kết quả: R3 = 20h.
- Trạng thái sau lệnh 3:
- R1 = FFh
- R2 = 510h
- R3 = 20h
- Bộ nhớ không đổi.
4. STORE R2, 100h(R1)
- Chế độ địa chỉ: Địa chỉ chỉ mục (100h(R1)). Địa chỉ hiệu dụng (Effective Address – EA) được tính bằng cách cộng offset (100h) với nội dung của R1.
- Tính EA: EA = 100h + R1 = 100h + FFh = 1FFh.
- Thực hiện: Lưu nội dung của R2 (510h) vào ô nhớ tại địa chỉ 1FFh.
- Kết quả: Mem[1FFh] = 510h. (Lưu ý, nếu địa chỉ 1FFh chưa có trong danh sách ban đầu, nó được tạo ra hoặc cập nhật).
- Trạng thái sau lệnh 4:
- R1 = FFh
- R2 = 510h
- R3 = 20h
- Mem[1FFh] = 510h
- Các ô nhớ khác không đổi.
5. SUB R1, R1, #5
- Chế độ địa chỉ: Địa chỉ thanh ghi (R1) và tức thời (#5). Lệnh sẽ trừ giá trị 5 từ nội dung của R1 và lưu kết quả vào R1.
- Thực hiện: R1 = R1 – 5 = FFh – 5h = FAh. (Trong hệ thập lục phân, FFh là 255, 5h là 5. 255-5=250. 250 thập phân là FAh).
- Kết quả: R1 = FAh.
- Trạng thái sau lệnh 5:
- R1 = FAh
- R2 = 510h
- R3 = 20h
- Mem[1FFh] = 510h
- Các ô nhớ khác không đổi.
Tóm tắt cuối cùng:
- R1 = FAh
- R2 = 510h
- R3 = 20h
- Mem[1000h] = 20h
- Mem[1010h] = 30h
- Mem[1020h] = 40h
- Mem[1030h] = 50h
- Mem[100h] = 60h
- Mem[1FFh] = 510h
Lời khuyên: Luôn vẽ sơ đồ hoặc tạo bảng để theo dõi trạng thái của thanh ghi và bộ nhớ. Cẩn thận với các phép toán số học trong hệ thập lục phân (hexadecimal) hoặc nhị phân (binary) nếu được yêu cầu.
Dạng 2: Tính Toán Thời Gian Thực Thi Lệnh
Mục đích: Đánh giá khả năng phân tích hiệu suất của CPU dựa trên số chu kỳ xung nhịp mà mỗi lệnh cần để thực thi.
Bài tập ví dụ:
Một CPU có tần số xung nhịp 2 GHz. Giả sử các lệnh của CPU này yêu cầu số chu kỳ xung nhịp như sau:
- Lệnh số học (ADD, SUB): 4 chu kỳ
- Lệnh truyền dữ liệu (LOAD, STORE): 5 chu kỳ
- Lệnh điều khiển (JUMP, CALL): 3 chu kỳ
Một chương trình nhỏ có cấu trúc như sau:
- 20% là lệnh số học
- 50% là lệnh truyền dữ liệu
- 30% là lệnh điều khiển
Nếu chương trình này chứa tổng cộng 1 triệu lệnh, hãy tính:
a. Tổng số chu kỳ xung nhịp cần thiết để thực thi toàn bộ chương trình.
b. Thời gian thực thi toàn bộ chương trình (tính bằng giây).
c. MIPS (Millions of Instructions Per Second) của chương trình này.
Phương pháp giải:
Sử dụng công thức tính tổng chu kỳ: Tổng Cycle = Σ (Số lệnh loại i Cycle của loại i)
Tính thời gian thực thi: Thời gian = Tổng Cycle / Tần số xung nhịp
Tính MIPS: MIPS = (Tổng số lệnh / Thời gian thực thi) / 10^6

Có thể bạn quan tâm: Máy Tính Tắt Nguồn Mở Không Lên: Nguyên Nhân & Cách Khắc Phục Hiệu Quả
Lời giải chi tiết:
Thông số đã cho:
- Tần số xung nhịp (Clock Rate) = 2 GHz = 2 10^9 Hz (chu kỳ/giây)
- Số lệnh số học (ADD, SUB) = 20%
- Số lệnh truyền dữ liệu (LOAD, STORE) = 50%
- Số lệnh điều khiển (JUMP, CALL) = 30%
- Tổng số lệnh (Total Instructions) = 1,000,000 lệnh
a. Tổng số chu kỳ xung nhịp cần thiết:
- Số lệnh số học = 0.20 1,000,000 = 200,000 lệnh
- Số lệnh truyền dữ liệu = 0.50 1,000,000 = 500,000 lệnh
- Số lệnh điều khiển = 0.30 1,000,000 = 300,000 lệnh
- Chu kỳ cho lệnh số học = 200,000 4 = 800,000 chu kỳ
- Chu kỳ cho lệnh truyền dữ liệu = 500,000 5 = 2,500,000 chu kỳ
-
Chu kỳ cho lệnh điều khiển = 300,000 3 = 900,000 chu kỳ
-
Tổng số chu kỳ xung nhịp = 800,000 + 2,500,000 + 900,000 = 4,200,000 chu kỳ
b. Thời gian thực thi toàn bộ chương trình:
- Thời gian thực thi = Tổng số chu kỳ / Tần số xung nhịp
- Thời gian thực thi = 4,200,000 chu kỳ / (2 10^9 chu kỳ/giây)
- Thời gian thực thi = 4,200,000 / 2,000,000,000 = 0.0021 giây
- Thời gian thực thi = 0.0021 giây
c. MIPS (Millions of Instructions Per Second):
- MIPS = (Tổng số lệnh / Thời gian thực thi) / 10^6
- MIPS = (1,000,000 lệnh / 0.0021 giây) / 1,000,000
- MIPS = (476,190,476.19 lệnh/giây) / 1,000,000
- MIPS ≈ 476.19 MIPS
- MIPS ≈ 476.19 MIPS
Lời khuyên: Đảm bảo các đơn vị được chuyển đổi chính xác (GHz sang Hz, triệu lệnh sang lệnh). Lưu ý rằng MIPS chỉ là một trong nhiều chỉ số hiệu suất và có thể không phản ánh toàn diện hiệu năng của CPU trong mọi tình huống. Các chỉ số khác như FLOPS (Floating Point Operations Per Second) hay SPEC benchmarks thường được sử dụng trong các ngữ cảnh chuyên biệt hơn.
Dạng 3: Biểu Diễn Số Học và Logic
Mục đích: Kiểm tra khả năng biểu diễn số trong các hệ đếm khác nhau (nhị phân, thập lục phân) và thực hiện các phép toán số học/logic ở cấp độ bit.
Bài tập ví dụ:
Cho hai số nhị phân có dấu (sử dụng bù 2) với 8 bit:
A = 010110112
B = 111001102
Hãy thực hiện các phép toán sau và biểu diễn kết quả dưới dạng nhị phân 8 bit bù 2 và thập phân:
a. A + B
b. A – B
c. NOT A
d. A AND B
Phương pháp giải:
- Chuyển đổi sang thập phân: Đối với số bù 2, nếu bit MSB (most significant bit) là 0 thì là số dương, tính như số nhị phân thông thường. Nếu MSB là 1 thì là số âm, cần lấy bù 1, cộng 1 rồi thêm dấu âm.
- Cộng/Trừ nhị phân: Thực hiện như số học thông thường, chú ý nhớ (carry) và mượn (borrow). Đối với trừ, có thể chuyển sang phép cộng với số bù 2.
- Phép toán logic (NOT, AND, OR, XOR): Thực hiện thao tác bitwise.
Lời giải chi tiết:
Chuyển đổi sang thập phân (để kiểm tra):
- A = 010110112 (MSB = 0 -> số dương)
= 02^7 + 12^6 + 02^5 + 12^4 + 12^3 + 02^2 + 12^1 + 12^0
= 0 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 9110 - B = 111001102 (MSB = 1 -> số âm)
- Đảo bit (Bù 1): 00011001
- Cộng 1 (Bù 2): 000110102
- Giá trị thập phân: -(16 + 8 + 2) = -2610
a. A + B:
01011011 (A = 91) + 11100110 (B = -26) ---------- (1)00111001 (Kết quả 9 bit, bỏ bit nhớ)
- Kết quả nhị phân (8 bit): 00111001_2
- Chuyển sang thập phân: (MSB = 0 -> dương) = 32 + 16 + 8 + 1 = 57_10
- Kiểm tra: 91 + (-26) = 65. Có sự sai lệch. Tại sao?
Đây là một ví dụ về tràn số (overflow) hoặc lỗi khi bỏ bit nhớ. Với 8 bit bù 2, dải giá trị là từ -128 đến +127. Kết quả 91 + (-26) = 65, nằm trong dải. Lỗi ở đây là trong phép cộng nhị phân.
Cộng lại:01011011 + 11100110 ---------- (1)00111001
Bit nhớ cuối cùng (carry out) là 1. Tuy nhiên, bit nhớ vào (carry in) vị trí MSB là 0 + 1 + 1 = 10 (0 và nhớ 1). Bit nhớ ra từ MSB là 1. Khi bit nhớ vào MSB và bit nhớ ra từ MSB khác nhau, có tràn.
Tuy nhiên, nếu thực hiện cộng bù 2, thì bit nhớ ngoài cùng (carry out) sẽ bị bỏ qua. Kết quả đúng là 00111001.
001110012 = 32 + 16 + 8 + 1 = 5710.
Kiểm tra lại: A + B = 91 + (-26) = 65.
Lý do sai lệch là do tôi đã tính nhầm kết quả thập phân từ bit nhị phân 00111001.
Để tính lại chính xác: A = 01011011_2 (91) B = 11100110_2 (-26) Khi cộng hai số bù 2, bit tràn từ vị trí MSB thường bị bỏ qua (nếu không có tràn số). <pre><code> 1 1 1 1 1 1 <-- carry bits 01011011 + 11100110 ---------- 1 00111001 </code></pre> Bỏ bit nhớ ngoài cùng: 00111001_2. Giá trị thập phân của 00111001_2 = 64 + 32 + 16 + 8 + 1 = 57. Vẫn là 57. À, phép cộng bù 2 thực ra là: A (01011011) + B (11100110) Nếu xem xét giá trị thì 91 + (-26) = 65. 01000001_2 = 64+1 = 65. Vấn đề là ở đây có thể xảy ra tràn số mà tôi chưa nhận ra. Nếu kết quả thực sự là 65 (01000001_2), và tôi nhận được 00111001 (57), có nghĩa là có lỗi trong việc thực hiện. Hãy kiểm tra lại phép cộng: 01011011 + 11100110 ------------ bit 0: 1+0=1 bit 1: 1+1=0 (nhớ 1) bit 2: 0+1+1=0 (nhớ 1) bit 3: 1+0+1=0 (nhớ 1) bit 4: 1+0+1=0 (nhớ 1) bit 5: 0+1+1=0 (nhớ 1) bit 6: 1+1+1=1 (nhớ 1) bit 7: 0+1+1=0 (nhớ 1) Kết quả: (1)0000001_2 (1)0000001_2 -> bỏ bit nhớ -> 0000001_2. Đây là 1. Sai hoàn toàn. Tôi phải làm lại phép cộng nhị phân từ đầu, cẩn thận với carry: <pre><code> 01011011 (91) + 11100110 (-26) ------------- Bit 0: 1 + 0 = 1 Bit 1: 1 + 1 = 0 (carry 1) Bit 2: 0 + 1 + (carry 1) = 0 (carry 1) Bit 3: 1 + 0 + (carry 1) = 0 (carry 1) Bit 4: 1 + 0 + (carry 1) = 0 (carry 1) Bit 5: 0 + 1 + (carry 1) = 0 (carry 1) Bit 6: 1 + 1 + (carry 1) = 1 (carry 1) Bit 7: 0 + 1 + (carry 1) = 0 (carry 1) <-- MSB Final carry out: 1 </code></pre> Kết quả (bỏ bit carry ra): 01000001_2 Đây là 64 + 1 = 65_10. Đúng! Kết quả a: Nhị phân 8 bit bù 2: 01000001_2 Thập phân: 65_10
b. A – B:
- A – B = A + (-B)
- Để tìm (-B), ta lấy bù 2 của B.
- B = 11100110_2
- Bù 1 của B: 00011001_2
- Bù 2 của B ((-B)): 000110012 + 1 = 000110102 (đây là +26_10)
-
Bây giờ thực hiện A + (-B):
01011011 (A = 91) + 00011010 (-B = 26) ------------ Bit 0: 1 + 0 = 1 Bit 1: 1 + 1 = 0 (carry 1) Bit 2: 0 + 0 + (carry 1) = 1 Bit 3: 1 + 1 = 0 (carry 1) Bit 4: 1 + 1 + (carry 1) = 1 (carry 1) Bit 5: 0 + 0 + (carry 1) = 1 Bit 6: 1 + 0 = 1 Bit 7: 0 + 0 = 0 <-- MSB
Kết quả (bỏ bit carry ra): 01110101_2
- Chuyển sang thập phân: (MSB = 0 -> dương)
= 64 + 32 + 16 + 4 + 1 = 117_10 - Kiểm tra: A – B = 91 – (-26) = 91 + 26 = 117. Đúng!
Kết quả b:
- Nhị phân 8 bit bù 2: 01110101_2
- Thập phân: 117_10
- Chuyển sang thập phân: (MSB = 0 -> dương)
c. NOT A:
- Phép toán NOT đảo ngược tất cả các bit.
- A = 01011011_2
- Kết quả nhị phân (8 bit): 10100100_2
- Chuyển sang thập phân: (MSB = 1 -> số âm)
- Đảo bit: 010110112
- Cộng 1: 010111002 (giá trị 64+16+8+4 = 92)
- Kết quả thập phân: -92_10
- Kiểm tra: NOT A trong hệ thập phân không có ý nghĩa trực tiếp. Trong ngữ cảnh bù 2, NOT A tương đương với -(A+1). Tức là -(91+1) = -92. Đúng.
Kết quả c: Nhị phân 8 bit bù 2: 10100100_2 Thập phân: -92_10
d. A AND B:
- Phép toán AND thực hiện bitwise. Bit kết quả là 1 nếu cả hai bit tương ứng đều là 1, ngược lại là 0.
01011011 & 11100110 ---------- 01000010
- Kết quả nhị phân (8 bit): 01000010_2
- Chuyển sang thập phân: (MSB = 0 -> dương)
= 64 + 2 = 66_10
Kết quả d: Nhị phân 8 bit bù 2: 01000010_2 Thập phân: 66_10
Lời khuyên: Luôn cẩn thận với các bit nhớ (carry) trong phép cộng và đảm bảo nắm vững cách chuyển đổi giữa các hệ đếm và quy tắc bù 2. Đối với tràn số trong bù 2, nó xảy ra khi hai số dương cộng lại cho kết quả âm, hoặc hai số âm cộng lại cho kết quả dương. Một cách khác để kiểm tra tràn là khi bit nhớ vào vị trí MSB và bit nhớ ra từ vị trí MSB là khác nhau.
Dạng 4: Thiết Kế Mạch Logic Đơn Giản
Mục đích: Kiểm tra khả năng hiểu và áp dụng các cổng logic cơ bản để xây dựng các mạch chức năng nhỏ. Dù chương 2 ít tập trung vào thiết kế mạch chi tiết như các chương về Logic số, nhưng việc hiểu cách các bit được thao tác thông qua cổng logic là cần thiết.
Bài tập ví dụ:
Thiết kế một mạch logic có 3 đầu vào A, B, C và 1 đầu ra F. Đầu ra F bằng 1 nếu và chỉ nếu có số lẻ các đầu vào bằng 1.
Phương pháp giải:
- Lập bảng chân trị (truth table) cho tất cả các tổ hợp đầu vào và đầu ra mong muốn.
- Viết biểu thức Boolean cho đầu ra F dựa trên bảng chân trị (dạng tổng của các minterm – Sum of Products).
- Tối thiểu hóa biểu thức Boolean (nếu có thể) bằng bản đồ Karnaugh (K-map) hoặc các định lý đại số Boolean.
- Vẽ mạch logic sử dụng các cổng logic cơ bản (AND, OR, NOT, XOR).
Lời giải chi tiết:
1. Lập bảng chân trị:
| A | B | C | F | |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | (0 số 1) |
| 0 | 0 | 1 | 1 | (1 số 1) |
| 0 | 1 | 0 | 1 | (1 số 1) |
| 0 | 1 | 1 | 0 | (2 số 1) |
| 1 | 0 | 0 | 1 | (1 số 1) |
| 1 | 0 | 1 | 0 | (2 số 1) |
| 1 | 1 | 0 | 0 | (2 số 1) |
| 1 | 1 | 1 | 1 | (3 số 1) |
2. Viết biểu thức Boolean (SOP – Sum of Products):
F = A’B’C + A’BC’ + AB’C’ + ABC
3. Tối thiểu hóa biểu thức Boolean:
Biểu thức này không thể tối thiểu hóa thêm bằng K-map hoặc đại số Boolean theo cách thông thường vì nó là hàm XOR lẻ.
F = A’B’C + A’BC’ + AB’C’ + ABC
= C(A’B’ + AB) + C'(A’B + AB’)
= C(A XOR B)’ + C'(A XOR B)
Đặt X = A XOR B. Khi đó:
F = C X’ + C’X
F = X XOR C
F = (A XOR B) XOR C
Đây chính là hàm XOR ba đầu vào.
4. Vẽ mạch logic:
Mạch sẽ bao gồm hai cổng XOR 2 đầu vào nối tiếp nhau.
A -----|
| XOR |----|
B -----| X | XOR |---- F
|
C ----------------|
Lời khuyên: Dạng bài này củng cố sự hiểu biết về cách các bit được xử lý ở cấp độ thấp nhất trong máy tính. Mặc dù không phải là trung tâm của chương 2, nhưng nó có thể xuất hiện dưới dạng các câu hỏi phụ liên quan đến ALU (Arithmetic Logic Unit), nơi các phép toán logic và số học được thực hiện. Nắm vững bảng chân trị và cách biểu diễn các hàm logic là rất quan trọng.
Lời Khuyên Để Làm Tốt Bài Tập Kiến Trúc Máy Tính
Chinh phục bài tập kiến trúc máy tính chương 2 đòi hỏi sự kiên nhẫn, logic và một phương pháp học tập hiệu quả. Dưới đây là những lời khuyên hữu ích để bạn có thể làm tốt hơn trong chương này và các chương tiếp theo.

Có thể bạn quan tâm: Hướng Dẫn Chi Tiết Cách Tải Đẳng Cấp Thú Cưng Trên Máy Tính
Nắm Vững Lý Thuyết
Trước khi lao vào giải bài tập, hãy đảm bảo bạn đã hiểu rõ các khái niệm lý thuyết. Đọc kỹ giáo trình, ghi chú cẩn thận trong các buổi học, và không ngần ngại đặt câu hỏi khi có bất kỳ điều gì chưa rõ ràng. Các khái niệm như kiến trúc Von Neumann, kiến trúc Harvard, các loại tập lệnh (RISC, CISC), cấu trúc pipelining đơn giản, và các loại địa chỉ hóa là nền tảng. Khi bạn có một nền tảng lý thuyết vững chắc, việc phân tích các bài tập sẽ trở nên dễ dàng hơn rất nhiều. Hãy nhớ rằng, lý thuyết là kim chỉ nam giúp bạn tìm ra lời giải cho những vấn đề phức tạp.
Thực Hành Liên Tục
Kiến trúc máy tính là một môn học thực hành. Bạn không thể chỉ đọc lý thuyết và mong muốn hiểu sâu. Hãy giải càng nhiều bài tập càng tốt, từ những bài cơ bản đến những bài nâng cao. Bắt đầu với các bài tập trong giáo trình, sau đó tìm kiếm thêm các nguồn tài liệu khác như sách bài tập bổ trợ, đề thi cũ, hoặc các trang web chuyên về kiến trúc máy tính. Mỗi bài tập là một cơ hội để bạn áp dụng kiến thức, phát hiện ra những lỗ hổng trong hiểu biết của mình và củng cố kỹ năng giải quyết vấn đề. Đừng ngại mắc lỗi; học từ lỗi lầm là một phần quan trọng của quá trình học. Thêm vào đó, việc thực hành thường xuyên sẽ giúp bạn làm quen với các dạng bài khác nhau, từ đó phản ứng nhanh hơn trong các bài kiểm tra hoặc kỳ thi.
Tham Khảo Đa Dạng Tài Liệu
Đừng giới hạn bản thân chỉ trong một nguồn tài liệu duy nhất. Các cuốn sách kinh điển như “Computer Organization and Design” của David A. Patterson và John L. Hennessy, hoặc “Computer Architecture: A Quantitative Approach” của cùng tác giả, đều là những nguồn tham khảo tuyệt vời. Ngoài ra, hãy tìm kiếm các bài giảng của các trường đại học uy tín, các video hướng dẫn trên YouTube, hay các diễn đàn chuyên ngành. Mỗi nguồn có thể cung cấp một góc nhìn hoặc cách giải thích khác nhau, giúp bạn hiểu sâu sắc hơn về cùng một chủ đề. Việc tham khảo đa dạng tài liệu cũng giúp bạn làm quen với nhiều cách trình bày và thuật ngữ khác nhau, rất hữu ích khi bạn tiếp cận với các hệ thống hoặc tài liệu kỹ thuật trong tương lai. Để có thêm kiến thức chuyên sâu về công nghệ và thủ thuật máy tính, bạn có thể truy cập Trandu.vn.
Câu Hỏi Thường Gặp Về Kiến Trúc Máy Tính Chương 2
Trong quá trình học và làm bài tập kiến trúc máy tính chương 2, có một số câu hỏi mà sinh viên thường gặp phải. Dưới đây là những câu hỏi phổ biến cùng với giải đáp ngắn gọn.
1. Chương 2 kiến trúc máy tính thường tập trung vào những chủ đề chính nào?
Chương 2 thường tập trung vào cấu trúc bộ xử lý trung tâm (CPU), bao gồm tập lệnh (instruction set), chế độ địa chỉ (addressing modes), cấu trúc thanh ghi (registers), và chu trình thực thi lệnh (fetch-decode-execute cycle). Ngoài ra, các khái niệm về biểu diễn số học trong máy tính (nhị phân, bù 2) cũng thường được đề cập.
2. Tại sao việc hiểu các chế độ địa chỉ lại quan trọng?
Hiểu các chế độ địa chỉ là cực kỳ quan trọng vì chúng định rõ cách CPU truy cập dữ liệu và lệnh trong bộ nhớ. Mỗi chế độ địa chỉ có những ưu điểm riêng về tốc độ, linh hoạt và kích thước mã lệnh. Việc nắm vững chúng giúp bạn phân tích luồng dữ liệu, tính toán địa chỉ hiệu dụng, và hiểu cách các chương trình cấp thấp hoạt động.
3. Làm thế nào để phân biệt giữa địa chỉ trực tiếp và địa chỉ gián tiếp?
- Địa chỉ trực tiếp: Lệnh chứa trực tiếp địa chỉ bộ nhớ của toán hạng. CPU chỉ cần một lần truy cập bộ nhớ để lấy dữ liệu.
- Địa chỉ gián tiếp: Lệnh chứa địa chỉ của một vị trí trong bộ nhớ, mà vị trí đó lại chứa địa chỉ thực của toán hạng. CPU cần hai lần truy cập bộ nhớ: một lần để lấy địa chỉ thực, và một lần nữa để lấy dữ liệu từ địa chỉ thực đó.
4. Khái niệm tràn số (overflow) trong số học bù 2 là gì và làm thế nào để phát hiện?
Tràn số xảy ra khi kết quả của một phép toán số học vượt quá dải giá trị mà một số bit nhất định có thể biểu diễn. Trong số học bù 2, điều này xảy ra khi:
- Cộng hai số dương và kết quả là một số âm.
- Cộng hai số âm và kết quả là một số dương.
Cách phát hiện: Tràn số xảy ra khi bit nhớ vào vị trí MSB và bit nhớ ra khỏi vị trí MSB là khác nhau.
5. Lợi ích của việc sử dụng bù 2 để biểu diễn số âm là gì?
Hệ bù 2 có một số lợi ích đáng kể:
- Đơn giản hóa phần cứng: Cho phép sử dụng cùng một mạch cộng để thực hiện cả phép cộng và phép trừ (bằng cách cộng với số bù 2).
- Chỉ có một biểu diễn cho số 0: Không có “+0” và “-0” như trong hệ dấu-trị tuyệt đối.
- Dải số đồng đều: Cung cấp dải giá trị cân bằng hơn giữa số âm và số dương (ví dụ: với N bit, từ -(2^(N-1)) đến (2^(N-1) – 1)).
Chương 2 của môn Kiến trúc Máy tính cung cấp những kiến thức nền tảng vững chắc về cách một máy tính hoạt động ở cấp độ cơ bản nhất. Thông qua việc phân tích cấu trúc thanh ghi, tập lệnh, chế độ địa chỉ và chu trình thực thi lệnh, bạn sẽ có cái nhìn sâu sắc về cách các lệnh được xử lý và dữ liệu được thao tác. Việc thực hành giải các bài tập kiến trúc máy tính chương 2 một cách chi tiết như đã trình bày trong bài viết này là chìa khóa để củng cố kiến thức, phát triển kỹ năng giải quyết vấn đề và chuẩn bị tốt cho các chủ đề phức tạp hơn trong tương lai. Hãy luôn kiên trì, thực hành đều đặn và không ngừng tìm tòi để làm chủ hoàn toàn chương học quan trọng này.
