Bối cảnh và vấn đề nghiên cứu

Trong tiến trình phát triển của ngành khoa học máy tính và kỹ thuật phần cứng, kiến trúc tập lệnh (Instruction Set Architecture - ISA) và ngôn ngữ lập trình cấp thấp đóng vai trò nền tảng trong việc định hình hiệu năng tính toán của hệ thống. Trước nhu cầu xử lý dữ liệu ngày càng phức tạp, các kiến trúc máy tính đã có sự dịch chuyển mạnh mẽ từ các tập lệnh phức tạp sang các mô hình tinh gọn, tiêu biểu là kiến trúc RISC-V mã nguồn mở, song song với sự phát triển của các bộ xử lý chuyên biệt như chip xử lý đồ họa (GPU) và bộ vi xử lý trung tâm (CPU).

Báo cáo đồ án bài tập lớn kết thúc học phần Kiến trúc máy tính tại Khoa Khoa học Máy tính, Trường Đại học Công nghệ Thông tin & Truyền thông Việt Hàn (Đại học Đà Nẵng) được nhóm tác giả thực hiện nhằm khảo sát, phân tích các nguyên lý phần cứng và kỹ thuật lập trình hợp ngữ (Assembly). Mặc dù tiêu đề tổng quát của đề tài hướng đến việc tìm hiểu về chip đồ họa (GPU), phần lớn nội dung nghiên cứu thực tế của tài liệu tập trung làm rõ bản chất của kiến trúc tập lệnh RISC-V cùng các nguyên lý lập trình hệ thống thông qua ngôn ngữ Assembly.

Mục tiêu và nhiệm vụ nghiên cứu cụ thể được xác định bao gồm:

  1. Hệ thống hóa lịch sử hình thành, đặc tính cấu tạo và nguyên lý hoạt động của kiến trúc tập lệnh mã nguồn mở RISC-V.
  2. Phân tích nguyên lý cơ bản của ngôn ngữ Assembly và cách thức ngôn ngữ này giao tiếp trực tiếp với phần cứng máy tính.
  3. So sánh cấu trúc tổ chức bộ nhớ của các định dạng tệp thực thi COM và EXE trên hệ điều hành.
  4. Khảo sát cú pháp, chức năng và tác động đến cờ trạng thái của các nhóm lệnh hợp ngữ cơ bản: nhập/xuất dữ liệu cổng, nạp địa chỉ, tính toán số học, thao tác logic/dịch bit và điều khiển rẽ nhánh/ngắt hệ thống.

Đối tượng nghiên cứu chính của đề tài là kiến trúc tập lệnh RISC-V, các thành phần xử lý phần cứng và tập lệnh hợp ngữ trên nền tảng vi xử lý. Phạm vi nghiên cứu được thực hiện trong khuôn khổ học phần học thuật tại Trường Đại học Công nghệ Thông tin & Truyền thông Việt Hàn, hoàn thành vào tháng 12 năm 2023.


Cơ sở lý thuyết và phương pháp

Đề tài vận dụng các khái niệm và mô hình lý thuyết cốt lõi trong lĩnh vực kiến trúc máy tính và kỹ thuật lập trình hệ thống:

  • Kiến trúc tập lệnh RISC (Reduced Instruction Set Computing): Triết lý thiết kế vi xử lý tối ưu hóa hiệu năng bằng cách đơn giản hóa tập lệnh thực thi.
  • Mô hình kiến trúc Load-Store: Nguyên lý yêu cầu mọi phép toán thao tác dữ liệu phải được thực hiện thông qua hệ thống thanh ghi trung gian, dữ liệu nạp từ bộ nhớ vào thanh ghi trước khi tính toán và ghi ngược lại bộ nhớ sau khi hoàn tất.
  • Phân đoạn bộ nhớ (Memory Segmentation): Khái niệm quản lý bộ nhớ trên kiến trúc x86 cổ điển (như vi xử lý Intel 8088/80286 dưới hệ điều hành MS-DOS), trong đó một đoạn (Segment) bộ nhớ có kích thước giới hạn 64KB.
  • Ngôn ngữ hợp ngữ (Assembly): Ngôn ngữ lập trình cấp thấp biểu diễn trực tiếp các chỉ thị mã máy dưới dạng ký hiệu gợi nhớ (mnemonics), cho phép can thiệp và kiểm soát trực tiếp tài nguyên bộ vi xử lý.

Phương pháp nghiên cứu được áp dụng trong đề tài gồm:

  • Phương pháp phân tích - tổng hợp lý thuyết: Thu thập, trích xuất và hệ thống hóa tài liệu về quá trình phát triển của chuẩn RISC-V, cấu tạo vi xử lý và nguyên lý phân tầng thực thi của hợp ngữ.
  • Phương pháp phân tích so sánh kỹ thuật: Đối chiếu chi tiết sự khác biệt về cơ chế cấp phát bộ nhớ, các phân đoạn (Code, Data, Stack) giữa hai cấu trúc tập tin thực thi dạng .COM và .EXE.
  • Phương pháp thực nghiệm minh họa: Thiết kế mã nguồn hợp ngữ mẫu trên hai dạng tệp tin thực thi để kiểm chứng cách thức hoạt động của các chỉ dẫn biên dịch định nghĩa đoạn, việc gọi ngắt mềm hệ thống (INT 21h, INT 20h) và xuất nhập dữ liệu cổng.

Nội dung chính theo từng chương

Chương 1 - Tổng quan về GPU (và kiến trúc RISC-V)

Chương này tập trung giới thiệu về khái niệm, tiến trình lịch sử phát triển và nguyên lý hoạt động của kiến trúc tập lệnh mã nguồn mở RISC-V, bên cạnh việc định vị vai trò của đơn vị xử lý đồ họa (GPU) trong kiến trúc máy tính hiện đại.

  • Khái niệm và đặc trưng: RISC-V (phát âm là "risk-năm") là một kiến trúc tập lệnh phần cứng mã nguồn mở (Open-source ISA) dựa trên nguyên tắc tính toán với tập lệnh đơn giản hóa (RISC). Khác với các kiến trúc đóng, RISC-V cho phép tự do tùy biến, mở rộng và ứng dụng từ các thiết bị nhúng nhỏ gọn đến hệ thống máy tính trung tâm.
  • Tiến trình lịch sử phát triển:
    • Giai đoạn 2000 - 2015: Ý tưởng về RISC-V bắt đầu từ những năm 2000 tại Đại học California, Berkeley. Dự án chính thức được công bố vào năm 2010. Năm 2015, Hiệp hội RISC-V (RISC-V Foundation) được thành lập nhằm quản lý tiêu chuẩn và tạo môi trường hợp tác mở.
    • Giai đoạn 2016 - 2019: Năm 2016, SiFive phát hành hệ thống trên chip (SoC) thương mại đầu tiên dựa trên RISC-V. Kiến trúc thu hút sự tham gia của các tập đoàn công nghệ lớn như NVIDIA, Western Digital và Alibaba.
    • Giai đoạn 2020 đến nay: Năm 2020, Tổ chức RISC-V phát hành phiên bản 2.0 cải tiến về hiệu suất, bảo mật và khả năng mở rộng. Năm 2021, Intel công bố kế hoạch phát triển chip RISC-V cho máy tính trung tâm. Năm 2022, các sản phẩm thương mại tiêu biểu ra đời như SoC HiFive Unleashed của SiFive và SoC Sipeed Maixduino của Sipeed.
  • Nguyên lý hoạt động: Kiến trúc tuân thủ mô hình Load-Store nghiêm ngặt. Dữ liệu bắt buộc phải được chuyển từ ô nhớ vào thanh ghi để thực hiện phép toán, sau đó lưu lại vào bộ nhớ. Hệ thống cấu trúc bao gồm các quy định về độ dài thanh ghi, tập lệnh cơ bản (Base ISA) và các phần mở rộng (Extensions) tùy chọn theo nhu cầu ứng dụng.
  • So sánh và ứng dụng: Tài liệu chỉ ra sự phân biệt giữa CPU và các bộ xử lý tăng tốc/đồ họa trong hệ thống máy tính, đồng thời đề cập đến phạm vi ứng dụng trong lĩnh vực trò chơi điện tử (game), thiết bị IoT, điện thoại thông minh, máy tính bảng và các thiết bị học máy (Machine Learning).
Mốc thời gian Sự kiện / Thành tựu phát triển chính
Năm 2000 Các nhà nghiên cứu tại UC Berkeley hình thành ý tưởng về kiến trúc tập lệnh mở.
Năm 2010 Công bố chính thức dự án và phát hành phiên bản đầu tiên của kiến trúc RISC-V.
Năm 2015 Thành lập Hiệp hội RISC-V (RISC-V Foundation) để quản lý và chuẩn hóa.
Năm 2016 Công ty SiFive phát hành SoC thương mại đầu tiên dựa trên RISC-V.
Năm 2020 Phát hành phiên bản kiến trúc RISC-V 2.0 (nâng cấp hiệu suất, bảo mật).
Năm 2021 Intel công bố kế hoạch sản xuất chip RISC-V cho máy tính trung tâm.
Năm 2022 Thương mại hóa các SoC như SiFive HiFive Unleashed, Sipeed Maixduino.

Chương 2 - Tổng quan về Assembly

Chương 2 trình bày toàn diện về ngôn ngữ lập trình hợp ngữ, cấu trúc các tệp tin thực thi trên hệ điều hành và chi tiết danh mục tập lệnh cơ bản.

  • Bản chất của Assembly: Ngôn ngữ lập trình cấp thấp cho phép điều khiển trực tiếp bộ xử lý, được tạo ra từ việc biên dịch mã nguồn bậc cao hoặc viết trực tiếp để tối ưu hóa tương tác với phần cứng.
  • Cấu trúc tệp tin thực thi COM và EXE:
    • Tệp tin dạng COM: Chỉ bao gồm duy nhất 1 đoạn (Segment) mã lệnh (Code), chứa gộp cả lệnh, dữ liệu (Data) và ngăn xếp (Stack). Kích thước chương trình bị giới hạn tuyệt đối trong phạm vi 1 Segment (tương đương 64KB trên vi xử lý Intel 8088/80286 chạy MS-DOS). Chương trình sử dụng chỉ dẫn định vị ORG 100h, gọi ngắt INT 20h để kết thúc và bắt buộc khai báo biến ở đầu đoạn nếu dùng cú pháp đơn giản.
    • Tệp tin dạng EXE: Bao gồm 3 phân đoạn tách biệt nạp vào các vùng nhớ riêng biệt: Đoạn mã lệnh (Code), Đoạn dữ liệu (Data) và Đoạn ngăn xếp (Stack). Kích thước chương trình có thể mở rộng vượt quá 3 Segment bộ nhớ, phù hợp cho các phần mềm quy mô lớn có liên kết module phức tạp. Ngăn xếp thường được khởi tạo kích thước mặc định là 100h (256 byte).
Đặc điểm kỹ thuật Chương trình dạng COM Chương trình dạng EXE
Số lượng phân đoạn (Segment) Duy nhất 1 đoạn chung (chứa Code, Data, Stack) 3 đoạn tách biệt: Code, Data, Stack
Giới hạn kích thước Tối đa 64KB (1 Segment bộ nhớ) Lớn hơn 3 Segment bộ nhớ
Khởi tạo dữ liệu Không cần nạp lại thanh ghi đoạn DS Phải khởi tạo DS qua MOV AX, @DATA và MOV DS, AX
Khai báo Stack Nằm chung trong đoạn mã lệnh Khai báo vùng Stack riêng biệt (thường 100h byte)
Ngắt kết thúc chương trình Gọi ngắt INT 20h Trả quyền điều khiển qua thủ tục chính / hàm DOS
Phạm vi ứng dụng Chương trình tiện ích nhỏ, đơn giản Chương trình quy mô lớn, nhiều module phức tạp
  • Minh họa chương trình mẫu: Văn bản trình bày hai đoạn mã ví dụ cùng thực hiện nhiệm vụ in ra màn hình chuỗi ký tự bao gồm 4 dòng (chứa các chuỗi "University of Da Nang", "VKU - ICT", "Subject: Computer Architecture"):
    • Cấu trúc COM nạp địa chỉ hiệu dụng bằng lệnh LEA DX, MyChildren rồi gọi hàm 09h qua ngắt INT 21h, kết thúc bằng INT 20h.
    • Cấu trúc EXE thực hiện thêm thao tác khởi tạo đoạn dữ liệu: MOV AX, @Data đưa vào thanh ghi đoạn MOV DS, AX trước khi xuất chuỗi.
  • Chi tiết các nhóm lệnh hợp ngữ trong văn bản:
    • Nhóm lệnh nhập/xuất cổng:
      • IN AL/AX, Cổng: Đọc dữ liệu từ cổng ngoại vi vào thanh ghi.
      • OUT Cổng, AL/AX: Xuất dữ liệu ra cổng. Nếu địa chỉ cổng < 256 (ví dụ cổng 1Fh), số cổng ghi trực tiếp trong lệnh; nếu địa chỉ cổng ≥ 256 (ví dụ cổng máy in COM1 = 378h), bắt buộc phải nạp địa chỉ vào thanh ghi DX (MOV DX, 378h rồi OUT DX, AL). Lệnh không làm thay đổi cờ trạng thái.
    • Nhóm lệnh nạp địa chỉ:
      • LEA reg16, mem: Nạp phần địa chỉ offset của ô nhớ nguồn vào thanh ghi đích 16-bit (BX, CX, DX, BP, SI, DI).
      • LES reg, mem: Chuyển 1 từ (word) từ ô nhớ vào thanh ghi đích và 1 từ tiếp theo vào thanh ghi đoạn phụ ES.
      • LDS reg, mem: Nạp 1 từ từ bộ nhớ vào thanh ghi chỉ định và 1 từ kế tiếp vào thanh ghi đoạn DS.
    • Nhóm lệnh số học và cờ trạng thái:
      • ADD dest, source: Cộng toán hạng đích với toán hạng nguồn, lưu kết quả tại đích. Tác động đến 6 cờ: C (Carry), P (Parity), A (Auxiliary Carry), Z (Zero), S (Sign), O (Overflow).
      • INC DST: Tăng giá trị toán hạng đích thêm 1 đơn vị (DST = DST + 1).
      • SUB DST, SRC: Thực hiện trừ hai toán hạng (DST = DST - SRC). Tác động đến các cờ: C, P, A, Z, S, O.
      • MUL SRC: Nhân không dấu toán hạng nguồn. Nếu nguồn 8-bit thì kết quả lưu vào AX = AL * SRC; nếu nguồn 16-bit thì kết quả 32-bit lưu vào cặp thanh ghi DX:AX = AX * SRC. Tác động cờ C, O.
      • DIV SRC: Chia không dấu. Chia số 16-bit cho số 8-bit.
    • Nhóm lệnh dịch bit, quay bit và logic:
      • SHL AX, 1 / SHR AX, 1: Dịch trái / dịch phải bit; mỗi lần dịch bit biên được đẩy vào cờ nhớ CF, chèn bit 0 vào vị trí đối diện. Số lần dịch nhiều hơn 1 phải chứa trong thanh ghi CL. Tác động cờ: C, P, Z, S, O.
      • ROL AX, 1: Quay trái bit; bit cao nhất vừa chuyển vào cờ CF vừa được vòng lại nạp vào bit thấp nhất. Tác động cờ C, O.
      • TEST dest, source: Thực hiện phép toán logic AND giữa hai toán hạng để kiểm tra trạng thái bit mà không lưu lại kết quả, chỉ cập nhật các cờ: CF, OF, PF, ZF, SF.
    • Nhóm lệnh rẽ nhánh và gọi chương trình con:
      • CALL: Gọi chương trình con theo nhãn hoặc địa chỉ seg:offset.
      • RET: Đặt ở cuối chương trình con để quay về lệnh tiếp theo sau lệnh CALL.
      • INT n: Kích hoạt ngắt mềm (chuyển sang chạy chương trình con phục vụ ngắt tương ứng với số hiệu ngắt hệ hexa, ví dụ INT 21h tương đương ngắt 33 thập phân).
      • IRET: Lệnh quay về từ chương trình con phục vụ ngắt.
      • JMP: Nhảy không điều kiện đến nhãn hoặc địa chỉ quy định.

Kết quả và đóng góp

Nội dung đồ án đã tổng hợp và trình bày các kết quả học thuật cụ thể sau:

  • Hệ thống hóa toàn diện lộ trình phát triển của chuẩn RISC-V: Xác lập các mốc thời gian rõ ràng từ nghiên cứu khởi xướng (2000, 2010), quá trình thành lập tổ chức chuẩn hóa (2015), ra mắt chip thương mại (2016) đến giai đoạn các tập đoàn lớn (NVIDIA, Western Digital, Alibaba, Intel) tham gia ứng dụng và phát hành chuẩn 2.0 (2020-2022).
  • Làm rõ cấu trúc phân đoạn bộ nhớ trong lập trình hợp ngữ: Cung cấp mô hình phân biệt tường minh giữa hai định dạng tệp tin thực thi kinh điển .COM (đơn đoạn, giới hạn 64KB) và .EXE (đa phân đoạn Code/Data/Stack) trên hệ điều hành MS-DOS và vi xử lý kiến trúc x86.
  • Xây dựng bảng tổng hợp chi tiết tập lệnh x86: Phân tích cụ thể cơ chế truyền tham số, các hạn chế toán hạng, cách dùng thanh ghi trung gian (như DX cho địa chỉ cổng ≥ 256, CL cho số lần dịch bit, cặp DX:AX cho kết quả nhân 16-bit) và ảnh hưởng trực tiếp của từng chỉ thị lên thanh ghi cờ trạng thái (CF, ZF, SF, OF, PF, AF).

Hạn chế và hướng nghiên cứu tiếp

  • Hạn chế:
    • Tồn tại sự không đồng nhất nhất định giữa tên đề tài được giao ("GPU – Sức Mạnh Của Chip Đồ Họa Trong Kiến Trúc Máy Tính") và phần nội dung thực tế khi tài liệu tập trung phân tích sâu vào kiến trúc vi xử lý RISC-V cùng lập trình hợp ngữ x86.
    • Các phân tích và mã nguồn minh họa về Assembly được xây dựng dựa trên kiến trúc 16-bit cổ điển (Intel 8088/80286 và hệ điều hành MS-DOS), chưa mở rộng sang các kiến trúc hợp ngữ 64-bit hiện đại hay tập lệnh hợp ngữ chuyên biệt của chính RISC-V.
  • Hướng phát triển:
    • Bổ sung các nội dung nghiên cứu thực nghiệm sâu hơn về cấu trúc phần cứng của GPU (như pipeline đồ họa, nhân tính toán song song CUDA/Compute Units).
    • Chuyển đổi và thực thi các chương trình hợp ngữ trực tiếp trên trình giả lập hoặc bo mạch phần cứng RISC-V thực tế (như các dòng SoC HiFive hoặc Maixduino đã nêu trong phần lý thuyết).

Giá trị tham khảo

Báo cáo bài tập lớn này có giá trị tham khảo thiết thực đối với:

  • Sinh viên ngành Khoa học máy tính và Công nghệ thông tin: Dùng làm tài liệu củng cố lý thuyết cho học phần Kiến trúc máy tính và môn học Lập trình Hợp ngữ (Assembly).
  • Người học cần tra cứu tập lệnh vi xử lý x86 cơ bản: Cung cấp tài liệu tóm lược nhanh về cú pháp lệnh, cơ chế nạp biến địa chỉ (LEA, LDS, LES), thao tác I/O cổng và trạng thái thay đổi của các cờ điều kiện.
  • Người tìm hiểu về lịch sử phần cứng mã nguồn mở: Cung cấp cái nhìn tổng quan về quá trình hình thành, các sản phẩm SoC thương mại và các tổ chức định hình tiêu chuẩn của kiến trúc RISC-V từ năm 2000 đến năm 2023.

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

1. Sự khác biệt cơ bản nhất về phân bổ bộ nhớ giữa tệp tin thực thi dạng COM và EXE là gì?
Chương trình dạng COM chỉ có duy nhất 1 đoạn mã lệnh (Code), chứa gộp cả mã chương trình, dữ liệu và ngăn xếp, do đó bị giới hạn kích thước tối đa trong 1 Segment bộ nhớ (64KB). Ngược lại, chương trình dạng EXE có 3 phân đoạn tách biệt gồm đoạn Mã lệnh (Code), đoạn Dữ liệu (Data) và đoạn Ngăn xếp (Stack), cho phép kích thước chương trình vượt quá 3 Segment bộ nhớ để thực hiện các chức năng phức tạp.

2. Khi sử dụng lệnh OUT trong hợp ngữ x86, việc chỉ định địa chỉ cổng giao tiếp được quy định như thế nào?
Nếu địa chỉ cổng nhỏ hơn 256 (ví dụ cổng 1Fh), số địa chỉ cổng được ghi trực tiếp vào trong lệnh (OUT 1fh, AL). Nếu địa chỉ cổng lớn hơn hoặc bằng 256 (ví dụ cổng COM1 = 378h), địa chỉ bắt buộc phải được nạp vào thanh ghi DX trước khi thực hiện lệnh xuất (MOV DX, 378h sau đó gọi OUT DX, AL). Lệnh OUT không gây tác động đến thanh ghi cờ.

3. Trong phép toán nhân MUL không dấu của hợp ngữ x86, kết quả phép nhân được lưu trữ tại những thanh ghi nào?
Kết quả phép toán MUL phụ thuộc vào kích thước toán hạng nguồn: nếu toán hạng nguồn có kích thước 8-bit thì kết quả được lưu tại thanh ghi 16-bit AX (AX = AL * SRC); nếu toán hạng nguồn có kích thước 16-bit thì kết quả 32-bit được lưu trữ tại cặp thanh ghi DX:AX (DX:AX = AX * SRC). Phép toán này tác động trực tiếp đến hai cờ C và O.

4. Kiến trúc tập lệnh RISC-V được công bố chính thức vào năm nào và tổ chức nào quản lý tiêu chuẩn này?
Kiến trúc RISC-V bắt đầu được nghiên cứu ý tưởng từ những năm 2000 tại Đại học California, Berkeley và được công bố chính thức vào năm 2010. Đến năm 2015, Hiệp hội RISC-V (RISC-V Foundation) được thành lập để chịu trách nhiệm quản lý, xây dựng tiêu chuẩn và cung cấp tài nguyên phát triển cho toàn bộ cộng đồng công nghệ.

5. Điểm khác biệt cốt lõi giữa lệnh TEST và lệnh AND trong ngôn ngữ Assembly là gì?
Lệnh TEST thực hiện phép toán logic AND giữa toán hạng đích và toán hạng nguồn nhằm kiểm tra trạng thái bit để cập nhật các cờ điều kiện (bao gồm CF, OF, PF, ZF, SF), nhưng không ghi đè hay làm thay đổi giá trị của toán hạng đích như lệnh AND thông thường.


Kết luận

Đồ án bài tập lớn kết thúc học phần Kiến trúc máy tính của nhóm sinh viên Trường Đại học Công nghệ Thông tin & Truyền thông Việt Hàn đã tổng hợp có hệ thống các kiến thức nền tảng về kiến trúc tập lệnh mở RISC-V và kỹ thuật lập trình cấp thấp bằng ngôn ngữ Assembly. Nghiên cứu đã làm rõ nguyên lý kiến trúc Load-Store, tiến trình phát triển của các chuẩn vi xử lý hiện đại, cùng cơ chế tổ chức bộ nhớ phân đoạn và bảng chỉ thị lệnh chi tiết trên vi xử lý x86. Tài liệu là nguồn tổng hợp lý thuyết và bài tập mẫu phù hợp cho sinh viên trong quá trình học tập, tiếp cận các kiến thức căn bản về phần cứng và cấu trúc máy tính.