PHÂN TÍCH TÀI LIỆU VÀ BÁO CÁO TỔNG QUAN

BƯỚC 1: PHÂN TÍCH TÀI LIỆU

1. Các vấn đề chính tài liệu giải quyết

  • Hiện thực hóa giải thuật cấp thấp: Xây dựng phương pháp triển khai các bài toán thao tác chuỗi ký tự, xử lý mảng số học và chuyển đổi hệ cơ số trên nền tảng vi xử lý 16-bit Intel 8086.
  • Cơ chế phân đoạn và quản trị bộ nhớ: Giải thích cách thức CPU quản lý không gian địa chỉ vật lý thông qua các thanh ghi phân đoạn (CS, DS, SS, ES) và con trỏ offset (IP, SP, BP, SI, DI).
  • Kỹ thuật ngắt hệ thống DOS: Ứng dụng bảng điều khiển ngắt INT 21H để thực hiện các thao tác nhập/xuất chuẩn (I/O) và điều khiển luồng dữ liệu tương tác người dùng.
  • Khảo sát phân cấp hệ thống nhớ thực tế: Đo lường và đánh giá cấu trúc phân tầng bộ nhớ (SRAM Cache L1/L2/L3, DRAM DDR3/DDR4/DDR5, ROM/BIOS, SSD/HDD) trên các cấu hình phần cứng hiện đại bằng CPU-Z và HWiNFO64.

2. Thuật ngữ chuyên ngành cốt lõi

  • Assembly 8086: Hợp ngữ dành cho vi xử lý 16-bit kiến trúc x86.
  • emu8086: Trình mô phỏng vi xử lý và hợp dịch mã nguồn 8086.
  • Thanh ghi đa năng (General-purpose Registers): AX (Accumulator), BX (Base), CX (Counter), DX (Data).
  • Thanh ghi đoạn (Segment Registers): CS (Code Segment), DS (Data Segment), SS (Stack Segment), ES (Extra Segment).
  • Con trỏ lệnh (IP - Instruction Pointer): Thanh ghi trỏ tới offset của lệnh tiếp theo cần nạp.
  • Ngăn xếp (Stack Frame): Vùng nhớ hoạt động theo cơ chế vào sau ra trước (LIFO).
  • Con trỏ ngăn xếp (SP - Stack Pointer): Thanh ghi luôn trỏ vào đỉnh hiện tại của ngăn xếp.
  • Con trỏ cơ sở (BP - Base Pointer): Thanh ghi dùng để truy cập tham số và biến cục bộ trong ngăn xếp.
  • Chỉ số nguồn/đích (SI/DI - Source/Destination Index): Dùng trong các thao tác xử lý chuỗi và mảng.
  • Ngắt hệ thống DOS (INT 21H): Hàm gọi ngắt dịch vụ hệ điều hành (Hàm 01H, 02H, 09H, 0AH, 4CH).
  • Định chỉ bộ nhớ (Memory Addressing): Cơ chế tính toán địa chỉ vật lý 20-bit = Segment * 16 + Offset.
  • Cờ trạng thái (Flags Register): Các bit trạng thái ZF (Zero Flag), CF (Carry Flag), SF (Sign Flag), OF (Overflow Flag).
  • Bộ nhớ đệm (Cache L1/L2/L3): SRAM tốc độ cao tích hợp trực tiếp trên đế vi xử lý.
  • Bộ nhớ truy cập ngẫu nhiên (RAM): DRAM đồng bộ lưu trữ dữ liệu tạm thời trong phiên làm việc.
  • Độ trễ CAS (CAS Latency - CL): Số chu kỳ xung nhịp để RAM phản hồi dữ liệu sau khi nhận tín hiệu cột.
  • Bảng mã ASCII: Chuẩn mã hóa chuyển đổi giữa ký tự văn bản và giá trị số học.

3. Đóng góp và giá trị thực tiễn của tài liệu

  • Bộ sưu tập mã nguồn mẫu chuẩn hóa: Cung cấp đầy đủ mã nguồn Assembly 8086 kèm lưu đồ giải thuật (draw.io) cho hơn 15 bài toán xử lý chuỗi, mảng, toán học và chuyển đổi cơ số.
  • Phương pháp luận Debug trực quan: Hướng dẫn chi tiết quy trình khảo sát từng bước (Single Step) để giám sát sự biến động của thanh ghi và cờ hiệu trong quá trình thực thi lệnh.
  • Đối chiếu thực nghiệm phần cứng: Liên kết trực quan giữa mô hình lý thuyết của kiến trúc x86 với các thông số vật lý thực tế trên các dòng CPU Intel Core (thế hệ 4, 10, 11, 12, 13) và AMD Ryzen.

BƯỚC 2: NỘI DUNG CONTENT CHI TIẾT

Tổng quan nghiên cứu

Trong kỷ nguyên phát triển mạnh mẽ của các ngôn ngữ bậc cao, việc thấu hiểu bản chất vận hành ở tầng phần cứng cấp thấp vẫn là nền tảng cốt lõi của ngành Khoa học Máy tính và Kỹ thuật Phần mềm. Lập trình hợp ngữ (Assembly Language) không chỉ là một công cụ lập trình đơn thuần, mà còn đóng vai trò như chiếc chìa khóa giúp kỹ sư phần mềm mở rộng tầm nhìn về cơ chế vận hành nội tại của vi xử lý.

Môn học Kiến trúc Máy tính tại các cơ sở đào tạo công nghệ hàng đầu đóng vai trò làm cầu nối giữa các khái niệm trừu tượng và thực tế phần cứng. Tuy nhiên, rào cản lớn nhất đối với người học là sự thiếu hụt các tài liệu tổng hợp trực quan, vừa cung cấp giải thuật chi tiết, vừa phân tích sâu về cơ chế quản lý thanh ghi và khảo sát bộ nhớ vật lý.

Tài liệu "Báo cáo Bài tập lớn Kiến trúc Máy tính: Lập trình Hợp ngữ Assembly 8086 và Khảo sát Hệ thống Bộ nhớ" do nhóm sinh viên Khoa Công nghệ Thông tin – Học viện Công nghệ Bưu chính Viễn thông (PTIT) thực hiện dưới sự hướng dẫn của ThS. Đinh Xuân Trường là một công trình học thuật mang tính ứng dụng cao. Tài liệu giải quyết toàn diện bài toán lập trình cấp thấp thông qua hai phần trọng tâm: hiện thực hóa các thuật toán kinh điển trên nền tảng giả lập emu8086 và phân tích thực nghiệm hệ thống phân cấp bộ nhớ từ vi mô đến vĩ mô trên các kiến trúc máy tính hiện đại.


Nội dung chi tiết

1. Cơ sở kiến trúc vi xử lý x86 và mô hình phân đoạn bộ nhớ (Memory Segmentation)

Kiến trúc vi xử lý Intel 8086 là nền tảng khởi nguồn cho toàn bộ hệ sinh thái kiến trúc x86 hiện đại. Để điều khiển trực tiếp phần cứng, lập trình viên cần nắm vững cách thức tổ chức các thanh ghi 16-bit và không gian địa chỉ vật lý.

Vi xử lý 8086 sở hữu bus địa chỉ 20-bit, cho phép đánh địa chỉ không gian bộ nhớ vật lý tối đa là $1\text{ MB}$ ($2^{20}\text{ bytes}$). Tuy nhiên, các thanh ghi nội tại chỉ có kích thước 16-bit (tương ứng không gian tối đa $64\text{ KB}$). Để giải quyết nghịch lý này, Intel áp dụng cơ chế phân đoạn bộ nhớ (Memory Segmentation) dựa trên công thức chuyển đổi:

$$\text{Địa chỉ vật lý (20-bit)} = \text{Segment Register} \times 16 + \text{Offset Register}$$

Trong cấu trúc này, không gian nhớ được chia thành các đoạn logic rõ ràng:

  • Đoạn mã (Code Segment - CS): Lưu trữ mã lệnh thực thi của chương trình, phối hợp cùng con trỏ lệnh IP (CS:IP) để định vị lệnh nạp tiếp theo.
  • Đoạn dữ liệu (Data Segment - DS): Chứa các biến, chuỗi hằng số và cấu trúc dữ liệu, thường kết hợp với thanh ghi chỉ số nguồn SI (DS:SI) hoặc độ dời biến.
  • Đoạn ngăn xếp (Stack Segment - SS): Quản lý cấu trúc dữ liệu ngăn xếp phục vụ lời gọi hàm và lưu trữ tạm thời, kết hợp với con trỏ ngăn xếp SP (SS:SP) hoặc con trỏ cơ sở BP (SS:BP).
  • Đoạn mở rộng (Extra Segment - ES): Sử dụng làm vùng đệm bổ trợ trong các tác vụ sao chép và so sánh chuỗi khối lượng lớn kết hợp với chỉ số đích DI (ES:DI).

Bên cạnh các thanh ghi đoạn, các thanh ghi đa năng như AX, BX, CX, DX đóng vai trò lưu trữ toán hạng, bộ đếm vòng lặp và kết quả trung gian. Việc thay đổi giá trị trong các thanh ghi này sau mỗi phép tính số học hoặc logic sẽ tự động cập nhật các cờ trạng thái (ZF, CF, SF, OF), đóng vai trò quyết định cho các lệnh nhảy có điều kiện (JZ, JNZ, JE, JNE, JG, JL).


2. Thiết kế thuật toán và hiện thực hóa lập trình Assembly 8086 trên emu8086

Quá trình giải quyết bài toán trên môi trường hợp ngữ đòi hỏi phương pháp tiếp cận có cấu trúc và tư duy toán học chuẩn xác. Mỗi bài toán trong tài liệu đều tuân thủ quy trình chuẩn hóa: phân tích yêu cầu, xây dựng lưu đồ thuật toán (Flowchart qua công cụ draw.io), mã hóa mã nguồn ASM, và kiểm thử giao diện trên trình giả lập emu8086.

Xử lý chuỗi ký tự và thao tác văn bản

Nhóm bài toán xử lý chuỗi khai thác sâu các dịch vụ ngắt INT 21H:

  • Nhập/Xuất chuỗi: Sử dụng hàm ngắt AH=0AH kết hợp cấu trúc đệm (Buffer: Byte 1 xác định kích thước tối đa, Byte 2 trả về độ dài thực tế, từ Byte 3 là dữ liệu ký tự) và hàm AH=09H xuất chuỗi kết thúc bằng dấu $.
  • Đảo ngược chuỗi ký tự: Khai thác bản chất LIFO của ngăn xếp. Khi duyệt chuỗi, từng ký tự được đẩy vào ngăn xếp bằng lệnh PUSH. Sau đó, vòng lặp POP sẽ rút tuần tự các ký tự ra để in lên màn hình, tự động tạo thành chuỗi đảo ngược.
  • Tìm kiếm xâu con và đếm tần suất: Ứng dụng giải thuật hai con trỏ SI (chuỗi gốc A) và DI (chuỗi mẫu B). Thuật toán so khớp từng cặp ký tự; khi gặp ký tự không trùng khớp, con trỏ quay lại vị trí tiếp theo của chuỗi A, đảm bảo đếm chính xác tần suất xuất hiện của từ khóa con.

Tính toán số học và giải thuật mảng

  • Xử lý phép chia và điều kiện: Các bài toán lọc mảng (tìm các số chia hết cho 7 hoặc 11) sử dụng lệnh DIV. Bằng cách kiểm tra thanh ghi chứa phần dư AH (hoặc DX với phép chia 16-bit), nếu phần dư bằng 0, giá trị phần tử sẽ được cộng dồn vào tổng tích lũy.
  • Tính giai thừa ($N!$): Khởi tạo AX=1, BX=1, sử dụng vòng lặp nhân liên tiếp MUL BX kèm tăng BX cho đến khi đạt giá trị CX tương ứng với số nạp vào. Thuật toán phân tách kết quả sang hệ thập phân bằng cách chia liên tục cho 10 và đẩy phần dư vào ngăn xếp để hiển thị.
  • Tìm ƯCLN và BCNN: Triển khai thuật toán trừ liên tiếp giữa hai số lưu tại các thanh ghi DL và DH. Sau khi đạt trạng thái cân bằng để thu được ƯCLN, thuật toán tính BCNN theo công thức:

$$\text{BCNN}(a, b) = \frac{a \times b}{\text{ƯCLN}(a, b)}$$

Kỹ thuật chuyển đổi hệ cơ số

Chương trình chuyển đổi số thập phân sang nhị phân (BIN) và thập lục phân (HEX) áp dụng nguyên lý chia liên tục cho cơ số đích (2 hoặc 16). Phần dư thu được được chuyển đổi sang ký tự tương ứng trong bảng mã ASCII (cộng thêm 30H nếu giá trị từ 0–9, cộng thêm 37H nếu giá trị từ 10–15) trước khi đẩy vào ngăn xếp để in theo thứ tự ngược lại.


3. Khảo sát thực nghiệm phân cấp bộ nhớ và phân tích trạng thái thanh ghi Debug

Một điểm nhấn mang tính học thuật cao của tài liệu là sự kết hợp giữa lý thuyết hợp ngữ và khảo sát thực nghiệm hệ thống phần cứng máy tính.

Phân tích hệ thống phân cấp bộ nhớ (Memory Hierarchy)

Thông qua công cụ CPU-Z và HWiNFO64, tài liệu đo lường chi tiết cấu trúc bộ nhớ trên nhiều thế hệ vi xử lý:

  • Bộ nhớ đệm (CPU Cache):
    • Level 1 (L1 Cache): Tách biệt thành L1 Data Cache và L1 Instruction Cache (thường là $32\text{ KB}$ đến $48\text{ KB}$ mỗi nhân, cấu trúc 8-way hoặc 12-way set associative), đảm bảo tốc độ phản hồi tính bằng mili-nano giây.
    • Level 2 (L2 Cache): Dung lượng từ $256\text{ KB}$ đến $1.25\text{ MB}$ mỗi nhân, đóng vai trò đệm dữ liệu trung gian.
    • Level 3 (L3 Smart Cache): Dung lượng chia sẻ chung từ $3\text{ MB}$ đến $16\text{ MB}$ (12-way đến 16-way associative), tối ưu hóa luồng dữ liệu đa lõi.
  • Bộ nhớ chính (RAM): Khảo sát cấu hình thực tế từ chuẩn DDR3 (tốc độ $1600\text{ MHz}$) đến DDR4 ($2666\text{ MHz} - 3200\text{ MHz}$) và DDR5, phân tích chi tiết các thông số thời gian (Timing Parameters) như CAS# Latency (CL), tRCD, tRP, tRAS.
  • Bộ nhớ ngoài và lưu trữ: Phân tích cấu trúc phân vùng ổ cứng thể rắn SSD chuẩn NVMe/SATA qua Disk Management, cơ chế phân vùng GPT/MBR và công nghệ mã hóa BitLocker.

Phân tích thực nghiệm trạng thái thanh ghi khi Debug

Bằng công cụ Debug của emu8086, tài liệu minh chứng trực quan cách thức từng lệnh Assembly tác động lên tài nguyên CPU:

  1. Khi chương trình khởi động, hệ điều hành DOS cấp phát đoạn nhớ: CS nhận địa chỉ đoạn mã lệnh, DS nhận địa chỉ dữ liệu, SS trỏ đến đoạn ngăn xếp.
  2. Khi thực thi chế độ từng lệnh (Single Step):
    • Con trỏ IP tự động tăng lên để trỏ chính xác vào offset của lệnh kế tiếp.
    • Lệnh INT 21H chuyển quyền điều khiển tạm thời sang BIOS/DOS handler, làm thay đổi ngữ cảnh thanh ghi trước khi lệnh IRET phục hồi trạng thái.
    • Các lệnh tính toán số học làm thay đổi trực tiếp các bit trong thanh ghi cờ, giúp người học kiểm chứng được tính đúng đắn của logic phân nhánh.

Ai nên đọc tài liệu này?

Tài liệu được thiết kế nhằm phục vụ đa dạng các đối tượng trong khối ngành kỹ thuật và công nghệ:

  • Sinh viên chuyên ngành CNTT, Kỹ thuật Máy tính và Điện tử Viễn thông: Đây là tài liệu tham khảo để hoàn thành các đồ án môn học Kiến trúc Máy tính, Lập trình Hợp ngữ, Hệ thống Nhúng và Vi xử lý.
  • Lập trình viên Hệ thống và Kỹ sư Nhúng (Embedded Engineers): Cung cấp tư duy lập trình tối ưu hóa bộ nhớ, quản lý ngắt và điều khiển thanh ghi trực tiếp mà các ngôn ngữ cấp cao không biểu diễn rõ ràng.
  • Chuyên gia An toàn Thông tin và Dịch ngược Mã độc (Reverse Engineers): Giúp nắm vững cơ chế Stack Frame, luồng điều khiển CS:IP, và cấu trúc thanh ghi để phân tích mã nhị phân (Disassembly) và khai thác lỗ hổng tràn bộ đệm (Buffer Overflow).
  • Giảng viên và Trợ giảng: Cung cấp nguồn bài tập thực hành phong phú, có sẵn lưu đồ thuật toán và mã nguồn mẫu đã được biên dịch thành công.

Câu hỏi thường gặp (FAQ)

1. Lập trình hợp ngữ Assembly 8086 là gì?

Assembly 8086 là ngôn ngữ lập trình bậc thấp sử dụng các từ khóa gợi nhớ (mnemonics) để điều khiển trực tiếp tập lệnh của vi xử lý Intel 8086. Ngôn ngữ này ánh xạ trực tiếp 1-1 với mã máy, cho phép kiểm soát chi tiết các thanh ghi, ngăn xếp và không gian địa chỉ bộ nhớ.

2. Làm thế nào để gỡ lỗi và kiểm tra từng bước trên emu8086?

Để debug trên emu8086, bạn biên dịch mã nguồn bằng nút Emulate, sau đó chọn công cụ Debug. Sử dụng tính năng Single Step để chạy từng mã lệnh, đồng thời theo dõi sự thay đổi giá trị tại cửa sổ thanh ghi (AX, BX, CX, DX, IP, SP) và ngăn cờ trạng thái (Flags).

3. Tại sao kiến trúc x86 lại sử dụng cơ chế phân đoạn bộ nhớ (Segmentation)?

Cơ chế phân đoạn cho phép vi xử lý 8086 (thanh ghi 16-bit) truy xuất được không gian địa chỉ vật lý 20-bit ($1\text{ MB}$). Đồng thời, phân đoạn giúp phân tách riêng biệt các vùng mã lệnh, dữ liệu và ngăn xếp, tăng cường tính bảo mật và thuận tiện cho việc định vị lại bộ nhớ (Relocation).

4. Khi nào nên sử dụng ngăn xếp (Stack) trong lập trình hợp ngữ?

Ngăn xếp được sử dụng khi cần lưu tạm thời dữ liệu của thanh ghi trước khi thực hiện phép tính mới (PUSH/POP), lưu địa chỉ trở về khi gọi chương trình con (CALL/RET), đảo ngược thứ tự chuỗi ký tự, hoặc lưu trữ tham số trong các khung hàm (Stack Frames).

5. Sự khác biệt chính giữa bộ nhớ đệm Cache L1, L2 và L3 là gì?

Cache L1 là bộ nhớ nhanh nhất, dung lượng nhỏ nhất ($32\text{ KB} - 48\text{ KB}$), tích hợp trực tiếp trên từng lõi CPU. Cache L2 có dung lượng lớn hơn ($256\text{ KB} - 1.25\text{ MB}$) với tốc độ thấp hơn một chút. Cache L3 là bộ nhớ đệm chia sẻ chung giữa các lõi, dung lượng lớn nhất ($3\text{ MB} - 16\text{ MB}+$ ) giúp tối ưu hóa hiệu năng đa nhiệm.


Kết luận

Báo cáo Bài tập lớn Kiến trúc Máy tính của nhóm sinh viên Học viện Công nghệ Bưu chính Viễn thông là một tài liệu học thuật hoàn chỉnh, kết hợp hài hòa giữa cơ sở lý thuyết và kỹ năng thực hành chuyên sâu.

Các điểm nhấn quan trọng (Key Takeaways):

  • Nắm vững cấu trúc vi xử lý 8086 và cơ chế định chỉ bộ nhớ phân đoạn (Segment:Offset).
  • Thành thạo kỹ năng xây dựng lưu đồ thuật toán và lập trình Assembly 8086 giải quyết các bài toán chuỗi, mảng, số học và chuyển đổi cơ số.
  • Sử dụng thành thạo các dịch vụ ngắt hệ thống INT 21H và công cụ gỡ lỗi trực quan emu8086.
  • Hiểu rõ mô hình phân cấp bộ nhớ vật lý thông qua các thông số đo lường thực tế từ CPU-Z và HWiNFO64.

Hướng phát triển và mở rộng:

Từ nền tảng hợp ngữ 16-bit 8086, người học có thể dễ dàng mở rộng nghiên cứu sang kiến trúc hợp ngữ 32-bit (x86/IA-32) và 64-bit (x86-64), khám phá các tập lệnh mở rộng đa phương tiện (AVX, SSE) cũng như các kiến trúc vi điều khiển RISC hiện đại như ARM và RISC-V.