intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Giáo trình học phần Vi xử lý (hệ đại học): Phần 1

Chia sẻ: Minh Vũ | Ngày: | Loại File: PDF | Số trang:57

145
lượt xem
35
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

(NB) Phần 1 cuốn giáo trình học phần "Vi xử lý" giới thiệu tới người đọc các kiến thức: Bộ vi xử lý 8086/8088, các bộ vi xử lý tiên tiến của Intel, cấu trúc lập trình Assembly. Hi vọng đây sẽ là một tài liệu hữu ích dành cho các bạn sinh viên công nghệ thông tin dùng làm tài liệu học tập và nghiên cứu.

Chủ đề:
Lưu

Nội dung Text: Giáo trình học phần Vi xử lý (hệ đại học): Phần 1

  1. Tr−êng ®¹i häc s− ph¹m kü thuËt h−ng yªn Khoa C«ng nghÖ Th«ng tin W™X Gi¸o tr×nh häc phÇn Vi xö lý (HÖ §¹i häc) Tµi liÖu l−u hµnh néi bé H−ng Yªn 2005
  2. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn MỤC LỤC Chương 1. BỘ VI XỬ LÝ 8086/8088 ……………………………..……………………2 1.1. Tổng quan về các bộ vi xử lý của Intel ..................................................................... 2 1.2. Cấu trúc bộ vi xử lý 8086 .......................................................................................... 3 1.2.1. Sơ đồ khối ........................................................................................................... 3 1.2.2. Giải thích các thành phần trong sơ đồ ................................................................ 3 1.2.3. Một số khái niệm cơ bản..................................................................................... 4 1.3. Tập thanh ghi của bộ vi xử lý 8086........................................................................... 5 1.3.1. Các thanh ghi dữ liệu .......................................................................................... 5 1.3.2. Các thanh ghi đoạn: CS, DS, ES, SS .................................................................. 6 1.3.3. Các thanh ghi con trỏ và chỉ số: SI, DI, SP, BP ................................................. 6 1.3.4. Thanh ghi con trỏ lệnh: IP .................................................................................. 7 1.3.5. Thanh ghi cờ ....................................................................................................... 7 1.4. Tập lệnh của bộ vi xử lý ............................................................................................ 7 1.4.1. Sơ lược về tập lệnh của bộ vi xử lý .................................................................... 7 1.4.2. Tập lệnh của CPU ............................................................................................... 8 1.4.3. Nhóm lệnh di chuyển dữ liệu.............................................................................. 8 1.4.4. Nhóm lệnh số học ............................................................................................. 10 1.4.5. Nhóm lệnh logic ............................................................................................... 11 1.4.6. Nhóm lệnh dịch chuyển và quay ...................................................................... 12 1.4.7. Nhóm lệnh điều khiển rẽ nhánh ........................................................................ 13 1.4.8. Nhóm lệnh vào ra cổng ..................................................................................... 14 1.4.9. Nhóm lệnh điều khiển ....................................................................................... 14 1.5. Chế độ địa chỉ của bộ vi xử lý 8086........................................................................ 14 1.5.1. Tổng quan ......................................................................................................... 14 1.5.2. Các chế độ địa chỉ dữ liệu................................................................................. 15 1.5.3. Chế độ địa chỉ thanh ghi ................................................................................... 15 1.5.4. Chế độ địa chỉ tức thì ........................................................................................ 15 1.5.5. Chế độ địa chỉ trực tiếp ..................................................................................... 15 1.5.6. Chế độ địa chỉ gián tiếp thanh ghi .................................................................... 16 1.5.7. Chế độ địa chỉ tương đối cơ sở(Base Relative Addressing) ............................. 16 1.5.8. Chế độ địa chỉ tương đối chỉ số(Indexed Relative Addressing) ....................... 17 1.5.9. Chế độ địa chỉ tương đối chỉ số cơ sở(Base Indexed Relative) ........................ 17 1.5.10. Bảng tóm tắt các chế độ địa chỉ ...................................................................... 18 1.6. Phân tích mã lệnh mã máy ...................................................................................... 18 1.6.1. Khuôn dạng lệnh ............................................................................................... 18 1.6.2. Một số mã lệnh mã máy.................................................................................... 20 1.6.3. Một số ví dụ minh họa ...................................................................................... 21 1.7. Lập trình và gỡ rối bằng DEBUG ........................................................................... 22 1.7.1. Giới thiệu về lệnh của DEBUG ........................................................................ 22 1.7.2. Lập trình bằng DEBUG .................................................................................... 24 1.7.3. Gỡ rối chương trình bằng DEBUG ................................................................... 25 Chương 2. CÁC BỘ VI XỬ LÝ TIÊN TIẾN CỦA INTEL........................................ 26 2.1. Bộ vi xử lý 80286 .................................................................................................... 26 2.1.1. Các thanh ghi .................................................................................................... 26 2.1.2. Tập lệnh ............................................................................................................ 27 Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY http://www.ebook.edu.vn
  3. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn 2.2. Bộ vi xử lý 80386 .................................................................................................... 28 2.2.1. Sơ đồ khối của 80386 ....................................................................................... 28 2.2.2. Các thanh ghi .................................................................................................... 28 2.2.3. Quản lý bộ nhớ ................................................................................................. 30 2.2.4. Tập lệnh ............................................................................................................ 32 2.3. Bộ vi xử lý 80486 .................................................................................................... 32 2.3.1. Các phần tử xử lý CISC và RISC ..................................................................... 32 2.3.2. Vi xử lý 80486 .................................................................................................. 33 2.4. Các bộ vi xử lý Intel Pentium ................................................................................. 35 2.4.1. Đặc điểm chung ................................................................................................ 35 2.4.2. Cấu trúc và tính năng ........................................................................................ 35 2.5. Bộ đồng xử lý toán 80x87 ....................................................................................... 39 2.5.1. Sơ lược về các số thực ...................................................................................... 39 2.5.2. Cấu trúc của 8087 ............................................................................................. 39 2.5.3. Tập lệnh của 8087 ............................................................................................. 39 2.6. Cấu trúc và chức năng của 8087 ............................................................................. 39 2.6.1. Sơ đồ khối bên trong của 8087 ......................................................................... 39 2.6.2. Nối 8087 với CPU ............................................................................................ 42 2.7. Đồng xử lý 80287 ................................................................................................ 42 Chương 3. CẤU TRÚC LẬP TRÌNH ASSEMBLY ................................................... 43 3.1. Tổng quan về ngôn ngữ lập trình ASSEMBLY ...................................................... 43 3.1.1. Khái niệm.......................................................................................................... 43 3.1.2. So sánh hợp ngữ với các ngôn ngữ bậc cao...................................................... 43 3.2. Các đoạn trong một chương trình ........................................................................... 44 3.3. Cấu trúc chung của một lệnh ASSEMBLY ............................................................ 44 3.4. Khai báo dữ liệu và kiểu dữ liệu ............................................................................. 45 3.4.1. Biến byte ........................................................................................................... 45 3.4.2. Biến Word ......................................................................................................... 46 3.4.3. Biến mảng ......................................................................................................... 46 3.4.4. Biến chuỗi ......................................................................................................... 47 3.5. Khung của một chương trình ASSEMBLY ............................................................ 47 3.5.1. Cấu trúc chương trình để dịch ra tệp *.EXE..................................................... 47 3.5.2. Cấu trúc chương trình để dịch ra tệp *.COM ................................................... 50 3.6. Cách tạo một chương trình hợp ngữ ....................................................................... 52 Chương 4. CÁC CẤU TRÚC LẬP TRÌNH .............................................................. 55 4.1. Tổng quan................................................................................................................ 55 4.1.1. Các lệnh chuyển điều khiển .............................................................................. 55 4.2. Cấu trúc tuần tự ....................................................................................................... 56 4.3. Cấu trúc rẽ nhánh .................................................................................................... 57 4.3.1. Cấu trúc IF…THEN… ..................................................................................... 57 4.3.2. Cấu trúc IF..THEN…ELSE .............................................................................. 58 4.3.3. Cấu trúc rẽ nhánh CASE…OF… ..................................................................... 59 4.3.4. Cấu trúc rẽ nhánh với điều kiện kép ................................................................. 60 4.4. Cấu trúc lặp ............................................................................................................. 61 4.4.1. Cấu trúc FOR…TO…DO… ............................................................................. 61 4.4.2. Cấu trúc WHILE…DO… ................................................................................. 62 Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY http://www.ebook.edu.vn
  4. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn 4.4.3. Cấu trúc REPEAT…UNTIL… ........................................................................ 63 4.5. Cấu trúc chương trình con ....................................................................................... 63 4.5.1. Cấu trúc của chương trình con .......................................................................... 64 4.5.2. Cách gọi và thực hiện một chương trình con.................................................... 66 4.6. MACRO .................................................................................................................. 67 4.6.1. Định nghĩa MACRO ......................................................................................... 67 4.6.2. Gọi MACRO trong chương trình...................................................................... 68 4.6.3. Gọi MACRO từ đoạn chương trình khác ......................................................... 70 Chương 5. MỘT SỐ VẤN ĐỀ NÂNG CAO ............................................................. 72 5.1. Lập trình xử lý số nguyên ....................................................................................... 72 5.2. Cấu trúc dữ liệu mảng ............................................................................................. 72 5.2.1. Khai báo mảng .................................................................................................. 72 5.2.2. Sử dụng mảng ................................................................................................... 73 5.3. Cấu trúc dữ liệu xâu ký tự ....................................................................................... 75 5.3.1. Cờ định hướng .................................................................................................. 75 5.3.2. Lệnh chuyển đổi một chuỗi .............................................................................. 76 5.3.3. Lệnh lưu chuỗi .................................................................................................. 77 5.3.4. Lệnh nạp chuỗi ................................................................................................. 77 5.4. Lập trình xử lý số thực ............................................................................................ 80 5.5. Lập trình cho các bộ vi xử lý tiên tiến .................................................................... 80 Chương 6. LIÊN KẾT ASSEMBLY VỚI CÁC NGÔN NGỮ BẬC CAO .................. 80 6.1. Lập trình mã lệnh mã máy ...................................................................................... 80 6.1.1. Cú pháp ............................................................................................................. 81 6.1.2. Thực hiện .......................................................................................................... 81 6.1.3. Một số chú ý ..................................................................................................... 81 6.1.4. Ví dụ ................................................................................................................. 81 6.2. Lập trình mã lệnh gợi nhớ ....................................................................................... 83 6.2.1. Chèn khối lệnh ASSEMBLY............................................................................ 83 6.3. Ngắt và lập trình ngắt trong ngôn ngữ bậc cao ....................................................... 85 6.3.1. Khái niệm về ngắt ............................................................................................. 85 6.3.2. Phân loại ngắt ................................................................................................... 86 6.3.3. Giới thiệu về một số ngắt .................................................................................. 86 Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY http://www.ebook.edu.vn
  5. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn Phần I BỘ VI XỬ LÝ Chương 1. BỘ VI XỬ LÝ 8086/8088 1.1. Tổng quan về các bộ vi xử lý của Intel Một hệ vi xử lý được gọi là một hệ thống trong đó bao gồm: - Đơn vị nhập xuất: Được sử dụng để nhập và xuất số liệu, dữ liệu. - Đơn vị xử lý: Xử lý các dữ liệu nhập vào, sau đó xuất ra các thiết bị ra. - Bộ nhớ: Lưu trữ thông tin, dữ liệu trong quá trình xử lý Tất cả các thiết bị có các chức năng như vậy đều có thể được gọi là một hệ vi xử lý. Máy vi tính là một hệ thống vi xử lý. Một thành phần quan trọng trong hệ thống máy vi tính, đó là bộ vi xử lý. Trên thực tế, có rất nhiều hãng chế tạo bộ vi xử lý cho các máy vi tính như: IBM, Intel, Cyrix, AMD, Motorola.... Nhưng thông dụng nhất vẫn là bộ vi xử lý của Intel. Các bộ vi xử lý của Intel được phát triển qua các thời kỳ như sau: o Năm 1971, Intel đưa ra bộ vi xử lý 4004 với 4 bit dữ liệu, 12 bit địa chỉ; 0,8MHz o Năm 1972, bộ vi xử lý Intel 8080 ra đời với 8bit dữ liệu, 12 bit địa chỉ; tốc độ xử lý 0,8-5MHz o Năm 1974, bộ vi xử lý Intel 8085 ra đời với 8bit dữ liệu, 16 bit địa chỉ; tốc độ xử lý 5MHz o Năm 1978, bộ vi xử lý Intel 8086 ra đời với 16bit dữ liệu, 20 bit địa chỉ; tốc độ xử lý 10MHz o Năm 1979, bộ vi xử lý Intel 8088 ra đời nhằm mục đích giảm giá bộ vi xử lý và tương thích với hệ thống 8086 cũ o Năm 1982 bộ vi xử lý 80286 ra đời với 16bit dữ liệu, 20 bit địa chỉ, tốc độ xử lý là 20MHz có thể định địa chỉ ở chế độ bảo vệ và chế độ thực. o Năm 1985-1988, bộ vi xử lý 80386 ra đời với 32 bit dữ liệu và 32 bit địa chỉ tốc độ xử lý 33-40MHz o Năm 1989, bộ vi xử lý 80486 ra đời với 32 bit dữ liệu và 32 bit địa chỉ tốc độ xử lý 50-60MHz o Năm 1993, bộ vi xử lý Pentium ra đời với 64 bit dữ liệu, tốc độ xử lý 100MHz Sau đó là các bộ vi xử lý Pentium Pro, Pentium II, Pentium III, Celeron, Pentium 4,.. Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 2
  6. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn 1.2. Cấu trúc bộ vi xử lý 8086 1.2.1. Sơ đồ khối E.U (execution unit) B.I.U (Bus interface unit) Bus ®Þa chØ (20 bit) Bus AX Accumulator ∑ d÷ liÖu (8 bit) C¸c thanh ghi BX Base ®a n¨ng CX Count Bus DX Data Code segment CS C¸c trong SP Stack pointer Data segment DS thanh cña C¸c thanh ghi BP Base pointer Stack segment SS ®o¹n CPU ghi con trá 8 bit SI Source index Extra segment ES vμ con vμ chØ sè d÷ liÖu DI Destination index trá IP 20 bit Intruction pointer lÖnh ®Þa chØ Bus d÷ liÖu ALU (16 bit) Logic ®iÒu Bus C¸c thanh ghi t¹m thêi khiÓn Bus ngoμi Khèi ®iÒu khiÓn cña ALU EU §Öm lÖnh (hμng ®îi lÖnh) (6 byte cho 8086) Thanh ghi cê H×nh 1.1 : S¬ ®å cÊu tróc bªn trong bé vi xö lý 8086/8088 1.2.2. Giải thích các thành phần trong sơ đồ Khối phối ghép Bus (Bus Interface Unit - BIU) Khối thực hiện lệnh (Execution Unit - EU) Đơn vị EU Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 3
  7. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn Đơn vị EU của 8086 và 8088 là giống nhau nó bao gồm ALU, các thanh ghi cờ, thanh ghi đệm và các thanh ghi đa năng. Các kênh truyền dữ liệu bên trong EU đều là 16 bit. EU không nối trực tiếp với thế giới bên ngoài, nó lấy lệnh từ hàng đợi lệnh của BIU. Nếu lệnh cần truy xuất bộ nhớ hoặc cổng vào/ra (là nơi liên hệ với thiết bị ngoại vi ) thì EU yêu cầu BIU nhận hoặc gửi dữ liệu. Tất cả các địa chỉ mà BIU thao tác đều là 16 bit, khi gửi sang cho BIU sẽ sắp đặt lại để tạo thành địa chỉ vật lý 20 bit phát ra các chân ra địa chỉ của chip. Đơn vị BIU Đơn vị BIU thực hiện tất cả các thao tác với Bus mà BIU yêu cầu, ngoài ra khi BIU đang thực hiện một lệnh, thì BIU có thể lấy lệnh từ bộ nhớ về đặt trong hàng đợi lệnh. Hàng đợi lệnh của 8086 dài 6 byte, của 8088 dài 4 byte. Việc lấy lệnh về của BIU và việc thực hiện lệnh của BIU thực hiện song song với nhau (trừ một số trường hợp ngoại lệ) làm cho hiệu năng của vi xử lý tăng lên. 1.2.3. Một số khái niệm cơ bản * Pipelining: Là một phương pháp xử lý lệnh trên một đường ống lệnh, có thể xử lý nhiều lệnh đồng thời trong cùng một khoảng thời gian. Trong khi lệnh này đang được xử lý thì lệnh tiếp sau nó đã được nhận vào... Chúng ta có thể so sánh phương pháp xử lý bằng pipeline và phương pháp xử lý dòng lệnh tuần tự như hai hình dưới đây: Time Instruction 1 1 2 3 4 Instruction 2 1 2 3 4 Instruction 3 1 2 a) Time Instruction 1 1 2 3 4 Instruction 2 1 2 3 4 Instruction 3 1 2 3 4 Instruction 4 1 2 3 4 b) Hình 1.2. So sánh pipeline và tuần tự a) Xử lý tuần tự b) Xử lý bằng Pipeline * CISC, RISC và VLIW CISC – Complex Instruction Set Computer (Máy tính với tập lệnh đầy đủ) RISC – Reduced Instruction Set Computer (Máy tính với tập lệnh rút gọn) VLIW – Very Long Instruction Word (Máy tính với từ lệnh cực dài) Về cơ bản, công nghệ hiện nay vẫn dựa trên cơ sở bộ vi xử lý CISC và RISC. Chúng ta có thể so sánh sơ bộ về hai công nghệ này: Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 4
  8. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn RISC CISC Cấu thành từ một vài lệnh đơn Đầy đủ với độ phân cấp Các lệnh được thực thi bằng Các lệnh được thực thi bằng phần cứng các vi chương trình Kích thước của một lệnh và Kích thước và thời gian thời gian thực thi của mỗi thực hiện của các lệnh khác lệnh gần như nhau nhau. 1.3. Tập thanh ghi của bộ vi xử lý 8086 1.3.1. Các thanh ghi dữ liệu Mặc dù bộ vi xử lý có thể thao tác với dữ liệu bộ nhớ nhưng một lệnh như vậy sẽ được thực hiện nhanh hơn (cần ít chu kỳ đồng hồ hơn), nếu dữ liệu được lưu trong các thanh ghi. Đó cũng là nguyên nhân tại sao ngày nay các bộ vi xử lý được sản xuất với xu hướng có nhiều thanh ghi hơn. Với các thanh ghi dữ liệu các byte thấp và byte cao có thể được truy nhập một cách riêng biệt, sử dụng từng 8 bit một cách riêng rẽ. Byte cao của thanh ghi AX được gọi là AH và các byte thấp được gọi là AL. Tương tự cho các thanh ghi BX, CX, DX có BH, BL, CH, CL, DH, DL. Chức năng chuyên biệt của từng thanh ghi dữ liệu : 1. Thanh ghi AX (thanh ghi chứa- Accumulator register) AX là thanh ghi được sử dụng nhiều nhất trong các lệnh số học, logic, và chuyển dữ liệu bởi vì việc sử dụng chúng tạo ra mã máy ngắn nhất. Trong các phép toán nhân chia một trong các số hạng tham gia phải được chứa trong thanh ghi AX (nếu là 16 bit) và AL (nếu là 8 bit). Các thao tác vào ra cũng sử dụng thanh ghi AX hoặc AL. 2. Thanh ghi BX (thanh ghi cơ sở- Base register) Thanh ghi này ngoài việc thao tác dữ liệu nó thường chứa địa chỉ cơ sở của một bảng dùng cho lệnh XLAT.(dịch AL thành 1 giá trị trong bảng BX) 3. Thanh ghi CX (thanh ghi đếm- Count register) Việc xây dựng một chương trình lặp được thực hiện dễ dàng bằng cách sử dụng thanh ghi CX, trong đó CX đóng vai trò bộ đếm số vòng lặp (REP, LOOP). CL được dùng làm bộ đếm trong các lệnh dịch và quay bit. 4. Thanh ghi DX (thanh ghi dữ liệu - Data register) DX và AX cùng được sử dụng trong các thao tác của phép nhân hoặc chia các số 16 bit. DX còn được sử dụng để chứa địa chỉ của các cổng trong các lệnh vào ra dữ liệu trực tiếp (In/Out). Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 5
  9. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn 1.3.2. Các thanh ghi đoạn: CS, DS, ES, SS Khối BIU đưa ra trên Bus địa chỉ 20 bit địa chỉ, như vậy 8088 có khả năng phân biệt được 220= 1. 048. 576 = 1 Mbyte ô nhớ. Nói cách khác không gian địa chỉ của 8088 là 1 Mbyte. Trong không gian 1 Mbyte bộ nhớ này cần chia thành nhiều đoạn khác nhau : - Đoạn chứa chương trình - Đoạn chứa dữ liệu và kết quả trung gian của chương trình - Tạo ra vùng nhớ đặc biệt gọi là ngăn xếp Trong thực tế bộ vi xử lý 8088 có các thanh ghi 16 bit liên quan đến địa chỉ đầu của các đoạn trên và chúng được gọi là các thanh ghi đoạn (Segment Registers): CS, DS, SS, ES. Các thanh ghi đoạn này chỉ ra địa chỉ đầu của 4 đoạn trong bộ nhớ dung lượng lớn nhất của 4 đoạn này là 64 Kbyte. Các đoạn có thể nằm cách nhau hoặc trùm lên nhau Nội dung của thanh ghi sẽ xác định địa chỉ của ô nhớ đầu tiên của đoạn, địa chỉ này gọi là địa chỉ cơ sở. Địa chỉ của các ô nhớ khác trong cùng đoạn được tính bằng cách cộng thêm vào địa chỉ cơ sở một giá trị gọi là địa chỉ lệch hay độ lệch (offset) Địa chỉ vật lý (20 bit) của một ô nhớ được xác định như sau : Điạ chỉ vật lý = Điạ chỉ đoạn *10h+ thanh ghi lệch (hay offset) và điạ chỉ logic trong máy tính luôn được biểu diễn dưới dạng : Segment:Offset Tại mọi thời điểm thì chỉ những ô nhớ được định địa chỉ bởi 4 đoạn trên mới được truy cập. 1.3.3. Các thanh ghi con trỏ và chỉ số: SI, DI, SP, BP Trong 8088 có 3 thanh ghi con trỏ và 2 thanh ghi chỉ số 16 bit. Các thanh ghi này (trừ IP), đều có thể được dùng như các thanh ghi đa năng, nhưng ứng dụng chính của mỗi thanh ghi là chúng được gầm định như là thanh ghi lệch cho các đoạn tương ứng. Cụ thể như sau : 1. Thanh ghi BP : (con trỏ cơ sở - Base Pointer) BP luôn trỏ vào một dữ liệu nằm trong đoạn ngăn xếp SS. Địa chỉ cụ thể SS:BP được xác định như trên. 2. Thanh ghi SP(con trỏ ngăn xếp - Stack Pointer) Được sử dụng kết hợp với SS để truy nhập vào đoạn ngăn xếp. SP luôn trỏ vào đỉnh hiện thời của ngăn xếp trong đoạn ngăn xếp SS. Địa chỉ cụ thể SS:SP 3. Thanh ghi SI(chỉ số nguồn - Source Index). SI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ cụ thể tương ứng với DS:SI. Bằng cách tăng nội dung của SI chúng ta có thể truy nhập dễ dàng đến các ô nhớ liên tiếp. 4. Thanh ghi DI (chỉ số đích - Destination Index). Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 6
  10. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn SI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ cụ thể tương ứng với DS:DI. Có một số lệnh gọi là các thao tác chuỗi sử dụng DI để truy nhập đến các ô nhớ được định địa chỉ bởi ES. 1.3.4. Thanh ghi con trỏ lệnh: IP Các thanh ghi bộ nhớ chúng ta vừa trình bày dùng để truy cập dữ liệu, để truy nhập đến các lệnh, 8088 sử dụng các thanh ghi CS và IP. Thanh ghi CS chứa điạ chỉ của lệnh tiếp theo còn IP chứa địa chỉ offset của lệnh đó. Thanh ghi IP được cập nhập mỗi khi có một lệnh được thực hiện. 1.3.5. Thanh ghi cờ Đây là thanh ghi 16 bit, mỗi bit được sử dụng để thể hiện một trạng thái của bộ vi xử lý tại một thời điểm nhất định trong quá trình thực hiện chương trình. Mới chỉ có 9 bit được sử dụng và người ta gọi mỗi bit là một cờ. x x x x OF DF IF TF SF ZF x AF x PF x CF * Các cờ trạng thái CF (Carry Flag): được thiết lập khi phép toán thực hiện có nhớ hoặc có vay mượn PF(Parity Flag): được thiết lập khi kết quả của phép toán có tổng số bit có giá trị 1 là một số chẵn (ở phần thấp của kết quả) . AF (Auxiliary Flag): được thiết lập khi có nhớ từ "bit có trọng số lớn nhất ở phần thấp" sang "bit có trọng số thấp nhất ở phần cao". ZF (Zero Flag) : Được thiết lập khi tất cả các bit của kết quả có giá trị 0. SF ( Sign Flag): được thiết lập khi bit MSB của kết quả có giá trị 1. OF (Overflow Flag): được thiết lập khi kết quả nằm ngoài giới hạn cho phép. *Các cờ điều khiển TF (Trace Flag): Nếu bit này có giá trị 1 thì bộ vi xử lý cho phép thực hiện từng bước chương trình IF (Interrupt Flag) : Nếu bit này có giá trị 1 thì bộ vi xử lý cho phép các ngắt cứng có thể thực hiện. DF (Direction Flag): Nếu bit này có giá trị 1 thì bộ vi xử lý cho phép duyệt chuỗi từ phải sang trái hoặc từ địa chỉ cao đến địa chỉ thấp. 1.4. Tập lệnh của bộ vi xử lý 1.4.1. Sơ lược về tập lệnh của bộ vi xử lý Tập lệnh của bộ vi xử lý là thành phần cơ bản nhất để máy tính có thể thực hiện các yêu cầu của người sử dụng. Tất cả các thao tác, các chương trình do người dùng lập ra đều được bộ vi xử lý thực hiện bằng việc ánh xạ chúng dưới dạng mã máy, mã lệnh riêng của bộ vi xử lý. Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 7
  11. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn Thông thường, với các lập trình viên, các lệnh của bộ vi xử lý được hiểu dưới góc độ là các lệnh gợi nhớ (Mnemonic). Với mã lệnh gợi nhớ thì một lệnh của bộ vi xử lý bao gồm các thành phần sau: [Mã lệnh] [Các toán hạng] Trong đó: Mã lệnh - Cơ bản trường này chứa mã lệnh dưới dạng mã gợi nhớ. Các toán hạng - Là các thành phần mà các lệnh sử dụng để thực hiện lệnh. Nếu là các lệnh thật thì đây chính là các toán hạng của lệnh. Với bộ vi xử lý 8086/8088, các toán hạng này có thể là 0,1 hoặc 2. Ví dụ: ADD AL,[BX] ADD là lệnh thực hiện phép cộng; AL và [BX] là hai toán hạng với qui định nếu tên thanh ghi hoặc một giá trị hằng nằm trong dấu [] thì đó là địa chỉ OFFSET của ô nhớ chứa dữ liệu cần thao tác. 1.4.2. Tập lệnh của CPU Trong tập lệnh của vi xử lý 8086 có rất nhiều lệnh, mỗi lệnh thực hiện một nhiệm vụ cụ thể nào đó. Song, trong giới hạn nhất định, chúng ta có thể nghiên cứu một vài lệnh cơ bản. Để dễ hiểu, chúng ta có thể chia chúng các nhóm lệnh sau: 1. Nhóm lệnh di chuyển dữ liệu 2. Nhóm lệnh số học 3. Nhóm lệnh logic 4. Nhóm lệnh dịch chuyển và quay 5. Nhóm lệnh rẽ nhánh 6. Nhóm lệnh vào ra cổng 7. Nhóm lệnh điều khiển. 1.4.3. Nhóm lệnh di chuyển dữ liệu Trong nhóm này ta quan tâm một số lệnh cơ bản sau: MOV, MOVSB, MOVSW XCHG, PUSH, POP a) Lệnh MOV : Move a Word or Byte (chuyển 1 từ hay 1 byte) MOV đích, nguồn Di chuyển nội dung của toán hạng nguồn vào toán hạng đích. Hai toán hạng phải có cùng độ lớn và không được đồng thời là 2 thanh ghi đoạn hoặc hai ô nhớ. Toán hạng đích phải là thanh ghi hay ô nhớ. Giá trị của toán hạng nguồn không bị thay đổi, sau khi thực hiện lệnh. Ví dụ : Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 8
  12. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn MOV ax,word1 Trước lệnh Mov Ax có nội dung : 0002h Word1 : 0008h Sau lệnh Mov Ax có nội dung : 0008h Word1 : 0008h Một số chú ý: - Toán hạng đích không thể là một hằng số - Không thể chuyển trực tiếp một giá trị byte vào một toán hạng đích là một từ và ngược lại. Nếu cần, có thể sử dụng các toán tử PTR BYTE hoặc PTR WORD - Không thể chuyển trực tiếp một hằng số vào một thanh ghi đoạn. Trong trường hợp cần thiết, có thể chuyển tạm thời qua một thanh ghi khác Ví dụ: Muốn chuyển giá trị 100 vào thanh ghi DS, ta có thể sử dụng hai lệnh sau MOV AX,100 MOV DS,AX MOVSB/MOVSW chuỗi đích, chuỗi nguồn là hai lệnh dùng để chuyển các phần tử của một chuỗi nguồn sang một chuỗi đích. MOVSB : MOVe String Byte MOVSW : MOVe String Word b) XCHG : eXCHanGe 2 operands ( tráo đổi nội dung của hai toán hạng) XCHG đích, nguồn Tráo đổi nội dung của toán hạng đích và toán hạng nguồn cho nhau. Ví dụ: XCHG AX,BX Trước lệnh XCHG AX có nội dung : 153Eh BX : 28FCh Sau lệnh Mov AX có nội dung : 28FCh BX : 153Eh Một số chú ý: - Cả hai toán hạng không thể là hằng số - Không thể tráo đổi hai toán hạng khác kiểu. Nếu cần, có thể sử dụng các toán tử PTR BYTE hoặc PTR WORD. - Không được phép là 2 thanh ghi đoạn - Không được phép là hai ô nhớ. c) PUSH : PUSH Word On the Stack (Đẩy vào ngăn xếp) PUSH toán hạng Đẩy nội dung của toán hạng vào ngăn xếp, nội dung của toán hạng không bị thay Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 9
  13. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn đổi. (copy nội dung) Toán hạng nhất thiết phải là thanh ghi (đối với 8086/8088) Ví dụ: PUSH AX Đẩy nội dung của thanh ghi AX vào ngăn xếp d) POP : POP Word from Top of Stack (lấy ra từ đỉnh ngăn xếp). POP đích Toán hạng nhất thiết phải là thanh ghi (đối với 8086/8088), trừ thanh ghi CS 1.4.4. Nhóm lệnh số học Trong nhóm này ta quam tâm đến các lệnh cơ bản sau : ADD, ADC, INC, SUB, SBB, DEC MUL(IMUL), DIV(IDIV) a) ADD :Addition (cộng hai toán hạng) ADD đích, nguồn Cộng toán hạng đích với toán hạng nguồn. Kết quả được chứa trong toán hạng đích đích=đích+nguồn Điều kiện: hai toán hạng phải cùng độ dài, không được là hai thanh ghi đoạn ADD ax,word1 Ax= ax+word1 b) SUB : Subtraction (trừ) Sub đích,nguồn Trừ nội dung của toán hạng đích cho toán hạng nguồn, kết quả chứa trong toán hạng đích. Ví dụ : MOV BX, F0h SUB BX,50h BX=F0h-50h=A0h c) MUL : Multiplexing - Multiply Unsigned Byte or Word (nhân số không dấu) Nhân toán hạng với nội dung chứa trong thanh ghi AX. Tức là nhân hai toán hạng với nhau nhưng 1 toán hạng phải được chứa trong AX. Hoặc là trong DX và AX MUL gốc Tuỳ vào độ dài của toán hạng gốc mà xác định kết quả : - gốc : 8 bit thì số bị nhân trong AL -> kết quả trong AX - gốc : 16 bit thì số bị nhân trong AX -> kết quả trong DX:AX Ví dụ : MOV AL,10h MOV BL,5h Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 10
  14. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn MUL BL Vì toán hạng nguồn là thanh ghi BL, nên kết quả sẽ được lấy ra trong AX. AX=50h Trong trường hợp muốn nhân số có dấu, ta có thể sử dụng lệnh IMUL có dạng lệnh như lệnh MUL. d) DIV : Unsigned Divide (chia hai số không dấu) DIV nguồn - nguồn là số 8 bit : AX/nguồn số bị chia phải là số không dấu 16 bit trong AX sau khi chia AL chứa thương còn AH chứa số dư. - nguồn là số 16 bit : DX:AX/nguồn số bị chia phải là số không dấu và đặt trong cặp DX:AX sau khi chia; AX chứa thương còn DX chứa số dư. nguồn =0 (chia cho 0) hoặc kết quả lớn hơn FFH, FFFFh thì gọi ngắt INT 0 Trong trường hợp muốn chia số có dấu, ta có thể sử dụng lệnh IDIV có dạng lệnh như lệnh DIV. 1.4.5. Nhóm lệnh logic Trong nhóm này ta quan tâm đến các lệnh sau: AND, OR, XOR, NOT a) AND : và hai toán hạng AND đích,nguồn Đích, nguồn phải có điều kiện : - cùng độ dài - không phải đồng là 2 ô nhớ, 2 thanh ghi đoạn. thường dùng để che đi hay giữ lại một vài bit nào đó của toán hạng đích ví dụ : AND AX,0Fh b) OR : hoặc hai toán hạng OR đích,nguồn Đích, nguồn phải có điều kiện : - cùng độ dài - không phải đồng là 2 ô nhớ, 2 thanh ghi đoạn. thường dùng để lập một vai bit nào đó của toán hạng đích= cách cộng logic toán hạng đó với toán hạng tức thời mà các bit 1 có vị trí tương ứng với bit cần lập. Ví dụ : OR AL,BL OR AL,0Fh c) NOT : lấy phủ định - đảo bit NOT toánhạng Dùng để đảo bit của một toán hạng (lấy bù 1) d) XOR : hoặc loại trừ toán hạng Dùng để xoá về 0 một thanh ghi nào đó Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 11
  15. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn Ví dụ: XOR AX,AX ; Xoá thanh ghi AX về 0 1.4.6. Nhóm lệnh dịch chuyển và quay Các lệnh cần quan tâm : SHL, SHR, ROL, ROR a) SHL : Shift Left - dịch trái SHL đích,1 SHL đích,CL Dịch các bit của toán hạng đích sang trái một vị trí hoặc CL vị trí. Một giá trị 0 được đưa vào bên phải của toán hạng đích, còn bit MSB được đưa vào CF. 0 CF Lệnh SHL Thực hiện phép nhân bằng cách dịch trái. b) SHR : Shift Right ; Dịch phải SHR đích,CL Dịch các bit của toán hạng đích sang phải 1 hoặc CL vị trí. Giá trị 0 được đưa vào bit MSB còn gía trị của bit LSB được chuyển vào cờ CF. 0 15 0 CF Lệnh SHR Dùng lệnh dịch phải thực hiện phép chia. c) ROL :Rotation Left- quay trái ROL đích,CL Dịch các bit sang bên trái. bit MSB được đưa vào LSB và cờ CF. muốn quay nhiều lần thì chứa trong CL MSB MSB CF Lệnh ROL d) ROR :Rotation Right- quay phải Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 12
  16. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn ROR đích,CL Dịch các bit sang bên phải. Bit LSB được đưa vào MSB và cờ CF. muốn quay nhiều lần thì chứa trong CL LSB LSB 15 0 CF Lệnh ROR * Các lệnh quay qua cờ nhớ : RCL, RCR. * Các ví dụ đưa ra và yêu cầu tìm giá trị của đích và CF sau CL lần dịch, quay. 1.4.7. Nhóm lệnh điều khiển rẽ nhánh a) Nhảy có đìêu kiện Jxxx nhãn_đích Nếu điều kiện nhảy được thoả thì sẽ nhảy đến nhãn_đích và thi lệnh này. nhãn có thể trước hoặc sau. Trước không quá 126 byte, sau không quá 127 byte. Bảng các lệnh nhảy Nhảy có dấu Kí hiệu Chức năng Điều kiện nhảy Jg/jnle Nhảy nếu lớn hơn Zf=0, sf=of Nhảy nếu không nhỏ hơn hay bằng Jge/jnl Nhảy nếu lớn hơn hay bằng Sf=0f Nhảy nếu không nhỏ hơn Jl/jnge Nhảy nếu nhỏ hơn Sfof Nhảy nếu không lớn hơn hay bằng Jle/jng Nhảy nêu nhỏ hơn hay bằng Zf=1 hay Nhảy nếu không lớn hơn sf=of Nhảy không dấu Ja/jnbe Nhảy nếu lớn hơn Cf=0 và zf=0 Nhảy nếu không nhỏ hơn hay bằng Jae/jnb Nhảy nếu lớn hơn hay bằng Cf=0 Nhảy nếu không nhỏ hơn Jb/jnae Nhảy nếu nhỏ hơn Cf=1 Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 13
  17. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn Nhảy nếu không lớn hơn hay bằng Nhảy điều kiện đơn Je/jz Nhảy nếu bằng Zf=1 Nhảy nếu bằng 0 Jne/jnz Nhảy nếu không bằng Zf=0 Nhảy nếu không bằng 0 b) Nhảy không điều kiện JMP nhãn_đích Nhãn đích nằm trong cùng đoạn với JMP, vượt xa 126 byte đối với các lệnh nhảy có điều kiện. 1.4.8. Nhóm lệnh vào ra cổng a) IN : nhập vào từ cổng 1 byte hay 1 word IN thanhchứa, cổng Nếu thanh chứa là AL thì dữ liệu 8 bit được đưa vào có giá trị là điạ chỉ cổng Nếu thanh chứa là AX thì dữ liệu 16 được đưa vào từ cổng có giá trị là điạ chỉ cổng +1 Điạ chỉ cổng trong khoảng 00h - FFh b) OUT :xuất ra cổng 1 byte hay 1 word OUT điạchỉcổng, Acc 1.4.9. Nhóm lệnh điều khiển a) CALL chương_trình_con Gọi một chương trình con có tên gọi: chương_trình_con b) INT số_hiệu_ngắt Lệnh gọi ngắt với số_hiệu_ngắt c) HLT Lệnh treo máy dừng chương trình d) NOP : No Operation không thực hiện lệnh nào cả. 1.5. Chế độ địa chỉ của bộ vi xử lý 8086 1.5.1. Tổng quan Các chế độ địa chỉ chính là phương pháp để xác định toán hạng hoặc kiểu toán hạng trong các câu lệnh. Bộ vi xử lý 8086/8088 có tổng số trên 20 chế độ địa chỉ cho các thành phần khác nhau như mã lệnh, dữ liệu, ngăn xếp. Nhưng trên thực tế, việc lập trình, phân tích lệnh, người ta chỉ qua tâm đến việc dữ liệu của lệnh được xử lý ra sao. Vì vậy, chúng ta cũng chỉ nghiên cứu về các chế độ địa chỉ dữ liệu của lệnh. Trong bộ vi xử lý 8086 qui định có 7 chế độ địa chỉ cho toán hạng của lệnh. Cụ thể bao gồm các chế độ sau: - Chế độ địa chỉ thanh ghi Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 14
  18. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn - Chế độ địa chỉ tức thì - Chế độ địa chỉ trực tiếp - Chế độ địa chỉ gián tiếp thanh ghi - Chế độ địa chỉ tương đối cơ sở - Chế độ địa chỉ tương đối chỉ số - Chế độ địa chỉ tương đối chỉ số cơ sở 1.5.2. Các chế độ địa chỉ dữ liệu 1.5.3. Chế độ địa chỉ thanh ghi Trong chế độ này việc trao đổi thông tin diễn ra trực tiếp giữa các thanh ghi. Toán tử chỉ hoàn toàn là các thanh ghi. Loại địa chỉ thanh ghi không cần truy nhập bộ nhớ nên rất nhanh. TËp c¸c Mã lệnh Tên các thanh ghi Toán hạng thanh ghi Ví dụ: MOV AX, BX ;Sao chép nội dung thanh ghi BX sang thanh ghi AX. MOV AL,CL ; Sao chép nội dung thang ghi CL sang thanh ghi AL. ADD AL, CL ; Cộng nội dung thanh ghi Clvới thanh ghi AL. 1.5.4. Chế độ địa chỉ tức thì Trong chế độ này toán hạng đích là một thanh ghi hoặc ô nhớ, còn toán hạng nguồn là một hằng số. Ta có thể dùng chế độ này để nạp dữ liệu vào bất kỳ thanh ghi nào, trừ thanh ghi đoạn và thanh ghi cờ. Mã lệnh Tên các thanh ghi Hằng số Ví dụ: MOV CL, 5Fh; chuyển 5Fh vào thanh ghi CL. MOV AX, 0FF0h; Chuyển 0FF0h vào trong thanh ghi AX MOV DS, AX; Chuyển nội dung thanh ghi AX vào DS. MOV [BX], 10; Chuyển 10 vào ô nhớ tại địa chỉ DS:BXX 1.5.5. Chế độ địa chỉ trực tiếp Trong chế độ này, một toán hạng chứa địa chỉ lệch của ô nhớ dùng chứa dữ liệu, Bộ nhớ Mã lệnh Toán hạng Toán hạng Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 15
  19. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn còn toán hạng kia chỉ có thể là thanh ghi. Ví dụ: MOV Al, [1053] ; Chuyển nội dung ô nhớ địa chỉ DS:1053h vào AL MOV [5307h], CX ; Chuyển nội dung CX vào 2 ô nhớ liên tiếp có địa ; chỉ DS:5307h và DS:5308h ADD [5307h], AL ; Cộng nội dung AL vào ô nhớ có địa chỉ DS:5307h 1.5.6. Chế độ địa chỉ gián tiếp thanh ghi Trong chế độ này, một toán hạng là một thanh ghi được sử dụng để chứa địa chỉ lệch (Offset) của ô nhớ chứa dữ liệu, còn toán hạng kia chỉ có thể là thanh ghi mà không được là ô nhớ. Tập các Bộ nhớ Mã lệnh [Thanh ghi] thanh ghi Ví dụ: MOV AL, [BX] ; Chuyển nội dung ô nhớ có đ/c DS:BX vào AL MOV [SI], CL ; Chuyển nội dung CL vào ô nhớ có đ/c DS:SI MOV [DI], AX ; Chuyển nội dung AX vào 2 ô nhớ liên tiếp có ; địa chỉ DS:DI và DS:DI+1 1.5.7. Chế độ địa chỉ tương đối cơ sở(Base Relative Addressing) Trong chế độ này, các thanh ghi cơ sở BX và BP là các hằng số biểu diễn các giá trị dịch chuyển (Displacement Values), kết hợp với DS và SS để tính địa chỉ hiệu dụng của toán hạng các vùng nhớ. Sự có mặt của các giá trị dịch chuyển xác định tính tương đối (so với cơ sở) của địa chỉ. Mã lệnh Địa chỉ thanh ghi Giá trị cụ thể Tập các Bộ nhớ thanh ghi BX,BP Ví dụ 1: MOV CX, [BX]+10 ; Chuyển nội dung 2 ô nhớ liên tiếp có địa chỉ MOV CX, [BX+10] ; DS:(BX+10) và DS:(BX+11) vào CX MOV CX,10[BX] ; MOV CL, [BP]+5 ; Chuyển nội dung ô nhớ SS:(BP+5) vào AL Chú ý: Trong các ví dụ trên, các giá trị 10 và3 được gọi là các giá trị dịch chuyển - (BX+10) hoặc (BP+5) gọi là địac chỉ hiệu dụng (Effective Address – EA) Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 16
  20. Giáo trình VI XỬ LÝ http://www.ebook.edu.vn - DS:(BX+10) hoặc SS:(BP+5) chính là địa chỉ logic tương ứng với 1 PA 1.5.8. Chế độ địa chỉ tương đối chỉ số(Indexed Relative Addressing) Trong chế độ này, các thanh ghi chỉ số DI và SI và các hằng số biểu diễn giá trị dịch chuyển, được dùng để tính địa chỉ của toán hạng trong vùng nhớ DS. Mã lệnh Địa chỉ thanh ghi Giá trị cụ thể Tập các Bộ nhớ thanh ghi DI, SI Ví dụ: MOV AX,[SI]+10 ; Chuyển nội dung 2 ô nhớ liên tiếp có địa chỉ ; DS:(SI+10) và DS:(SI+11) vào AX MOV AX,[SI+10] ; Tương tự như trên. MOV AL, [DI+5]; chuyển nội dung ô nhớ DS:(DI+5) vào CL. 1.5.9. Chế độ địa chỉ tương đối chỉ số cơ sở(Base Indexed Relative) Là sự kết hợp của 2 chế độ địa chỉ, đó là chế độ địa chỉ tương đối chỉ số và chế độ địa chỉ tương đối cơ sở. Trong chế độ này dùng cả 2 thanh ghi cơ sở và 2 thanh ghi chỉ số để tính địa chỉ của toán hạng. Chế độ này rất phù hợp với việc địa chỉ hoá các mảng 2 chiều. Mã lệnh Thanh ghi Thanh ghi Giá trị cụ thể Tập các Tập các Bộ nhớ thanh ghi thanh ghi BX,BP SI,DI Ví dụ: MOV AX, [BX]+[SI]+8 ;chuyển nội dung 2 ô nhớ liên tiếp có địa chỉ MOV AX, [BX+SI] + 8 ; DS:(BX+SI+8) và DS:(BX+SI+9) vào AX MOV AX, [BX + SI + 8] ; MOV CL, [BP][DI]+5 ; chuyển nội dung ô nhớ có địa chỉ ; DS:(BP+DI+5) vào CL Chú ý: Trong các chế độ địa chỉ trên, các thanh ghi đoạn và các thanh ghi lệch được ngầm định đi kèm với nhau. Muốn loại bỏ sự ngầm định đó thì ta có thể viết tường minh địa chỉ của đoạn. Bộ môn Kỹ thuật máy tính – Khoa CNTT – ĐHSPKT_HY Trang 17
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2