Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 4: Mô hình von Neumann và kiến trúc tập lệnh LC-3
4.1 Các thành phần cơ bản
4.2 Một ví dụ về mô hình von Neumann: LC-3
4.3 Quá trình xử lý lệnh
4.4 Thay đổi quá trình xử lý lệnh
4.5 Khái niệm ISA LC-3
4.6 Nhóm lệnh thi hành
4.7 Nhóm lệnh di chuyển dữ liệu
4.8 Nhóm lệnh điều khiển
4.9 Ba cấu trúc lệnh trong LC-3
4.10 Một ví dụ
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 4: Mô hình von Neumann và kiến trúc tập lệnh LC-3", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 4: Mô hình von Neumann và kiến trúc tập lệnh LC-3
c dấu chấm cố định hay số thực dấu chấm động. Trong kiến trúc tập lệnh LC-3, kiểu dữ liệu duy nhất được sử dụng là dạng số nguyên bù 2. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.5 Khái niệm ISA LC-3 4.5.6 Các kiểu định vị địa chỉ Một kiểu định vị địa chỉ là một cơ chế để xác định toán hạng ở đâu. Tổng quát, một toán hạng có thể được tìm ở một trong ba chỗ: trong bộ nhớ, trong một thanh ghi, hoặc là một phần của lệnh. Nếu nó là một phần của lệnh, ta gọi nó là toán hạng tức thời. LC-3 sử dụng năm kiểu định vị địa chỉ: tức thời, thanh ghi, và ba kiểu định vị địa chỉ bộ nhớ là PC-relative, gián tiếp và Base+offset. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.5 Khái niệm ISA LC-3 4.5.7 Các mã điều kiện Hầu như tất cả các ISA đều cho phép quá trình thực hiện lệnh được thay đổi tùy thuộc vào kết quả được tạo ra trước đó. LC-3 có ba thanh ghi một bit được đặt (set to 1) hay xóa (xóa về 0) mỗi khi một trong tám thanh ghi đa dụng được ghi trị. Ba thanh ghi một bit này được gọi là các thanh ghi trạng thái N, Z, và P CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.6 Nhóm lệnh thi hành CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.6 Nhóm lệnh thi hành Ví dụ 4.4: Nếu R5 đang chứa 0101000011110000, thì sau khi thực hiện xong lệnh sau: thanh ghi R3 sẽ lưu 1010111100001111. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.6 Nhóm lệnh thi hành CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.6 Nhóm lệnh thi hành Ví dụ 4.5: Nếu R4 chứa trị 6 và R5 chứa trị -18, sau khi lệnh dưới được thực thi thì thanh ghi R1 chứa trị -12. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.6 Nhóm lệnh thi hành Nếu bit [5] là 1, toán hạng nguồn thứ hai được chứa ngay bên trong lệnh, và có được bằng phép mỡ rộng dấu 5 bit [4:0] thành 16 bit trước khi thực hiện phép ADD hoặc AND. Hình 4.5 trình bày các phần quan trọng của đường truyền dữ liệu để thực hiện lệnh ADD R1, R4, #-2. Cũng cần lưu ý là vùng trị tức thời này chỉ có 5 bit ở dạng bù 2, nên nó chỉ có thể chứa trị trong khoảng - 16..15 mà thôi. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.6 Nhóm lệnh thi hành CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.6 Nhóm lệnh thi hành CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.6 Nhóm lệnh thi hành Ví dụ 4.8: ba lệnh dưới đây thực hiện việc tính hiệu hai trị đang nằm trong hai thanh ghi R0 và R1. Hai lệnh đầu (NOT R1, R1 và ADD R2, R1, 1) sẽ tính bù 2 của trị đang có trong thanh ghi R1. Lệnh ADD R2, R0, R2 tính hiệu giữa hai trị ban đầu trong R0 và R1 theo yêu cầu. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu Nhóm lệnh chuyển dữ liệu thực hiện việc sao chép thông tin qua lại giữa các thanh ghi đa dụng và bộ nhớ, giữa các thanh ghi và các thiết bị xuất nhập. Quá trình chép thông tin từ bộ nhớ vào thanh ghi được gọi là nạp (load), và quá trình chép thông tin từ thanh ghi vào bộ nhớ gọi là lưu (store) . Trong cả hai trường hợp, thông tin trong toán hạng nguồn không đổi, còn thông tin cũ trong toán hạng đích đã bị ghi đè bởi thông tin mới sau quá trình chép. LC-3 có bảy lệnh thực hiện việc sao chép dữ liệu: LD, LDR, LDI, LEA, ST, STR, và STI. Định dạng chung cho các lệnh này là CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu Các lệnh chuyển dữ liệu cần hai toán hạng, một nguồn và một đích. Toán hạng nguồn là nơi dữ liệu cần được chép, còn toán hạng đích là là nơi cần chép thông tin vào. Trong định dạng trên, các bit [15:12] xác định mã thao tác opcode, các bit [11:9] quy định một trong hai toán hạng, là thanh ghi có mã theo quy ước. Các bit [8:0] chứa các bit tạo địa chỉ (Address generation bits), mã hóa thông tin để tính ra địa chỉ 16 bit của toán hạng thứ hai. LC-3 có bốn kiểu định vị địa chỉ: định vị tương đối từ PC (PC- Relative mode), định vị gián tiếp (Indirect mode), định vị base + offset (base+offset mode), và định vị tức thời (immediate mode). CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.1 PC-relative mode Lệnh LD (opcode = 0010) và ST (opcode = 0011) dùng kiểu định vị tương đối PC. Các bit [8:0] của lệnh xác định một độ dời (offset) tính từ thanh ghi PC. Địa chỉ bộ nhớ được tính từ tổng của 16 bit địa chỉ sau phép mở rộng dấu từ các bit [8:0] và thanh ghi PC đã được tăng 1 sau pha FETCH. Với lệnh LD, ô nhớ tương ứng với địa chỉ bộ nhớ đã tính được đọc, và ghi vào thanh ghi được xác định bởi các bit [11:9] của lệnh. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.1 PC-relative mode Ví dụ 4.9: Nếu lệnh nằm ở ô nhớ có địa chỉ x4018, thì nội dung ô nhớ có địa chỉ x4019 + SEXT (x1AF) = x4019 + xFFAF = x3FC8 (bỏ bit 1 do vượt quá chiều dài 16 bit) sẽ được đọc và nạp vào thanh ghi R2. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.1 PC-relative mode CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.2 Indirect mode Lệnh LDI (opcode = 1010) và lệnh STI (opcode = 1011) sử dụng kiểu định vị địa chỉ gián tiếp. Với kiểu định vị này, địa chỉ đầu tiên được tạo ra cũng tương tự như với lệnh LD và ST. Tuy nhiên, thay vì đây địa chỉ của toán hạng chứa dữ liệu cần được nạp hay lưu, thì toán hạng này lại chứa địa chỉ của toán hạng là dữ liệu cần được nạp hay lưu. Vì phải qua trung gian như vậy nên ta mới có kiểu định vị địa chỉ gián tiếp. Với kiểu định vị này, ta thấy toán hạng chứa dữ liệu cần làm việc có thể ở bất cứ đâu trong bộ nhớ 64K, chứ không bị giới hạn trong tầm 9 bit [8:0] như trong trường hợp lệnh LD và ST. Thanh ghi đích cho LDI và thanh ghi nguồn trong STI cũng được xác định bằng các bit [11:9] trong lệnh. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.2 Indirect mode Ví dụ 4.10: Nếu lệnh ở địa chỉ x4A1B, và chứa đựng của x49E8 là x2110, việc thực thi lệnh này sẽ lấy dữ liệu từ ô nhớ có địa chỉ x2110 nạp vào thanh ghi R3. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.2 Indirect mode CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.3 Base+offset mode Lệnh LDR (opcode = 0110) và STR (opcode = 0111) dùng kiểu định vị Base+offset. Kiểu định vị này xác định địa chỉ toán hạng trong bộ nhớ 64K bằng cách lấy 6 bit offset được mở rộng dấu IR[5:0] cộng với thanh ghi nền trong vùng IR[8:6]. Ví dụ 4.11: Nếu R2 đang chứa trị 16 bit x2345, lệnh nạp R1 nội dung của ô nhớ x2362 (x2345 + x1D). CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.3 Base+offset mode CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.4 Immediate mode Ví dụ 4.12: Nếu ô nhớ x4018 chứa lệnh LEA R5, #-3, và thanh ghi PC chứa x4018, ta có lệnh CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.7 Nhóm lệnh di chuyển dữ liệu 4.7.5 Ví dụ: Giả sử các lệnh được chứa trong các ô nhớ từ địa chỉ x30F6 tới x30FC như hình 4.10 sau. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển Các lệnh điều khiển thay đổi trình tự các lệnh thực thi trong chương trình. LC-3 có năm mã lệnh thực hiện việc này: lệnh rẽ nhánh (Branch) có điều kiện, lệnh nhảy (Jump) không điều kiện, gọi chương trình con, TRAP, và lệnh trả vể từ ngắt (Interrupt). Trong mục này chủ yếu chúng ta nói về lệnh rẽ nhánh có điều kiện, lệnh nhảy không điều kiện, và TRAP. 4.8.1 Lệnh rẽ nhánh có điều kiện Định dạng của lệnh rẻ nhánh có điều kiện (opcode = 0000) như sau: CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.1 Lệnh rẽ nhánh có điều kiện Trong LC-3, tất cả các lệnh mà có ghi trị vào các thanh ghi đa dụng sẽ đặt trị cho ba mã điều kiện (NZP) là ADD, AND, NOT, LD, LDI, LDR, và LEA. Các mã điều kiện được lệnh rẽ nhánh có điều kiện sử dụng để xác định xem có thay đổi trình tự lệnh hay không; nghĩa là, xem sự thực thi lệnh có theo trình tự thường thấy như là kết quả của việc tăng thanh ghi PC trong phase FETCH của mỗi lệnh hay không. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.1 Lệnh rẽ nhánh có điều kiện Trong khi thực hiện phase EXECUTE, bộ xử lý khảo sát các mã điều kiện mà các bit tương ứng của nó trong lệnh là 1. Nếu có một mã điều kiện mà được kiểm tra và thấy bằng 1, thanh ghi PC được nạp bằng địa chỉ có được trong phase EVALUATE ADDRESS. Ngược lại, khi không có một mã điều kiện mà được kiểm tra và thấy bằng 1, PC giữ trị không đổi. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.1 Lệnh rẽ nhánh có điều kiện Ví dụ 4.13: Nếu giá trị cuối cùng được nạp vào một thanh ghi đa dụng nào đó là 0, thì lệnh hiện thời (ở ô nhớ x4027) dưới đây sẽ nạp thanh ghi PC bằng trị x4101 (x4028 + x0D9), tức lệnh kế cần thực thi sẽ ở ô nhớ x4101, chứ không phải ở ô nhớ x4028. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.1 Lệnh rẽ nhánh có điều kiện CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.1 Lệnh rẽ nhánh có điều kiện Nếu tất cả ba bit [11:9] đều là 1???? CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.1 Lệnh rẽ nhánh có điều kiện Ví dụ 4.14: Nếu lệnh sau đây ở ô nhớ x507B được thực thi, thi thanh ghi PC được nạp trị x5201. Độc giả hãy suy nghĩ xem nếu tất cả ba bit [11:9] trong lệnh BR đều bằng không, điều gì sẽ xảy ra? CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.2 Ví dụ Giả sử chúng ta đã có 12 ô nhớ từ x3100 tới x310B chứa 12 số nguyên mà chúng ta cần tính tổng. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.2 Ví dụ CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.3 Hai phương pháp điều khiển lặp Chúng ta dùng thuật ngữ lặp (loop) để mô tả chuỗi lệnh cần được thực thi lặp đi lặp lại theo một cơ chế điều khiển nào đó. Mỗi khi thân vòng lặp được thực hiện ta gọi là sự lặp lại (iteration) của vòng lặp. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.3 Hai phương pháp điều khiển lặp Trong ví dụ ở mục trên, phương pháp biến đếm được sử dụng. Nếu chúng ta biết chính xác số lần lặp là n lần, thì đơn giản chúng ta chỉ cần gán cho biến đếm trị n, và sau mỗi lần lặp, chúng ta cần giảm biến đếm này và kiểm tra nó xem có là 0 hay chưa. Nếu chưa là 0, chúng ta đặt trị cho thanh ghi PC bằng địa chỉ của lệnh đầu thân vòng lặp, và tiếp tục sự lặp lại. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.3 Hai phương pháp điều khiển lặp Phương pháp thứ hai là dùng trị canh (sentinel). Cách này đặc biệt hiệu quả khi chúng ta không biết trước có bao nhiêu sự lặp lại cần phải được thực hiện. Thông thường quá trình lặp sẽ là dãy các sự kiện cần xử lý, chúng ta cần thêm vào dãy sự kiện này một sự kiện là kiểm tra một giá trị mà chúng ta biết trước hay theo quy ước là không bao giờ xuất hiện trong các sự kiện gốc. Nếu việc kiểm tra này xảy ra, tức việc lặp kết thúc. Giá trị đó được gọi là trị canh. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.4 Ví dụ Giả sử chúng ta cần cộng các trị nguyên dương từ ô nhớ x3100 tới x310B. Khi đó chúng ta có thể dùng bất kỳ trị âm nào để làm trị canh. Giả sử trị canh được chứa ở ô nhớ x310C là -1. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.4 Ví dụ CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.5 Lệnh JMP Lệnh JMP nạp thanh ghi PC bằng trị của thanh ghi xác định bời các bit [8:6] của lệnh. Nếu lệnh JMP nằm ở địa chỉ x4000, R2 chứa trị x6600, và PC chứa x4000, thì lệnh JMP ở x4000 sẽ được thực thi, làm cho lệnh kế tiếp là lệnh ở x6600. Vì các thanh ghi đều dài 16 bit, có thể mã hóa địa chỉ cho cả bộ nhớ 64K của ISA LC-3, nên lệnh JMP không có giới hạn cho lệnh kế cần được thực thi. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.6 Lệnh TRAP Lệnh TRAP (opcode = 1111) cho phép lấy dữ liệu vào và xuất dữ liệu ra khỏi máy tính và có định dạng như sau. Lệnh này thay đổi trị của thanh ghi PC, làm nó chỉ tới một vị trí trong bộ nhớ mà là một phần của hệ điều hành để hệ điều hành thực hiện một tác vụ nào đó nhân danh chương trình đang được thực thi. Theo kiểu nói của ngôn ngữ hệ điều hành, chúng ta nói lệnh TRAP gọi một dịch vụ của hệ điều hành (service call). Các bit [7:0] của lệnh TRAP tạo nên một trapvector 8 bit, xác định dịch vụ cần gọi mà chương trình muốn hệđiề hành thực hiện. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.8 Nhóm lệnh điều khiển 4.8.6 Lệnh TRAP Một số dịch vụ chúng ta cần biết để sử dụng ngay là : • Nhập một ký tự từ bàn phím: trapvector = x23 • Xuất một ký tự ra màn hình: trapvector = x21 • Kết thúc chương trình: trapvector = x25. Khi hệ điều hành hoàn tất dịch vụ, bộ đếm chương trình PC sẽ được đặt trở lại địa chỉ của lệnh ngay sau lệnh TRAP trong chương trình đang được thực thi, và chương trình tiếp tục chạy. Đây cũng là khả năng thực hiện giao tiếp của LC-3 giữa hệ điều hành và chương trình đang được thực thi. CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.9 Ba cấu trúc lệnh trong LC-3 4.9.1 Ba cấu trúc cơ bản trong lập trình có cấu trúc Trong lập trình có ba cấu trúc lệnh cơ bản để thực hiện các tác vụ cần thiết, đó là các cấu trúc tuần tự (sequential), điều kiện (conditional), và lặp (iterative). Hình 4.16 trình bày ba cấu trúc cơ bản triển khai tác vụ cần thực thi (task). CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.9 Ba cấu trúc lệnh trong LC-3 4.9.1 Ba cấu trúc cơ bản trong lập trình có cấu trúc CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.9 Ba cấu trúc lệnh trong LC-3 4.9.2 Ba cấu trúc trong LC-3 CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.10 Một ví dụ Đếm số lần xuất hiện của một ký tự xác định trước (được nhập từ bàn phím) trong một mảng ký tự (file) cho trước. Sau đó hiển thị số lần xuất hiện này ra màn hình(chấp nhận số lần xuất hiện tối đa của một ký tự là 9) CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.10 Một ví dụ CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.10 Một ví dụ CHƢƠNG 4 MÔ HÌNH VON NEUMANN VÀ KIẾN TRÚC TẬP LỆNH LC-3 4.10 Một ví dụ
File đính kèm:
- bai_giang_he_thong_may_tinh_va_ngon_ngu_c_chuong_4_mo_hinh_v.pdf