🔙 Quay lại trang tải sách pdf ebook Giáo trình hệ vi điều khiển Ebooks Nhóm Zalo B ộ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC THÁI NGUYÊN Võ Quang Vinh - Dương Quốc Hưng GIÁO TRÌNH HỆ v i n JYÊN -IỆU NHÀ XUẤT BẢN KHOA HỌ VÀ KỸ THUẬT B ộ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC THÁI NGUYÊN VÕ QUANG VINH - DƯƠNG QUỐC HƯNG GIÁO TRÌNH HỆ VI ĐIỀU KHIỂN NHÀ XUÁT BẢN KHOA HỌC VÀ KỸ THUẬT HÀ NỘI - 2010 MỤC LỤC LỜI NÓI ĐÀU 7 CHƯƠNG I: CÁC KHÁI NIỆM c ơ BẢN VÀ CÁU TRÚC CHUNG 9 Phần lý thuyết 9 1.1. GIỚI THIỆU CHƯNG VỀ VI x ử LÝ 9 1.1.1. Tổng quan 9 1.1.2Ỗ Đặc điểm chung của bộ vi xử lý 12 1.2. CÁU TRÚC CHƯNG HỆ VI x ử LÝ VÀ TÓ CHỬC BÊN TRONG CPU 14 1.2.1. Cấu trúc chung của một hệ vi xừ lý 14 1.2.2. Cấu trúc chung của CPU 17 1.3. CÂU TRÚC DỬ LIỆU TRONG HỆ VI x ừ LÝ 21 1.3.1. Các hệ đếm dùng trong hệ vi xử lý 21 1.3.2. Biểu diễn các số và ký tự theo mã hệ hai 22 1.3.3. Các phép toán số học với mã hệ hai 29 Phần bài tập 33 CH 'ƠNGII: HỌ VI x ử LÝ INTEL 8086 35 Phần lý thuyết 35 2.1. CẤU TRÚC CỦA B ộ VI XỬ LÝ 8086 35 2.1.1. Tổng quan 35 2.1.2. Cấu trúc bên trong và hoạt động của bộ vi xừ lý 8086 36 2.1.3. Mô tả chức năng các chân của vi xừ lý 8086 44 2.1.4. Tổ chức bộ nhớ cùa vi xử lý 8086 50 2.2. CÁC CHÉ Đ ộ ĐỊA CHỈ CỦA B ộ VI x ử LÝ 8086 51 2.2.1. Chế độ địa chì thanh ghi 52 2.2.2. Chế độ địa chỉ tức thì 52 2.2.3. Chế độ địa chi trực tiếp 53 2.2.4. Chế độ địa chỉ gián tiếp qua thanh ghi 53 2.2.5. Chế độ địa chỉ tương đối cơ sở 53 2.2.6. Chế độ địa chi tương đối chi sổ 54 2.2.7. Chế độ địa chỉ tương đối chi số cơ sờ 54 3 2.3. TẬP LỆNH CỦA VI x ử LÝ 8086 55 2.3.1. Giới thiệu chung 55 2.3.2. Tập lệnh của vi xử lý 8086 56 2.4. CÁC MẠCH PHỤ TRỢ 88 2.4.1. Mạch tạo xung nhịp 88 2.4.2. Mạch chốt và đệm Bus 90 2.4.3. Các bộ nhớ 93 2.4.4. Mạch giải mã địa chỉ 96 2.5. BIỂU ĐỒ THỜI GIAN ĐỌC/GHI CỦA VI x ử LÝ 98 2.5.1. Xung nhịp và chu kỳ máy 98 2ệ5.2. Chu kỳ đọc/ghi của vi xử lý 8086 99 2.6. CÁC CHÉ Đ ộ LÀM VIỆC CỦA VI x ử LÝ 102 2.6.1. Chế độ khởi động 102 2.6.2. Chế độ đợi 102 2.6.3 Chế độ treo 103 2.6.4. Chế độ ngắt 103 2.6.5. Chế độ dừng 104 2.7. MỘT SỐ VÍ DỤ 104 2.8. LẬP TRÌNH HỢP NGỪ CHO VI x ử LÝ 8086/8088 108 2.8.1. Giới thiệu chung về hợp ngữ 108 2.8.2. Cú pháp của chương trình hợp ngữ 109 2.8.3. Khuôn dạng của chương trình hợp ngừ 113 2.8.4. Cấu trúc lập trình cơ bản bàng họp ngừ 119 Phần bài tập 125 CHƯƠNG III: HỌ VI ĐIÈU KHIÉN 8 BIT 8051 129 Phần lý thuyết 129 3.1. CẤU TRÚC PHÂN CỨNG HỌ VI ĐIỀU KHIẺN 8051 129 3.1.1. Giới thiệu chung 129 3.1.2. Sơ đồ cấu trúc của họ vi điều khiển 8051 132 3.1.3. Mô tả chức năng các chân của 8051 133 3.1.4. Tổ chức bộ nhớ 8051 137 3.1.5. Hoạt độne RESET 145 4 3.2. CÁC CHẾ Đ ộ ĐỊA CHỈ CỦA 8051 146 3.2.l ế Kiểu định địa chỉ dùng thanh ghi (Register Addressing) 146 3.2.2. Kiểu định địa chỉ trực tiếp (Direct Addressing) 147 3.2.3. Kiểu định địa chỉ gián tiếp (Indirect Addressing) 147 3.2.4. Định địa chi tức thời (Immediate Addressing) 147 3.2.5. Định địa chi tương đối 147 3.2.6. Định địa chi tuyệt đối 148 3.2ẵ7. Định địa chi dài (Long Addressing) 148 3.2.8. Định địa chi chỉ số (Index Addressing) 148 3.3. TẬP LỆNH CỦA 8051 149 3.3.1. Nhóm ỉệnh số học 150 3.3.2. Nhóm lệnh logic 153 3.3.3. Nhóm lệnh di chuyển dữ liệu 157 3.3.4. Nhóm lệnh xử lý bit 159 3.3.5. Nhóm lệnh rẽ nhánh 161 3.4. LẬP TRÌNH HỢP NGỮ CHO VI ĐIỀU KHIÊN 8051 166 3.4.1. Trình dịch hợp ngữ 166 3.4.2. Khuôn dạng của chương trình hợp ngữ 167 3.4.3. Kiểu dữ liệu và chỉ dẫn 167 3.4.4. Lập trình vào/ra các cổng 169 3.4.5. Bộ đếm/định thời của 8051 và lập trình 174 3.4.6. Lập trình truyền thông nối tiếp cho 8051 188 3.4ề7. Lập trình ngắt 8051 203 Phần bài tập 221 CHƯƠNG IV: GHÉP NÓI VÀ TRAO ĐÒI DỮ LIỆU TRONG HỆ VI XỬ LÝ 225 Phần lý thuyết 225 4.1. GHÉP NỐI VI XỬ LÝ/VI ĐIỀU KHIỂN VỚI Bộ NHỞ NGOÀI 225 4.1.1. Một số chân của 8051 phục vụ cho ghép nối bộ nhớ ngoài 226 4.1.2. Ghép nối vi điều khiển 8051 với bộ nhớ chương trình ngoài 228 5 4.1.3. Ghép nối vi điều khiển 8051 với bộ nhớ dữ liệu ngoài 229 4.2. GHÉP NỐI SONG SONG 8255A VÀ LẬP TRÌNH 235 4.2.1. Tổng quan 235 4.2.2. Ghép nối 8051 với 8255A 235 4.3ẻ PHỐI GHÉP VI ĐIỀU KHIẾN VỚI THẾ GIỚI THựC 1: Phối ghép 8051 với màn hình tinh thể lỏng LCD, LED7, chuyển đối tượng tương tự - sổ ADC và cảm biến nhiệt 247 4.3.1. Phối ghép vi điều khiển với màn tinh thể lòng LCD 247 4.3.2. Phối ghép vi điều khiển với LED 7 thanh 258 4.3.3. Ghép nối ADC với 8051 và lập trình 270 4.3.4. Nối ghép 8051 với cảm biến nhiệt 279 4.4. PHỐI GHÉP VI ĐIỀU KHIÊN VỚI THẾ GIỚI THựC 2: Phối ghép 8051 với động cơ bước, bàn phím và bộ biến đổi số - tương tự DAC 283 4.4.1. Nối ghép 8051 với động cơ bước 283 4.4.2. Nối ghép 8051 với bàn phím 298 4.4.3. Phối ghép một DAC vói 8051 306 Phần bài tập 309 PHỤ LỤC 1: DANH MỤC CÁC TỪ VIÉT TẮT 318 PHỤ LỤC 2: TẬP LỆNH CỦA VI ĐIÈU KHIỂN HỌ 8051 320 TÀI LIỆU THAM KHẢO 329 6 LỜI NÓI ĐẦU Sự ra đời và phát triển nhanh chóng của kỹ thuật vi điện từ mà đặc trưng là kỹ thuật vi xử lý đã tạo ra một bước ngoặt quan trọng trong sự phát triển của khoa học tỉnh toán, điểu khiển và xử lý thông tin. Kỹ thuật vi xử lý đóng một vai trò rất quan trọng trong tắt cả các lĩnh vực cùa cuộc sống và khoa học - kỹ thuật, đặc biệt là lĩnh vực tin học và tự động hóa. Từ các bộ vi xử lý ban đầu chi là các bộ xử lý trung tâm trong một hệ thống, không thể hoạt động nếu thiếu các bộ phận như RAM, ROM, bo mạch chủ... các hãng đã phát triển các bộ vi xử lý này lên thành các bộ vi điều khiển để phục vụ các mục đích riêng biệt, khác nhau trong công nghiệp. Một bộ vi điều khiển là một hệ vi xử lý được tổ chức trong một chip bao gồm một bộ vi xử lý (microprocessor), bộ nhớ chưomg trình (ROM),bộ nhớ dừ liệu (RAM)... Hiện nay, các bộ vi điều khiển được sử dụng rất rộng rãi và ngày càng được chuẩn hóa để có thể sử dụng nhiều hơn nữa trong các ngành công nghiệp, có mặt trong nhiều máy móc, trong các hàng tiêu dùng. Được sự động viên, khích lệ cùa các thầy giáo, cô giáo trong Khoa Điện Trường Đại học Kỹ thuật Công nghiệp - Đại học Thải Nguyên, chúng tôi đã mạnh dạn viết cuốn giáo trình Hệ K/ề điều khiển. Giáo trình nhằm phục vụ cho sinh viên các chuyên ngành Điện và Điện tử, các bạn độc giả quan tâm đến lĩnh vực Vi xử lý và Vi điều khiển. Giáo trình không đi quá sâu vào diễn giải lý thuyết. Chù yếu đưa ra những kiến thức cơ bản và những vỉ dụ ứng dụng về 2 Chip tiêu biểu đó là: Vi xử lý 8086 và vi điều khiển 8051. Nội dung được chia làm 4 chương: Chương I.Ế Bao gồm các kiến thức tổng quan vé v/ế xử lý như: Cấn trúc chung cùa một bộ vi xử lý, một hệ vi xử lý. Các hệ đếm và 7 biểu diễn thông tin trong các hệ viề xử lý - vi điều khiến, các phép toán thực hiện trên sổ nhị phán. Chương II: Trình bày vê cấu trúc của bộ vi xử ỉý 8086 - thuộc họ vi xử lý 80x86 cùa Intel và cơ bản về lập trình hợp ngữ trên họ vi xử lỷ này, các nội dung chỉnh của chưcmg bao gồm: cấu trúc phần cứng, cách quản lý bộ nhớ, các chế độ địa chi, tập lệnh và các vi mạch phụ trợ như mạch tạo xung 8284, vi mạch chốt, giải mã, các bộ nhớ đế tạo nên một hệ vi xử lý hoàn chỉnh; cách lập trình hợp ngữ dựa trên tập lệnh của bộ V/Ể xử lý để tạo ra chương trình dạng *.EXE hoặc *.COM. Chương III: Trình bày về hệ vi điểu khiến OnChip họ 8051, bao gồm: Cấu trúc tỏ chức phần cứng, bản đồ bộ nhớ, các chế độ địa chi và tập lệnh; lập trình hợp ngữ với những bài toán cơ bản: Nhập xuất dữ liệu với cổng, định thời, truyền thông nổi tiếp, ngắt, ... Chương IV: Trình bày vé ghép nối vi điểu khiến với bộ nhớ, thiết bị nhập xuất. Trong chương này, tác giả cũng giới thiệu vể vi mạch cồng song song lập trình được P P I8255A — một v;ề mạch cổng được sử dụng trong rất nhiều bài toán ghép nổi khác nhau. Phần cuối của chương là các sơ đồ ghép nối tiêu biểu như: Ghép nổi vi điểu khiến với bộ nhớ, LCD, ADC, DAC, Keyboard, step motor, ... Trong quá trình biên soạn chắc chắn không thế tránh khỏi những thiếu sót. Rất mong nhận được sự đóng góp ỷ kiến của đông đào bạn đọc. Mọi sự góp ý xin gửi về: Bộ môn Tự động hoá - Khoa Điện - Trường Đại học Kỹ thuật Công nghiệp Thái Nguyên. Xin chân thành cảm ơn! CÁC TÁC GIẢ 8 CHƯƠNG I CÁC KHÁI NIỆM C ơ BẢN VÀ CẤU TRÚC CHUNG • Phần lý thuyết * Mục đích cùa chương: Đưa ra những khái niệm cơ bản về vi xử lý, hệ vi xử lý, lịch sử phát triển cùa vi xử lý. Giúp sinh viên có những cái nhìn ban đầu về vi xử lý. Nắm được cấu trúc chung cũng như những đặc điểm chung về bộ vi xử lý, hệ vi xử lý. Nhắc lại những kiến thức về hệ đếm và cách biểu diễn thông tin trong hệ vi xử lý, các phép toán với số hệ 2. * Tóm tắt nội dung: Nội dung bao gồm các kiến thức tổng quan về vi xử lý như: cấu trúc chung của một bộ vi xử lý, một hệ vi xử lý. Các hệ đếm và biểu diễn thông tin trong các hệ vi xử lý - vi điều khiển, các phép toán thực hiện ưên số nhị phân. 1.1. GIỚI THIỆU CHUNG VÈ VI Xử LÝ 1.1.1. TÒNG QUAN 1.1.l ểl. Khái niệm Vi xử lý là một vi mạch tích hợp cờ lớn hoặc cực lớn với chức năng chính là xử lý dừ liệu. Đe làm được điều này chúng phải có các mạch điện tử logic cho việc xừ lý và điều khiển dữ liệu. Các mạch 9 logic sẽ di chuyển dữ liệu từ nơi này sang nai khác và thực hiện các phép toán trên dữ liệu. Để vi xù lý điều khiển các mạch logic thì cân phải có chương trình. Chương trình là tập hợp các lệnh để xử lý dữ liệu, các lệnh đã được lưu trữ trong bộ nhớ. Công việc thực hiện lệnh bao gồm các bước như sau: Đón lệnh từ bộ nhớ, sau đó các mạch logic điều khiển sẽ giải mã lệnh và thực hiện lệnh sau khi giải mã. Ngoài chức năng đón và thực hiện lệnh, các mạch logic điều khiển còn điều khiển các mạch điện giao tiếp bên ngoài kết nối vói vi xử lý. Các mạch điện dùng để lưu trữ lệnh để vi xừ lý xử lý được gọi là bộ nhớ (M), các mạch điện giao tiếp để di chuyển dữ liệu từ bén ngoài vào bên trong vi xừ lý và xuất dữ liệu từ bên trong vi xử lý ra ngoài được gọi là các thiết bị ghép nối vào ra I/O. ỉ.l.l.2 ữ Lịch sử phát triển của các bộ vỉ xử lý Vi xử lý là sự kết hợp của hai kỳ thuật công nghệ quan ưọng nhất: Đó là máy tính dùng kỹ thuật số (Digital Computer) và các mạch vi điện tử. Hai công nghệ này kết họp lại với nhau vào năm 1970, sau đó các nhà nghiên cứu đã chế tạo ra vi xừ lý (Microprocessor). Dựa vào lịch sử phát triển của các bộ vi xừ lý ta có thể chia ra làm bốn thế hệ như sau: > Thế hệ thứ nhất (1971-1973) Năm 1971, Intel cho ra đời bộ vi xử lý đầu tiên là 4004 (4 bit số liệu, 12 bit địa chi), sau đó Intel và các nhà sàn xuất khác cũng lần lượt cho ra đời các bộ vi xử lý khác: 4040 (4 bit) và 8008 (8 bit) của Intel. PPS - 4 (4 bit) của Rockwell International, IPM - 16 (bit) của National Semiconductor. Đặc điểm chung của các bộ vi xử lý thế hệ này là: - Thông thường là 4 bit dữ liệu (cũng có thể dài hơn). - Công nghệ chế tạo PMOS với đặc điểm mật độ phần từ nhỏ. tôc độ chậm, giá rẻ và chi có khả năng đưa ra dòng tải nhỏ. - Tốc độ thực hiện lệnh: 1 0 -6 0 Ịis/ lệnh. Với tần số đồng hồ fdk = 0, 1 - 0, 8 MHz. - Tập lệnh đơn giản và phải cần nhiều mạch phụ trợ mới tạo nên một vi xử lý hoàn chinh. > Thế hệ thứ hai (1974 - 1977) Các bộ vi xử lý đại diện cho thế hệ này là vi xừ lý 8 bít 6502 của MOS Technology, 6800 và 6809 của Motorola, 8080 của Intel và đặc biệt là bộ vi xử lý Z80 cùa Zilog. Các bộ vi xừ lý này có tập lệnh phong phú hơn và thường có khả năng phân biệt địa chỉ bộ nhớ với dung lượng đến 64 KB. Có một số bộ vi xừ lý còn có khả năng phân biệt được 256 địa chỉ cho các thiết bị ngoại vi (họ Intel và Zilog). Chúng đã được sử dụng rộng rãi trong công nghiệp và nhất là để tạo ra các máy tính 8 bit nổi tiếng một thời như Apple II Commodore 64. Tất cả các vi xử lý thòi kỳ này đều được chế tạo bàng công nghệ NMOS (mật độ phân tử trên một đơn vị diện tích cao hơn so với công nghệ PMOS) hoặc CMOS (tiết kiệm điện năng tiêu thụ) và cho phép đạt được tốc độ từ 1 - 8|is/ lệnh với tần số đồng hồ 1 - 5 MHz. > Thế hệ thứ ba (1978 - 1982) Đại diện là các bộ vi xử lý 16 bit 8086/80186/0286 của Intel hoặc 68000/68010 của Motorola. Các bộ vi xử lý này có độ dài 16 bit và tập lệnh phong phú với lệnh nhân, chia và các thao tác với chuỗi ký tự. Khả năng phân biệt địa chỉ cho bộ nhớ hoặc cho thiết bị ngoại vi của các vi xử lý thế hệ này cũng lớn hơn (từ 1 - 16 MB cho bộ nhớ và tới 64 KB cho địa chi thiết bị ngoại vi đối với họ Intel). Phần lớn các bộ vi xừ lý thể hệ này đều đạt tốc độ từ 0, 1 - 1 |is/ lệnh với tần sổ đồng hồ fcik = 5 — 10 MHz. > Thế hệ thứ tư (1983 đến nay) Các bộ vi xừ lý đại diện cho thể hệ này là các vi xử lý 32 bit 80386/80486 và 64 bit của Pentium của Intel, các vi xử lý 32 bit 68020/68040/68060 của Motorola. Đặc điểm của vi xử lý thế hệ này là bus địa chỉ đều là 32 bit (phân biệt 4GB bộ nhớ) và có khả nâng làm việc với bộ nhớ ảo. Bảng 1.1 trình bày thông số của các bộ vi xử lý của Intel. Bảng 1.1. Thông số của các bộ vi xử lý Thông số 8086 8088 80286 Năm sản xuất 6/1978 1979 2/1982 fcikmax (xung nhịp đồng hồ) 10 MHz 10 MHz 20 MHz MIPS (triệu lệnh/s) 0,33 0,33 1,2 Số tranzitor 29.000 29.000 134.000 Bus số liệu 16 bit 8 bit 16 bit Bus địa chi 20 bit 20 bit 24 bit Khả năng địa chi 1 MB 1 MB 16 MB Số chân 40 40 68 Chế độ bộ nhớ ảo Không Không Có Có bộ quản lý bộ nhớ bên trong Không Không Có 1.1.2. ĐẶC ĐIẺM CHUNG CỦA Bộ VI x ử LÝ Mồi bộ vi xử lý đều có những đặc điểm và chức năng riêng, tuy nhiên chúng đều có những đặc điểm chung sau: Chiều dài bus dữ liệu (độ lớn của mạch vi xử lý): Được đánh giá bằng số bit lớn nhất mà vi xử lý có thế xử ỉỷ song song đồng thời trong một lần thao tác. Ví dụ: Mạch vi xử lý 16 bit thì có nghĩa vi xử lý có thể xừ lý song song một lần 16 bit. Các vi xử lý có chiều dài bus dữ liệu lớn, tốc độ làm việc nhanh, khả năng truy xuất bộ nhớ lớn được dùng trong các công việc xử lý dữ liệu, điều khiển phức tạp. Các vi xừ lý 32 bit có khả năng làm việc nhanh hơn vì mỗi lần lấy dữ liệu từ bộ nhớ vi xừ lý có thể lấy một lần 4 byte, trong khi đó các vi xử lý 12 8 bit thì phải làm 4 lần, với vi xử lý 16 bit phải thực hiện 2 lần. Để tăng tốc độ làm việc của vi xử lý là mục tiêu hàng đầu của các nhà chê tạo. Chiểu dài bus địa chỉ (khả năng truy xuất bộ nhớ) - Dung lượng bộ nhớ mà vi xử lý có thể truy xuất. Vi xừ lý 4004 có 14 đường địa chi nên có thể truy xuất được 214 = 16.384 ô nhớ, vi xử lý 8 bit có 16 đường địa chi nên có thể truy xuất được 216 = 65.536 ô nhớ, vi xử lý 16 bit có 20 đường địa chi nên có thể truy xuất 220 = 1.048.576 = 1MB ô nhớ, vi xử lý 32 bit như 386 hay 68020 có thể truy xuất 4GB ô nhớ. Vi xử lý có khả năng truy xuất bộ nhớ càng lớn nên có thể xử lý các chương trình lớn. Tùy theo ứng dụng cụ thể mà chọn một vi xử lý thích hợp. Số chân và các hình dạng ngoài của vi xử lý: Các bộ vi xử lý 8088/8086 được đóng trong vỏ hai hàng chân, đó là loại vỏ bàng Plastic có các chân hướng xuống dưới theo hai hàng song song hai bên. Các bộ vi xừ lý lớn hơn có 64 chân hay nhiều hom nữa có vỏ bọc với các chân ra tạo thành mảng sắp xểp trên cả bổn phía. Thông thường các vi xử lý có số chân càng nhiều thì càng hoàn hảo. Tuy vậy, trong thực tế người ta có thể dùng phương pháp dồn chân, nghĩa là một chân tín hiệu có thể làm hai chức năng và để phân biệt hai chức năng ấy người sử dụng phải lập chương trình. Xung nhịp hệ thống (System clock): Dùng để đồng bộ các thao tác bên trong và bên ngoài cùa vi xử lý bằng cách phát ra các xung nhịp thời gian theo các khoảng cách cố định. Tần số xung clock quyết định đến tốc độ làm việc của vi xử lý, vi xử lý có tốc độ làm việc càng lớn thì khả năng xử lý lệnh càng nhanh. Tuy nhiên, tần số xung nhịp không phải là yếu tố duy nhất. Tốc độ vi xừ lý còn phụ thuộc vào cách thức xừ lý thông tin trong cấu trúc của vi xử lý. Tần số xung clock làm việc của các vi xử lý được cho bời các nhà chế tạo. 13 Điện áp hoạt động ịnguồn nuôi)'. Với công nghệ PMOS các bộ vi xử lý cần nguồn nuôi với nhiều điện áp hoạt động khác nhau. Ví dụ: ±5V, ±10V. Còn với công nghệ NMOS thì chi cần nguồn nuôi duy nhất +5V. Đây là mức điện áp đủ cao để bù lại các sụt áp trong các mạch số, đồng thời cũng đủ nhỏ để tránh gây tạp âm. Các bộ vi xử lý ngày nay với công nghệ CMOS đã cho ra đời các loại vi xừ lý 3, 3V, đòi hỏi dòng tiêu thụ chỉ bàng 60% so với chip 5V. Các mạch phụ cận: Là các mạch làm chức năng giải mã chuyên đổi số liệu, mạch ghép nối logic, mạch đếm và định thời gian, mạch điều khiển bàn phím, hiển thị... Loại mạch này cũng được chế tạo theo hãng và thường tương ứng với mạch vi xử lý của hãng ấy. Mạch phối ghép vào ra. Làm nhiệm vụ trao đổi số liệu vào và ra cho CPU. Mỗi hãng sẽ chế tạo mạch phối ghép đi kèm. Loại vi xừ lý nào càng nhiều mạch phối ghép thì càng dễ sử dụng. Phần mềm (chương trình): Mỗi một vi xử lý có một phần mềm được hãng trang bị hay còn gọi là tập lệnh. Người sừ dụng căn cứ vào tập lệnh này để khai thác sử dụng và tạo thành các chương trình phục vụ cho các mục đích cụ thể. 1.2. CÁU TRÚC HỆ VI Xử LÝ VÀ TỔ CHỨC BÊN TRONG CPU 1.2ếl ế CÁU TRÚC CHUNG CỦA MỘT HỆ VI x ử LÝ Trên đây ta đã thấy bộ vi xử lý là một thành phần rất cơ bàn không thể thiếu được để tạo nên một máy vi tính. Trong thực tế, bộ vi xử lý còn phải kết hợp thêm các bộ phận điện tử khác như: bộ nhớ. các bộ phối ghép vào/ra để tạo nên một hệ vi xử lý hoàn chinh. Hình 1.1 giới thiệu sơ đồ khối tổng quát của của một hệ vi xử lý. Trong sơ đồ này ta thấy rõ các khối chức năng chính của một hệ vi xử lý bao gồm: - Khối xử lý trung tâm (Central Processing Unit, CPU). 14 - Bộ nhớ bán dẫn (Memory, M). - Khối phối ghép với các thiết bị ngoại vi (Input/Output, I/O). - Các bus truyền thông tin. Bus dữ liệu Hình / ẻ/. Sơsồ khối tổng quát hệ vi xử lý 1.2Ềl ằl ẵ Khối xử lý trung tâm, CPU Khối xử lý trung tâm đóng vai trò chủ đạo trong hệ thống vi xử lý, đây là một mạch vi điện từ có độ tích hợp rất cao. Khi hoạt động nó đọc mã lệnh dưới dạng các bit 0 và 1 từ bộ nhớ. Sau đó, sẽ giải mã các lệnh này thành dãy các xung điều khiển ứng với các thao tác trong lệnh để điều khiển các khối khác thực hiện từng bước các thao tác đó. Để làm được điều này bên trong CPU có các thanh ghi cùng bộ tính toán số học và logic (ALƯ) để thao tác với dữ liệu. Ngoài ra, ở đây còn có hệ thống mạch điện tử rất phức tạp để giải mã lệnh và tò đó tạo ra các xung điều khiển cho toàn hệ. I.2.I.2. Bộ nhớ bán dẫn (Memory) Bộ nhớ bán dẫn hay còn gọi là bộ nhớ trong là một bộ phận rất quan trọng của hệ vi xử lý. Tại đây (trong ROM) chứa chương trình điều khiển hoạt động của toàn hệ, để khi bật điện lên thì CPU có thể lấy lệnh từ đây mà khởi động hệ thống. Một phần của chương trình điều khiển hệ thông, các chương trình ứng dụng, dữ liệu cùng các kết 15 quả của chương trình được để trong RAM. Các dữ liệu và chương trình muốn lưu trữ lâu dài sẽ được để ở bộ nhớ ngoài. 1.2ẵl ẵ3. Khối phối ghép vào/ra (I/O) Khối phối ghép vào/ra tạo ra khả năng giao tiếp giữa hệ vi xử lý với thế giới bên ngoài. Các thiết bị ngoại vi như bàn phím, chuột, màn hình, máy in, chuyển đổi số tương tự (D/A), chuyển đổi tương tự sô (A/D) đều được liên hệ với vi xừ lý thông qua bộ phận này. Bộ phận phối ghép cụ thể giữa bus hệ thống với thế giới bên ngoài thường được gọi là cổng. Như vậy, ta sẽ có cổng vào để lấy thông tin từ ngoài vào và cổng ra để đưa thông tin từ trong hệ ra ngoài. Tuỳ theo yêu cầu cụ thể mà các mạch cổng này có thể được xây dựng từ các mạch logic đơn giản hoặc từ các vi mạch chuyên dụng lập trình được. 1.2.1.4Ề Hệ thống Bus Trên sơ đồ khối hệ vi xử lý ta thấy ba khối chức năng đẩu liên hệ với nhau thông qua tập các đường dây để truyền tín hiệu gọi chung là bus hệ thống. Bus hệ thống bao gồm ba bus thành phần ứng với các tín hiệu địa chi, dữ liệu và điều khiển. Bus địa chỉ: Thường có từ 16, 20, 24, 32 đường dây song song truyền tải thông tin của các bit địa chỉ. Khi đọc/ghi bộ nhớ CPU sẽ đưa ra trên bus này địa chỉ của ô nhớ liên quanỄ Khả năng phân biệt địa chi (số lượng địa chi cho ô nhớ mà CPU có khả năng phân biệt được) phụ thuộc vào số bit của bus địa chi. Ví dụ một CPU có số đường dây địa chi là N = 16 thì nó có khả năng địa chỉ hoá được 2N = 216 = 65536 = 64KB ô nhớ khác nhau (1K = 210 = 1024). Trên sơ đồ khối ta dễ nhận ra tính một chiều của bus địa chi qua chiều của mũi tên. Chỉ có CPU mới có khả năng đưa ra địa chi trên bus địa chỉ. Bus dữ liệu: Thường có từ 8, 16, 20, 24, 32 đến 64 đường dây tuỳ theo các bộ vi xừ lý cụ thể. số lượng đường dây này quyết định số bit dữ liệu mà CPU có khả năng xử lý một lúc. Chiều mũi tên ưên bus chỉ ra rằng đây là bus 2 chiều. 16 Bus điểu khiển. Thường gồm hàng chục đường dây tín hiệu khác nhau. Mỗi tín hiệu điều khiển có một chiều nhất định, vì khi hoạt động CPU đưa tín hiệu điều khiển tới các khối khác trong hệ. Đồng thời nó cũng nhận tín hiệu điều khiển từ các khối đó để phối hợp hoạt động toàn hệ, nên các tín hiệu này trên hình vẽ được thể hiện bằng mũi tên hai chiều. Hoạt động của hệ vi xử lý trên cũng có thể được nhìn nhận theo một cách khác. Trong khi hoạt động và tại một thời điểm nhất định, về mặt chức năng mỗi khối trong hệ trên tương đương các thanh ghi trong (trong CPU) hoặc các thanh ghi ngoài (nằm trong bộ nhớ ROM, RAM và trong khối ghép nối I/O). Hoạt động của toàn hệ thực chất là sự phổi hợp hoạt động của các thanh ghi trong và ngoài nói trên đê thực hiện sự biến đổi dữ liệu hoặc sự trao đổi dữ liệu theo các yêu câu đã định trước. 1.2.2ắ CẤU TRÚC CHUNG CỦA CPU Với mỗi vi xử lý đều có một sơ đồ cấu trúc bên trong và được cho trong các sổ tay của nhà chế tạo. Sơ đồ cấu trúc ở dạng khối rât tiện lợi và dễ trình bày nguyên lý hoạt động của vi xử lý. Cấu trúc của tất cả các vi xừ lý đều có các khối cơ bản giống nhau như: ALU, các thanh ghi, khối điều khiển là các mạch logic. Đê nắm rõ nguyên lý làm việc của vi xừ lý cần phải khảo sát nguyên lý kết hợp các khối với nhau để xử lý một chương trình. Hình 1.2 trình bày sơ đồ khối của vi xừ lý 8 bit. Nhìn vào sơ đồ khối trên ta có thể chia cấu trúc chung của một CPU ra làm ba phần chính: Khối ALU (Arithmetic Logic Unit), khối điều khiển (ConƯol Logic), các thanh ghi (Register) và Bus dữ liệu. 17 Accum ulator A Sum s REG Extern al input and Memory Address Register Hi I Lo SP output control. lines CONTROL LOGIC Hình 1.2. So đồ khối của vi xử lý 8 bit l ẻ2.2.1Ế KhốiALU ALƯ là khối quan trọng nhất của vi xử lý, khối ALU chứa các mạch điện logic chuyên về xử lý dữ liệu. Khối ALU có hai ngõ vào có tên là “IN” chính là các ngõ vào dữ liệu cho ALU xử lý và một ngõ ra có tên là “OUT” chính là ngõ ra kết quà dừ liệu sau khi ALƯ xử lý xong. 18 Dừ liệu trước khi vào ALƯ được chứa ờ thanh ghi tạm thời (Temporarily Register) có tên là TEMP 1 và TEMP 2. Bus dữ liệu bên trong vi xử lý được kết nối với hai ngõ vào “IN” của ALU thông qua hai thanh ghi tạm thời. Sự kết nối này cho phép ALU có thể lấy bất kỳ dữ liệu nào trên bus dừ liệu bên trong vi xử lý. Ngõ ra OUT của ALU cho phép ALƯ có thể gửi kết quả dữ liệu sau khi xừ lý xong lên bus dữ liệu bên trong vi xử lý. Do đó, thiết bị nào kết nối với bus bên trong đều có thể nhận dữ liệu này. Ví dụ: Khi ALU cộng hai dữ liệu thì một trong hai dữ liệu được chứa trong thanh ghi Accumulator, sau khi phép cộng được thực hiện bởi ALU thì kết quả sẽ gửi trở lại thanh ghi Accumulator và lưu trừ ờ thanh ghi này. ALU xử lý một dữ liệu hay hai dữ liệu tùy thuộc vào lệnh hay yêu cầu điều khiển, ví dụ khi cộng 2 dữ liệu thì ALU sẽ xử lý 2 dữ liệu và dùng 2 ngõ vào “IN” để nhập dữ liệu, khi tăng một dữ liệu nào đó lên 1 đơn vị hay lấy bù một dữ liệu, khi đó ALU chi xử lý 1 dừ liệu và chỉ cần một ngõ vào “IN”. Khối ALƯ có thể thực hiện các phép toán xử lý như sau: Add (cộng) Complement (lấy bù) OR (Phép OR) Subtract (trừ) Shift right (dịch phải) Increment (tăng) AND(phép AND) Shift left (dịch trái) Decrement (giảm) Exclusive OR (phép XOR - hoặc có loại trừ) Như vậy: Chức năng chính của khổi ALƯ là làm thay đổi dữ liệu hay chuyên về xừ lý dừ liệu nhưng không lưu trữ dữ liệu. l Ế2.2.2ệ Các thanh ghi bên trong vi xử lý Các thanh ghi bên trong có chức năng lưu trữ tạm thời các dữ liệu khi xử lý. Trong số các thanh ghi có một vài thanh ghi đặc biệt khi 19 thực hiện các lệnh đặc biệt, các thanh ghi còn lại gọi là các thanh ghi thông dụng. Các thanh ghi thông dụng rất hữu dụng cho người lập trình dùng để lưu trữ dữ liệu phục vụ cho công việc xử lý dữ liệu và điêu khiên, khi viết chương trình ta luôn sử dụng các thanh ghi này. số lượng các thanh ghi thông dụng thay đổi tùy thuộc vào từng vi xử lý. Các thanh ghi cơ bản luôn có trong một vi xừ lý là thanh ghi tích luỳ A (Accumulator register), thanh ghi bộ đếm chương trình PC (Program Counter register), thanh ghi con trỏ ngăn xếp SP (Stack pointer register), thanh ghi trạng thái SF (Status register - Flag register), các thanh ghi thông dụng, thanh ghi lệnh IR (Instruction register), thanh ghi địa chỉ AR (address register). 1.2.2.3. Khối điều khiển logic và khối giải mã lệnh - Chức năng của khối giải mã lệnh (Instruction decoder) là nhận lệnh từ thanh ghi lệnh, sau đó giải mã để gửi tín hiệu điều khiển đến cho khối điều khiển logic. - Chức năng của khối điều khiển logic (control logic) là nhận lệnh hay tín hiệu điều khiển từ bộ giải mã lệnh, sau đó sẽ thực hiện đúng các yêu cầu của lệnh. Khối điều khiển logic được xem là một vi xừ lý nhò nam trong một vi xử lý. 1.2ể2ẽ4. Bus dữ liệu bên trong vi xử lý (Internal data bus) Bus dừ liệu dùng để kết nối các thanh ghi bên trong và ALU với nhau, tất cả các dữ liệu di chuyển trong vi xử lý đều thông qua bus dữ liệu nàyỗ Các thanh ghi bên trong có thể nhận dừ liệu từ bus hay có thể đặt dữ liệu lên bus nên bus dữ liệu này là bus dữ liệu hai chiều. Bus dừ liệu bên trong có thể kết nối ra bus bên ngoài khi vi xừ lý cần truy xuất dừ liệu từ bộ nhớ bên ngoài hay các thiết bị I/O. 20 1.3. CÁU TRÚC DỬ LIỆU TRONG HỆ VI xử LÝ Một vấn đề quan trọng trong hệ vi xử lý là việc lưu trừ và xử lý các dữ liệu số. Thông thường chúng ta đã quen thuộc với các số trong hệ đếm cơ số 10, nhưng trong thực tế còn có nhiều hệ đếm với các cơ số khác nhau. Trong phần này chúng ta sẽ làm quen với cách biểu diễn số nhị phân, số Hex, các khái niệm bit, byte, word, sau đó là các phép toán cơ bản với mã hệ hai. 1.3ẽl. CÁC HỆ ĐẾM DÙNG TRONG HỆ VI x ử LÝ 1.3ềỉ ẽl ẵ Hệ cơ số mười (Decimal - thập phân) Trong cuộc sống hàng ngày ta dùng hệ cơ số mười, nói gọn là hệ mười (Decimal number system, viết tắt là hệ D) để biểu diễn các giá trị sổ. Chúng ta dùng tổ hợp các chữ số từ 0 đến 9 để biểu diễn các giá trị số. Đi kèm theo tập hợp đó có thể dùng thêm hậu tố D ở cuối để chỉ ra rằng đó là hệ mười. I.3.I.2. Hệ cơ số hai (Binary - nhị phân) Trong thế giới máy tính lại khác, để biểu diễn một giá trị số chúng ta dùng hệ cơ sổ hai hoặc nói gọn là hệ hai (Binary number system, viết tắt là hệ B). Sừ dụng hai chữ số là 0 và 1 để biểu diễn (ứng vói hai trạng thái có điện và không có điện của các mạch điện tử cấu tạo nên máy). Đặc điểm của hệ đếm cơ số hai là Ưong cùng một số có hai chữ số giống nhau thì chữ số bên trái có giá trị gấp hai lần chữ số bên phải. Từ hệ đếm cơ số hai ta có các khái niệm sau: - Bit: Mỗi chữ số trong hệ hai là một bit. Chữ số đầu tiên bên trái trong dãy các số hệ hai gọi là bit có nghĩa lớn nhất hay bit có trọng số lớn nhất (Most Significant Bit - MSB), còn bit cuối cùng bên phải ừong dãy gọi là bit có nghĩa bé nhất hay bit có trọng số nhỏ nhất (Least Significant Bit - LSB). 21 - Byte: 1 Byte = 8 Bit. - Word: 1 Word = 2 Byte = 16 Bit. - Double Word (từ kép): 1 Double Work = 32 Bit. Vi dụ: 15D = 111 IB 1.3.1ế3. Hệ cơ số 16 (Hexa decimal — thập lục phân) Nếu ta dùng hệ hai để biểu diễn các số có giá trị lớn ta sẽ gặp điều bất tiện là số hệ hai thu được quá dài. Ví dụ, để biểu diễn số 255 ta cần đến 8bit viết như sau: 255 = 11111111B Trong thực tế, để viết kết quả biểu diễn của các số cho gọn người ta tìm cách nhóm bốn số hệ hai thành một số hệ 16 và sử dụng 16 chữ số cơ bản: 0 -ỉ- 9, A, B, c , D, E, F để biểu diễn. Đặc điểm của hệ cơ số 16 là một chữ số ở cơ số 16 có hai chữ số giống nhau thì chữ số bên trái có giá trị gấp 16 lần chữ số bên phài. Vi dụ: (110010 1 0 )2 = 27+ 26 + 23 + 2 = 128 + 64 + 8 + 2 = 202 (11001010)2 = (CA),6= 12.16+ 10 = 202 Như vậy: Hệ cơ số 16 thực tế cũng là hệ hai nhưng được viết gọn hơn và điều quan trọng nhất là giúp cho người sử dụng ít bị nhầm. l Ể3.1.4ễ Hệ raưòi mã hoá bằng hệ hai (Hệ BCD) Thích hợp cho thiết bị đo có thêm phần hiển thị số ở đầu ra dùng các loại đèn hiện số khác nhau. Ờ đây ta dùng bốn số hệ hai để mã hoá một số hệ mười có giá trị nam trong khoảng từ 0, 1, .. ỗ, 9. Vỉ dụ: Số 520 nếu biểu diễn theo kiểu số BCD thi được (0101 0010 0000)b c d 13.2. BIÊU DIẺN CÁC SÓ VÀ KÝ Tự THEO MÃ HỆ HAI l Ề3.2ệl ệ Biểu diễn số nguyên Biểu diễn số nguyên không dấu 22 Nếu ta chi dùng số nguyên dương thì cách biểu diễn là đom giản. Một số 8 bit có thể được sừ dụng để biểu diễn các số từ 0 đến 255. Thật vậy: 00000000 =0 10000000 =128 11111111 =255 Thông thường, nếu một chuỗi n bit của các số nhị phân an-ian-2 ... aiao sẽ được tính như một số nguyên A không dấu, mà giá trị của nó là: n -1 A V ; a i=0 Biểu diễn dấu - độ lớn (hay độ lớn có dấu) Việc sử dụng các số nguyên không dấu là không đủ vì ta cần biểu diễn cả sổ âm cũng như các số nguyên dương. Vì vậy, để biểu diễn các số có dấu, bit MSB trong từ được dùng làm bit dấu. Nếu bit MSB là 0 thì số biểu diễn là số dương và nếu bàng 1 thi là số âm. Trong một từ n bit thì n - 1 bit cuối cùng giữ giá trị số nguyên. Vi dụ: (+20 =00010100 hoặc -20 = 10010100) Công thức tổng quát có thể được biểu diễn như sau: n-2 A = Y /2la Nếuan-1=0 i=0 1 n - 2 A = - ^ 2' a Nếu an-1 = 1 /=0 ' Biểu diễn số bù hai Giống như cách biểu diễn dấu - độ lớn, cách biểu diễn số bù hai cũng sử dụng bit cao nhất (MSB) như là một bit dấu. Nhưng nó khác với cách biểu diễn dâu - độ lớn các bit còn lại sẽ có ý nghĩa khác đi. Công thức tổng quát để biểu diễn một số bù hai như sau: 23 A = - 1 n~'a ,+ V 2 V /1-1 ' i i=0 Trong trường hợp các số nguyên dương thì an-1 = 0 cho nên biêu thức — 2 ” 1 a = 0 . Do vây, biểu thức trên đươc biểu diễn số bù hai n-1 cho cả số dương và số âm. Bảng 1.2 so sánh cách biểu diễn số bù hai và biểu diễn dâu - độ lớn đối với các số nguyên 4 bit. Bảng ỉ ề2 Biểu diễn số thập phânBiểu diễn dấu - độ lớn Biểu diễn số bù hai +7 0111 0111 +6 0110 0110 +5 0101 0101 +4 0100 0100 +3 0011 0011 +2 0010 0010 +1 0001 0001 +0 0000 0000 -0 1000 - -1 1001 1111 -2 1010 1110 -3 1011 1101 -4 1100 1100 -5 U01 1011 -6 1110 1010 -7 1111 1001 -8 - 1000 24 Quan sát bảng trên ta thấy: - Nếu ta dùng 4 bit để biểu diễn số thì ta thu được 16 tổ hợp có giá trị từ 0 đến 15 tức là chỉ biểu diễn được số dương. - Với cách biểu diễn theo dấu độ lớn ta có thể biểu diễn được cả số dương và âm nằm trong khoảng -7 .. .-0 +0ắ. ẻ+7. - Với cách biểu diễn theo mã bù hai ta cũng biểu diễn được cả sổ dương và âm nằm trong khoảng -8 ...0...+ 7. Biến đổi bit Có trường hợp người ta lấy số nguyên n bit nhưng lại lưu nó vào trong m bit mà m > n. Trong trường hợp biểu diễn dấu độ lớn có thể thực hiện một cách dễ dàng bằng cách di chuyển bit dấu đến vị trí mới ở bên trái và điền thêm 0 vào đó. Ví dụ: +18 = 00010010 (dấu - độ lớn, 8-bit) +18 = 00000000 00010010 (dấu - độ lớn, 16-bit) -18= 10010010 (dấu - độ lớn, 8-bit) -18 = 10000000 00010010 (dấu - độ lớn, 16-bit) Điều này không còn đúng nữa với số nguyên âm bù hai Ví dụ: +18 = 00010010 (số bù hai, 8-bit) + 18 = 00000000 00010010 (số bù hai, 16-bit) -1 8 = 11101110 (số bù hai, 8-bit) -32658 = 10000000 01101110 (số bù hai, 16-bit) Quy tắc để biển đổi bit số bù hai là di chuyển bit dấu đến vị trí mới phía bên trái và điền thêm các bit có giá trị bang bit dấu (cả vào vị trí cũ của bit dấu). Đối với các số dương thì điền thêm 0 với các số âm thì điền thêm 1. Như vậy, cách biểu diễn 18 theo mã bù hai như sau: 25 +18 = 0 0 0 1 0 0 1 0 +18 = 00000000 00010010 - 1 8 = 11101110 -18 = 11111111 11101110 I.3.2.2. Biểu diễn số thực (số bù hai. 8-bit) (số bù hai. 16-bit) (số bù hai, 8-bit) (số bù hai, 16-bit) Số thực A trong hệ nhị phân được biểu diễn như sau: A = DiD2D3...Dn, did2(Ỉ3...dn = D, d Trong đó: D — DiD2D3...Dn d = did2d3...dn Là phần nguyên Là phần thập phân Việc biểu diễn A dưới dạng nhị phân được thực hiện làm hai bước. Đầu tiên đổi phần nguyên ra dạng nhị phân theo kiểu thông thường, sau đó đổi tiếp phần thập phân. Giả sử phần thập phân 0.did2(Ì3ệ..dn có dạng biểu diễn nhị phân là bib2b3.ỗ.bm. Khi đó giá trị cùa nó trong hệ cơ số 10 được tính như sau: d = did2<Ì3...dn = (bib2b3...bm)2 = (b,2‘l + b22'2 + b32'3 + ..ẵ+ brn2‘m)io 1.3.2ề3. Biểu diễn ký tự theo mã ASCII Trong thực tế xử lý của máy tính ngoài các ký tự chữ cái còn có các ký tự đặc biệt và các ký tự số. Ký hiệu phổ biến nhất ngày nay là dùng mã ASCII (American Standard Code for Information Interchange) mã chuẩn của Mỹ dùng trong trao đổi thông tin. Việc dùng các ký tự để mã hoá thông tin theo bàng mã chuẩn sẽ cho chúng ta khả năng trao đổi thông tin với hầu hết các hệ vi xử lý khác, kể cả đối với các hệ vi xử lý tiên tiến (hình 1.3). Khi tra các bảng này ta đọc mã của ký tự theo thứ tự cột - hàne. 26 Ví dụ: Mã ASCII của một số ký tự thường dùng trong khi lập trình. (Bell, chuông): 07H (Back space, xoá lùi): 08H (Line Feed, thêm dòng mới): OAH 27 Khi xem xét bảng mã ta có thể rút ra những nhận xét sơ bộ sau: - Hai cột đâu tiên của bảng mã đuợc dùng cho các ký tự điêu khiên. - Cột 2 dành riêng cho các ký tự ngăn cách. - Các ký tự số nằm ở cột 3. - Các chữ cái hoa nằm ở cột 4, 5. Các chữ cái thường ờ cột 6, 7. Khoảng cách giữa chữ thường và chữ hoa cùng tên là 20H. Quan hệ giữa mã ASCII với số BCD Trong khi làm toán với các số BCD ta thường kết hợp hai số BCD thành một Byte, dạng số BCD viết theo kiểu này được gọi là dạng BCD chuẩn hay còn gọi là dạng BCD gói. Khi lưu trừ, khi hiển thị hoặc khi truyền giữa các thiết bị các giá trị số 0.. .9 thực chất ta làm việc với mã ASCII của các số đó tức là các số 30H...39H. Như vậy, la thấy trong 1 byte mã ASCII biểu diễn các số 0...9 có 4 bit thấp ứng với mã BCD của chính các số đó, 4 bit cao bao giờ cũng ứng với mã BCD của số 3. Nếu trong byte mã ASCII này ta thay 4 bit cao bằng 0H thì ta thu được số BCD không gói. Nói cách khác, số BCD không gói là số dài 1 byte, trong đó có 4 bit cao bàng 0; 4 bit thấp là số BCD chuẩn mã hoá số cần biểu diễn. Vi dụ: Mã ASCII của 5 là 0011 0101 = 35H Mã ASCII của 9 là 0011 1001 = 39H Mã BCD không gói của 5 là 0000 0101 = 05H Mã BCD không gói của 9 là 0000 1001 = 09H Mã BCD gói chuẩn của 59 là 0101 1001 = 59H 28 1.3.3. CÁC PHÉP TOÁN SỐ HỌC VỚI MÃ HỆ HAI l ế3.3.1. Phép cộng Phép cộng các số hệ hai được thực hiện giống như khi làm với các số hệ 10. Quy tắc phép cộng với số hệ hai được cho trong bảng 1.3. Bảng 1.3 A B Y c 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 Y: kết quả C: nhớ (Carry) Vỉ dụ: 99 + 95 = 194 Cộng hệ mười Cộng hệ hai Nhớ 1111 1110 99 Số hạng 1 01100011 95 Số hạng 2 0101 1111 194 Tổng 1100 0010 Các bộ cộng trong các khối tính toán số học của máy tính sẽ thực hiện các phép cộng theo cách đã nói ở trên. l ẻ3.3.2. Phép trừ Phép trừ các số hệ hai được thực hiện giống như khi làm với các số hệ 10. Quy tắc phép trừ với số hệ hai được cho trong bảng 1.4: Bảng l ệ4 a b Y B 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 29 Ví dụ: 1 9 4 -9 5 = 99 Trừ hệ mười Mượn Trừ hệ hai 1111 1110 194 Số bị trừ 1100 0010 95 Số trừ 0101 1111 99 Hiệu 0110 0011 Trong khi làm phép trừ ta nhận thấy có thể thực hiện phép trừ bằng phép cộng. Cộng số bị trừ với số đối của sổ bị trừ (số bù hai). Ví dụ: 15-13=2 Ta đã biết -13 biểu diễn theo số bù hai như sau: 1111 0011 15 = (0000 1111)2 -13 = (1111 001 l)bù2 Tổng = (0000 0010)2 = 2 1.3Ệ3.3. Phép nhân Phép nhân các số hệ hai được thực hiện giống như khi làm với các số hệ 10. Quy tấc phép nhân với số hệ hai được cho trong bảng 1.5: Bảng l ẵ5 a b Y 0 0 0 0 1 0 1 0 0 1 1 1 Trên cơ sở quy tấc vừa nêu và để cho đơn giàn ta thực hiện một phép nhân 2 số hệ hai 4 bit để làm sáng tỏ thuật toán nhân: 30 1001 Số bị nhân (9) 0110 Số bị nhân (6) 0000 Thành phần 1 của tổng tích luỹ 1001 Thành phần 2 của tổng tích luỹ 1001 Thành phần 3 của tổng tích luỹ 0000 Thành phần 4 của tổng tích luỹ 0110110 Tổng tích luỹ (54) Tổng tích luỹ = 54 Độ dài cực đại của kết quả trong trường hợp này là 8 bit. Neu ta có các toán hạng 8 (hoặc 16) bit thì độ dài cực đại của phép toán là 16 (hoặc 32) bit. Phân tích kỹ ví dụ trên ta thấy phép nhân có thể thực hiện theo thuật toán cộng và dịch (trên cơ sở các bộ cộng và dịch như sau): - Thành phần đầu tiên của tổng tích luỹ thu được là tích của số LSB trong số nhân với số bị nhân. Nếu LSB = 0 thì thành phần này cũng bàng 0, còn nếu LSB = 1 thì thành phần này chính bàng số bị nhân. - Mỗi thành phần thứ i tiếp theo của tổng tích luỹ sẽ tính được bàng cách tương tự, nhưng phải dịch trái i bit (có thể bỏ qua các thành phần bằng 0) - Tổng của các tổng thành phần là tích cần tìm. Lấy luôn ví dụ trên để minh hoạ. 1001 Số bị nhân (9) 0110 Số bị nhân (6) 1001 Số bị nhân dịch trái 1001 Sô bị nhân dịch trái 0110110 Tổng tích luỹ (54) 31 1.3.3.4. Phép chia Vì vi xừ lý gồm các phần tử để thực hiện phép cộng và dịch, vì vậy ta sẽ đưa ra quy tắc thực hiện phép chia bàng cách áp dụng phương pháp cộng và dịch. Bước 1: Đổi số chia ra số bù hai của nó. Bước 2: Lấy số bị chia cộng với số bù hai của số chia (trừ đi sô chia). Nếu kết quả này có bit dấu bàng 0 (nghĩa là phần này của số bị chia chia được cho số chia) thì bit tương ứng của thương bàng 1. Nếu kết quả này có bit dấu bằng 1 (nghĩa là phần này của số bị chia không chia được cho số chia) thì bit tương ứng của thương bang 0 và buộc phải khôi phục lại giá trị ban đầu của số bị chia bàng cách cộng kết quả với số chia ở mã hệ hai. Bước 3: Dịch trái kết quả thu được ở trên và làm lại bước 2 cho đến khi nhận được kết quả là 0 (chia hết) hoặc nhỏ hơn số chia (chia còn dư). Vỉ dụ: Thực hiện phép chia: 255/22 Số bị chia: 215 =011010111 Số chia: 22 =010110 Số bù hai của số chia =101010 Các bước thực hiện được tiến hành như sau: Số bị chia =011010111 Số chia ờ mã bù 2 để cộng =101010 Tổng 1 = 000100111 bit dấu = 0 => thương = 1 Dịch trái tổng 1 = 00100111 Số chia ờ mã bù 2 để cộng = 101010 Tổng 2 = 11001 111 bit dấu =1 => thương = 0 32 số chia ở mã hệ 2 để cộng =010110 Số bị chia =00100111 Dịch trái số bị chia = 0100111 Số chia ở mã bù 2 để cộng =101010 Tổng 3 = 1111011 bit dấu = 1 => thương = 0 Số chia ở mã hệ hai để cộng =010110 Số bị chia =0100111 Dịch trái số bị chia = 100111 Số chia ở mã bù 2 để cộng =101010 Tổng 4 =010001 bit dấu = 0 => thương = 1 Đến đây không thể thực hiện được nữa vì tổng 4 là 010001 = 17 < 22 Như vậy kết quả phép chia là: 1001 = 9 và dư 010001 = 17 • Phần bài tập Bài 1. Thế nào là một hệ vi xừ lý? Chức năng của từng khối trong hệ vi xử lý? Nếu một hệ vi xử lý không có bộ nhớ trong ROM, RAM thì có hoạt động được không? Tại sao? Nếu một hệ vi xừ lý không có khối ghép nối vào ra I/O thì có thể hoạt động được không? Tại sao? Bài 2. Có mấy phương pháp biểu diễn số nguyên? Ưu, nhược điểm của từng phương pháp? Thực hiện các phép tính sau: 01001101b + 00110010b = ? 10111100b - 0101111 lb =? Cho biết kết quả của phép tính ở hệ cơ số 10 nếu các số nói trên là: a) Sổ nguyên không dấu; 31 b) Số nguyên có dấu biểu diễn theo kiểu dấu - độ lớn; c) Số nguyên có dấu biểu diễn theo kiểu mã bù hai. Bài 3ế Để mã hóa một số -125 trong hệ vi xử lý có thể thực hiện theo những phương pháp nào? Mã của số trên cho từng phương pháp? Thế nào là hiện tượng tràn trên trong phép cộng? Cho ví dụ minh họa. 34 CHƯƠNG II HỌ VI XỬ LÝ INTEL 8086 • Phần lý thuyết * Mục đích của chương: Giúp sinh viên khảo sát và nẳm chắc cấu trúc một vi xử lý cụ thể của hãng Intel: Nắm được cấu trúc phần cứng (cấu trúc bên trong, sơ đồ chức năng các chân), cấu trúc phần mềm (các chế độ địa chỉ). Khảo sát các vi mạch phụ trợ (nắm được vai trò, chức năng các vi mạch phụ trợ, biết cách ghép nối chúng vói vi xử lý 8086). Nắm được cấu trúc của lập trình hợp ngữ 8086, từ đó lập trình những chương trình đơn giản sử dụng bộ vi xừ lý 8086. * Tóm tắt nội dung: Nội dung chương II tập chung trình bày kỹ về cấu trúc của bộ vi xử lý 8086 - thuộc họ vi xừ lý 80x86 của Intel và cơ bản về lập trình hợp ngữ trên họ vi xử lý này, các nội dung chính của chương bao gồm: Cấu trúc phần cứng, cách quản lý bộ nhớ, các chế độ địa chỉ, tập lệnh và các vi mạch phụ trợ như mạch tạo xung 8284, vi mạch chốt, giải mã, các bộ nhớ để tạo nên một hệ vi xử lý hoàn chỉnh; cách lập trình hợp ngữ dựa trên tập lệnh của bộ vi xử lý để tạo ra chương trình dạng *.EXE hoặc *.COM. 2.1. CÁU TRÚC CỦA Bộ VI Xử LÝ 8086 2.1.1. TỎNG QUAN Sau khi đã tìm hiểu qua về cấu trúc của vi xử lý, tiếp theo ta sẽ đi sâu tìm hiểu một bộ vi xử lý cụ thể và rất điển hình: Bộ vi xử lý 80x86 của Intel. Các thông số của 8086 như sau: 35 - Năm sản xuất: 6/1978 - fcikmax (đồng hồ nhịp): 10MHz - MIPS (triệu lệnh/s): 0,33 - Số tranzitor: 29000 - Bus số liệu: 16 bit - Bus địa chỉ: 20 bit - Khả năng địa chi: 1MB - Số chân: 40 - Độ dài bộ nhớ đệm lệnh (hàng đợi): 6 byte - Có thể thao tác với bit, byte, từ, từ khối - Có khả năng thực hiện phép tính với các số 8 và 16 bit có dấu hoặc không có dấu dạng nhị phân hoặc thập phân, bao gồm cả phép chia và nhân. 2.1ệ2. CÁU TRÚC BÊN TRONG VÀ HOẠT ĐỘNG CỦA VI x ử LÝ 8086 Hình 2.1 là sơ đồ khối cấu trúc bên trong của vi xử lý 8086. - EU: Execution Unit, khối thực hiện lệnh. - BIU: Bus Interface Unit, khối phối ghép bus. - ALU: Arithmetic and Logic Unit, khối số học và logic. 36 2.1ề2.1. Các khối chức năng của CPU Chức năng bên trong vi xử lý về mặt logic được chia làm hai khối xử lý. Khối thứ nhất là khối giao diện bus (BIU) và khối thứ hai là khối thực hiện lệnh (EU). 37 BIƯ: Cung cấp các chức năng liên quan đến việc nhận lệnh và xếp hàng đệm lệnh (hàng đợi), lưu trữ các toán hạng và định vị các địa chi. Khối này cũng cung cấp các chức năng điều khiển Bus cơ sở. Hàng đợi là một RAM nội bộ tốc độ cao, độ dài của hàng đợi này với vi xử lý 8086 là óbyte. Kỳ thuật hàng đợi lệnh cho phép BIƯ sử dụng bộ nhớ rất hiệu quả. BIƯ sẽ lấy mã lệnh trong bộ nhớ rồi đưa vào hàng đợi. Như vậy, BIƯ có thể cung cấp các lệnh một cách liên tục mà không độc chiếm BIU. Điều này làm giảm đáng kể thời gian chết ưên Bus. Hàng đợi lệnh làm việc như một bộ đệm lệnh FIFO (First In First Out, vào trước ra trước). Nếu có sự vào/ra liên tục của dòng mã lệnh trong bộ đệm này thì có nghĩa là có sự phối hợp hoạt động hiệu quả giừa hai khối EƯ và BIU theo cơ chế xừ lý xen kẽ liên tục dòng mã lệnh để làm tăng tốc độ xừ lý tổng thể. EU: Nhận các lệnh được lấy ra trước từ hàng đợi lệnh và cung cấp các toán hạng, các địa chỉ cho BIU để khối này đọc lệnh và dữ liệu. Trong khi đó, bản thân EU sẽ giải mã lệnh, thực hiện, rồi lại chuyển các kết quả tới BIƯ để lưu trữ. Các lệnh chứa trong hàng đợi lệnh chính là những lệnh cất Ưong các ô nhớ liên tiếp nhau và kế tiếp lệnh đang được thực hiện. Nếu EƯ thực hiện một lệnh rồi chuyển điều khiển đến một nơi khác thi BIƯ sẽ xoá hàng đợi, lấy lệnh từ địa chỉ mới, chuyển ngay cho EU rồi lại bắt đầu lấy tiếp các lệnh để đưa vào hàng đợi. Cơ cấu nhận lệnh và thực hiện lệnh của vi xử lý 8086/8088 Chi dẫn lệnh: Lệnh 1 (đã có sẵn): Thực hiện và ghi kết quà Lệnh 2: Chỉ thực hiện lệnh Lệnh 3: Đọc toán hạng và thực hiện 38 Vi xử lý Ihếhí thứ 2 Vi xử lý CPU: BUS: EU: Ghi Nhận lính Thục hiện NhỊn lênh Đọc T h ụ hiẹn Thục hiên 1 Thục hiện 2 Thục hiỊn 3 NhỊn lỉnh 2 Nhận lỉnh 3 Ghi lệnh 1 NhỊn lính 4 Đọc NhỊn lệnh 5 8086/8088 BIU: BUS: Bin Bận Bin Bận Bân Bận ALU: Đây chỉ là một tập con của EU, nhưng trong thực tế nó giống như một phần có cấu trúc độc lập, chịu ữách nhiệm thực hiện các thao tác số học và các thao tác logic. Kết quả lại được định vị ừong một thanh ghi hoặc trong bộ nhớ và 6 cờ trạng thái được cập nhật dựa trên kết quả của các thao tác này. 2.1ẳ2.2. Các thanh ghi của CPU Các thanh ghi có thể được chia làm 4 nhóm lần lượt cỏ tên là: - Các thanh ghi đoạn: cs, DS, ss, ES. - Các thanh ghi đa năng: AX, BX, cx, DX. - Các thanh ghi con ừỏ và chỉ số: IP, BP, SP, SI, DI. - Thanh ghi cờ. FR (Flag). Thanh ghi đoạn Khối BIU đưa ra trên Bus địa chi 20 bit địa chi. Như vậy, 8086 có khả năng phân biệt được 220 = 1048576 = IM ô nhớ hay 1MB. Trong không gian 1MB này bộ nhớ cần được chia ra thành các vùng khác nhau dành riêng để: - Chứa mã chương trình. - Chứa dữ liệu và kết quả trung gian của chương trình. 39 - Tạo ra một vùng nhớ đặc biệt gọi là ngăn xếp (stack) dùng vào việc quản lý các thông số của bộ vi xử lý khi gọi chương trình con hoặc trở về từ chương trình con. Trong thực tế vi xử lý 8086/8088 có các thanh ghi 16 bit liên quan đến địa chỉ đầu của các vùng (đoạn) kể trên và chúng được gọi là các thanh ghi đoạn (Segment register). Đó là các thanh ghi: - cs (Code Segment): Thang ghi đoạn mã, chứa địa chi bất đầu của đoạn chương trình (đoạn mã) mang những lệnh thực hiện được và thông thường là một vùng nhớ chứa dữ liệu dạng hàng không thể thay đổi được hoặc là một vùng ROM/EPROM. - DS (Data Segment): Thanh ghi đoạn dữ liệu, chứa địa chi bắt đầu của đoạn dữ liệu, bao gồm các tham số, các biến, các màng số liệu..ề - s s (Stack Segment): Thanh ghi đoạn ngăn xếp, chứa địa chi bắt đầu của đoạn ngăn xếp. Đây là một mảng của RAM, nơi mà dữ liệu tồn tại trong các thanh ghi được lưu trữ trong suốt quá trình ngát hoặc thực hiện chương trình con. - ES (Exữa Segment): Thanh ghi đoạn dữ liệu phụ, chứa địa chỉ bắt đầu của vùng nhớ bổ sung. Dung lượng lớn nhất của mỗi đoạn nhớ này là 64 Kbyte. Việc thay đổi giá trị các thanh ghi đoạn tương ứng có thể dịch chuyển linh hoạt ứong phạm vi không gian 1 Mbyte. Vì vậy, các đoạn này có thể nằm cách nhau khi thông tin cần lưu trữ trong chúng đòi hòi dung lượng đủ 64 Kbyte hoặc cũng có thể nàm trùm lên nhau do có những đoạn không cần dùng hết dung lượng 64 Kbyte. Nội dung của thanh ghi đoạn cho phép ta xác định địa chi ô nhớ nằm ở đầu đoạn. Địa chi này gọi là địa chỉ cơ sở, địa chi của các ô nhớ khác nằm trong đoạn được tính bàng cách cộng thêm vào địa chi cơ sở một giá trị gọi là địa chi lệnh hay độ lệnh (offset). Độ lệnh này được 40 xác định bời một thanh ghi 16 bit khác đóng vai ữò thanh ghi lệnh (offset register). Mọi sự trao đổi thông tin trong hệ thống vi xử lý đều dùng địa chi vật lý, còn địa chỉ được tạo bởi thanh ghi đoạn và thanh ghi lệnh như trên được gọi là địa chỉ logic và được ký hiệu như sau: Địa chỉ logic = Thanh ghi đoạn: Thanh ghi lệnh Địa chỉ logic tồn tại dưới dạng giá trị các thanh ghi cụ thể bên trong CPU và khi cần thiết truy nhập ô nhớ nào đó thì nó phải được đổi ra địa chỉ vật lý để đưa lên bus địa chỉ (phần tử z trên hình vẽ). Việc chuyển đổi này do một bộ tạo địa chỉ thực hiệnệ Địa chỉ vật lý của ô nhớ được tính theo công thức sau: 20 bit địa chỉ vật lý = Thanh ghi đoạn X 16 + Thanh ghi lệnh Ví dụ: Cặp CS:IP sẽ chi ra địa chi của lệnh sắp thực hiện trong đoạn mã. Nếu tại một thời điểm nào đó ta có cs = F000H và IP = FFF0H thì CS:IP ~ F000Hxl6 + FFF0H = F0000H + FFF0H = FFFF0H Ta cũng cần chú ý rằng một giá trị địa chỉ vật lý sẽ có nhiều cách tạo ra từ nhiều giá trị thanh ghi đoạn và thanh ghi lệnh. Vỉ dụ: địa chỉ vật lý của 32412H có thể được tạo ra từ các giá trị. Thanh ghi đoạn Thanh ghi lệnh 3000H 2412H 3200H 0412H 3240H 0012H ẽ . ể Các thanh ghi đa năng Trong khối EƯ có 4 thanh ghi đa năng AX, BX, cx, DX. Điều đặc biệt là khi cần chứa dữ liệu 8 bit thì mỗi thanh ghi này có thể tách ra làm 2 thanh ghi 8 bit cao và thấp làm việc độc lập nhau, đó là các 41 thanh ghi AH và AL, BH và BL, CH và CL, DH và DL. Mỗi thanh ghi có thể được dùng một cách vạn năng để chứa các loại dữ liệu khác nhau, nhưng chúng cũng có những chức năng riêng: - AX (Accumulator, Acc): Thanh chứa, các kết quà của các thao tác thường được chứa ở đây, nếu kết quả là 8 bit thì thanh ghi AL được gọi là Acc. - BX (Base): Thanh ghi cơ sở, thường chứa địa chi cơ sở của một bảng trong bộ nhớ. - c x (Count): Thanh ghi đếm, thường dùng để chứa số lần lặp của lệnh lặp, còn CL thường dùng chứa số lần dịch hoặc quay trong các lệnh dịch hoặc quay. - DX (Data): Thanh ghi dữ liệu. DX và AX tham gia vào thao tác của các phép nhân hoặc chia 16 bit, DX còn dùng để chứa - địa chỉ của các cổng trong các lệnh vào/ra dữ liệu (IN/OUT)ể Các thanh ghi con trỏ và chỉ số 8086 có ba thanh ghi con trỏ và hai 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 ngầm định như là thanh ghi lệnh cho các đoạn tương ứng. - IP (Instruction Pointer): Con trỏ lệnh, IP luôn trỏ vào lệnh tiếp theo sẽ được thực hiện nằm trong đoạn mã c s . Địa chi đầy đủ của lệnh tiếp theo này ứng với CS:IP và được xác định theo cách đã nói ở trên. - BP (Base Pointer): Con trỏ cơ sở, BP luôn trò vào một dữ liệu nằm trong đoạn ngăn xếp ss . Địa chi đầy đủ của một phần từ ưong đoạn ngăn xếp ứng với SS:BP và được xác định theo cách đã nói ờ Ưên. 42 - SP (Stack Pointer): Con trỏ ngăn xếp, luôn trỏ vào đinh hiện thời của ngăn xếp nằm trong đoạn ngăn xếp ss . Địa chi đầy đủ của đinh ngăn xếp ứng với SS:SP và được xác định theo cách đã nói ở trên. - SI (Source Index): Chỉ số nguồn, SI chỉ vào dữ liệu cần lấy trong đoạn dữ liệu DS mà địa chi đầy đủ tương ứng với DS:SI và được xác định theo cách đã nói ở trên. - DI (Destination Index): Chỉ số đích, DI chỉ vào dữ liệu cần cất trong đoạn dừ liệu DS mà địa chỉ đầy đủ tương ứng với DS:DI và được xác định theo cách đã nói ờ trên. Thanh ghi cờ FR (Flag Register) Mỗi bit của thanh ghi cờ để phản ánh một trạng thái nhất định của kết quả phép toán do ALƯ thực hiện hoặc một hoạt động của EU. Dựa vào các cờ này mà người lập trình có thể đưa ra các lệnh thích họp tiếp theo cho vi xử lý (các lệnh nhảy có điều kiện). Thanh ghi cờ có 16 bit nhưng chỉ sừ dụng 9 bit làm bit cờ. X X X X 0 D I T s z X A X p X c x: Không được định nghĩa Các cờ cụ thể: Các cờ trạng thái - c hoặc CF (Carry Flag): Cờ nhớ CF = 1 khi có nhớ hoặc mượn từ MSB. - F hoặc PF (Parity Flag): Cờ chẵn lẻ, phản ánh tính chẵn lẻ của tổng sổ bit 1 có trong kết quả. CF = 1 khi tổng số bit 1 ừong kết quả là chẵnỗ - A hoặc AF (Auxiliary carry Flag): Cờ nhớ phụ, rất có ý nghĩa khi ta làm việc với các số BCD, AF = 1 khi có nhớ 43 hoặc mượn từ một số BCD thấp (4 bit thấp) sang một số BCD cao (4 bit cao). - z hoặc ZF (Zero Flag): Cờ rỗng, ZF = 1 khi kết quả bàng 0. - s hoặc SF (Sign Flag): Cờ dấu, SF = 1 khi kết quả âm. - o hoặc OF (Overflow Flag): Cờ tràn, OF = 1 khi kết quả là số bù hai vượt ra ngoài giá trị biểu diễn của nó. Các cờ điều khiển (có thể lập hoặc xoá bàng các lệnh riêng) - T hoặc TF (Trap Flag): Cờ bẫy, TF = 1 thì CPU làm việc ở chế độ chạy từng lệnh (chế độ này dùng khi cần tìm lỗi chương trình). - I hoặc IF (Interrupt enable Flag): Cờ cho phép ngắt, IF = 1 thì CPU cho phép các yêu cầu ngắt được tác động. - D hoặc DF (Direction Flag): Cờ hưửng, DF = 1 khi CPU làm việc với chuỗi ký tự theo ký tự từ phải sang trái (vì vậy D chính là cờ lùi). 2.1ề3. MÔ TẢ CHỨC NĂNG CÁC CHÂN CỦA VI x ử LÝ 8086 Hình 2.2 là sơ đồ bố trí chân của vi xử lý 8086. Ta ký hiệu I/O tương ứng là tín hiệu đi vào và đi ra khỏi vi xừ lý. - ADO -ỉ- AD15 [I, O]: Các chân dồn kênh cho các tín hiệu của Bus dữ liệu và Bus địa chi. Xung ALE sẽ báo cho mạch ngoài biết khi nào trên các đường đó có tín hiệu dữ liệu (ALE = 0) hoặc địa chỉ (ALE = 1). - A16/S3, A17/S4, A18/S5, A19/S6 [O]: Địa chi/trạng thái Đây là 4 đường địa chi cao nhất. Địa chi A I6 - AI9 sẽ có mặt tại các chân đó khi ALE = 1 còn khi ALE = 0 thì ưên các chân đó có tín hiệu trạng thái S3 - S6. 44 Chế độ m i n ’ c n d | 1' w ' 40 Vcc AD14] 2 39 ^ AD15 A D 1 3 Q 3 38 [ ] A16/S3 AD12| 4 37 A17/S4 A D U ^ 5 36 ] A18/S5 A D io Q 6 35 A19/S6 Chế độ MAX AD9 Q 7 34 □ sso (BHE/S7) AD8 Q 8 33 ] m n /m x AD7 Q 9 32 ] ] RD AD6 Q 10 31 □ h o l d (RQ/CTO) AD5 Q 11 8086 30 ^ HLDA (RQ/GT1) AD4 £ 12 29 ^ WR (LOCK) AD3 Q 13 28 IO/M (S2) AD2 Q 14 27 DT/R (Sl) AD1 £ 15 26 J DEN (SO) A DO r 16 25 ] ALE (QSO) NMI Q 17 24 J lN T A (QS1) in t r Q 18 23 TEST CLK Q 19 22 ^ READY g n d Q 20 21 ^ RESET Hình 2.2. Sơ đồ chân của vi xử lý 8086 A17/S4 A16/S3 Truy nhập đến 0 0 Đoạn dữ liệu phụ (ES) 0 1 Đoạn ngăn xếp (SS) 1 0 Đoạn mã (CS) hoặc không đoạn nào 1 S6 luôn là 01 Đoạn dữ liệu (DS) Bit S6 - 0 liên tục, bit S5 phản ánh giá trị bit IF của thanh ghi cờ, hai bit S3, S4 phối hợp vói nhau để chỉ ra việc truy nhập các thanh ghi 45 đoạn. Tín hiệu này chuyển sang trạng thái ưở kháng cao khi Bus nội bộ ghi nhận tín hiệu treo. - RD [O]: Đọc. Tín hiệu đọc cho biết bộ vi xử lý đang thực hiện đọc bộ nhớ hay đọc I/O phụ thuộc vào trạng thái chân S2. RD = 0 thì Bus dữ liệu sẵn sàng nhận số liệu từ bộ nhớ hoặc thiết bị ngoại vi. - READY [I]: Tín hiệu báo cho CPU biết tình trạng sẵn sàng của thiết bị ngoại vi hay bộ nhớ. Khi READY = 1 thi CPU thực hiện đọc/ghi mà không cần chèn thêm các chu kỳ đợi. Ngược lại, khi thiết bị ngoại vi hay bộ nhớ có tốc độ hoạt động chậm, chúng có thể đưa tín hiệu READY = 0 để báo cho CPU biết mà chờ chúng, lúc này CPU tự động kéo dài thời gian thực hiện lệnh đọc/ghi bàng cách chèn thêm các chu kỳ đợi. - INTR [I]: Tín hiệu yêu cầu ngắt che được. Khi có yêu cầu ngắt mà cờ cho phép ngắt IF = 1 thì CPU kết thúc lệnh đang làm dở, sau đó đi vào chu kỳ chấp nhận ngắt và đưa ra bên ngoài tín hiệu INTA = 0. - TEST [I]: Tín hiệu tại chân này được kiểm tra bởi lệnh WAIT (xem phần tập lệnh). Khi CPU thực hiện lệnh WAIT mà lúc đó tín hiệu TEST = 1 nó sẽ chờ cho đến khi TEST = 0 thì nó mới thực hiện lệnh tiếp theo. - NMI [I]: Tín hiệu yêu cầu ngắt không che được. Tín hiệu này không chịu sự khống chế cùa cờ IF và nó sẽ được CPU nhận biết bàng tác động cùa sườn lên của xung yêu cầu ngẳt. Nhận được yêu cầu này CPU kết thúc lệnh đang làm dở sau đó nó chuyển sang chương trình phục vụ ngẳt kiểu INT 2. 46 - RESET [I]: Tín hiệu khởi động lại 8086. Khi RESET = 1 kéo dài ít nhất trong thời gian 4 chu kỳ đồng hồ thì 8086 buộc phải khởi động lại. - CLK [I]: Tín hiệu đồng hồ (xung nhịp). Xung nhịp có độ rỗng là 77% và cung cấp nhịp làm việc cho CPU. - Vcc [I]: Chân nguồn nuôi, tại đây CPU được cung cấp nguồn +5V±10%, 340mA. - GND [O]: Hai chân nguồn để nối với điểm ov của nguồn nuôi. - MN/MX [I]: Chân điều khiển hoạt động của CPU theo chế độ MIN/MAX. Chế độ M IN: Chân MN/MX được nối thẳng vào +5V mà không qua điện trở. Trong chế độ MIN tất cả các tín hiệu điểu khiển liên quan đến thiết bị ngoại vi truyền thống và bộ nhớ đã có sẵn trong 8086. Vì vậy, việc phối ghép với các thiết bị đó rất dễ dàng và chính vì tận dụng được các phối ghép ngoại vi có sẵn nên có thể giảm giá thành hệ thống. - IO/M [O]: Tín hiệu này phân biệt trong thời điểm đã định phần tử nào trong các thiết bị vào/ra (10) hoặc bộ nhớ (M) được chọn làm việc với CPU. - WR [O]: Xung cho phép ghi. Khi CPU đưa ra WR = 0 thì trên bus dữ liệu các dữ liệu đã ổn định và chúng sẽ được ghi vào bộ nhớ hoặc thiết bị ngoại vi tại thời điểm đột biến WR = 1. - ALE [O]: Xung cho phép chốt địa chi. Khi ALE = 1 có nghĩa là trên bus dồn kênh AD có các địa chi của thiết bị vào/ra hay của ô nhớ. ALE không bao giờ ở trạng thái trở kháng cao, khi CPU bị treo thì ALE = 0. - DT/R [O]: Tín hiệu điều khiển các đệm hai chiều của Bus dữ liệu để chọn chiều chuyển ưên Bus D. - DEN [O]: Tín hiệu báo cho bên ngoài biết là lúc này ưên Bus dồn kênh AỔ*CÓ dừ liệu ổn định. - sso [O]: Tín hiệu trạng thái. Tín hiệu này giống như so ở chế độ MAX và được dùng kết hợp với IO/M, DT/R để giải mã các chu kỳ hoạt động của Bus. Bảng 2.1. IO/M DT/R sso Chu kỳ điều khiển bus 0 0 0 Đọc mã lệnh 0 0 1 Đọc bộ nhớ 0 1 0 Ghi bộ nhớ 0 1 1 Bus rỗi 1 0 0 Chấp nhận yêu cầu ngắt 1 0 1 Đọc thiết bị ngoại vi 1 1 0 Ghi thiết bị ngoại vi 1 1 1 Dừng Bảng các chu kỳ của bus qua các tín hiệu sso, IO/M, DT/R - HOLD [I]: Tín hiệu yêu cầu treo CPU để mạch ngoài thực hiện việc trao đổi dữ liệu với bộ nhớ bàng cách thâm nhập trực tiếp (Direct Memory Access, DMA). Khi HOLD = 1, CPU sẽ tự tách ra khỏi hệ thống bàng cách treo bus (các bus ở trạng thái trờ kháng cao) để bộ điều khiển DMA (DMA Controller, DMAC) có thể lấy được quyền điều khiển hệ thông đê làm các công việc trao đồi dữ liệu. - HLDA [O]: Báo tín hiệu cho bên ngoài biết yêu cầu ưeo CPU để dùng các bus đã được chấp nhận và CPU 8086 đâ ừeo các bus. 48 Chế độ MAX: Chân MN/MX nối đất. Trong chế độ này một số tín hiệu điều khiển cần thiết được tạo ra trên cơ sở các tín hiệu trạng thái nhờ dùng thêm ở bên ngoài một bộ mạch điều khiển bus 8288. Chế độ MAX được sử dụng khi trong hệ thống có mặt bộ đồng xử lý toán học 8087. - S2, Sl, SO [O]: Các chân trạng thái dùng trong chế độ MAX để ghép nối với mạch điều khiển bus 8288 (xem phần điều khiển bus trong chế độ MAX). Các tín hiệu này được 8288 dùng để tạo ra các tín hiệu điều khiển trong các chu kỳ hoạt động của bus. Bảng 2.2. Bảng các tín hiệu điều khiển của 8288 S2 SI so Chu kỳ điều khiển bus rp r ■ •A Tín hiệu 0 0 0 Chấp nhận yêu cầu ngắt INTA 0 0 1 Đọc thiết bị ngoại vi IORC 0 1 0 Ghi thiết bị ngoại vi IOWC, AIOWC 0 1 1 Dừng Không 1 0 0 Đọc mã lệnh MRDC 1 0 1 Đọc bộ nhớ MRDC 1 1 0 Ghi bộ nhớ MWTC, AMWC 1 1 1 Bus rỗi Không - QSO và QS1 [O]: Tín hiệu thông báo các trạng thái khác nhau của đệm lệnh (hàng đợi). - RQ/GTO và RQ/RT1 [I/O]: Các tín hiệu yêu cầu dùng Bus của các bộ vi xử lý khác hoặc thông báo chấp nhận treo của CPU để cho phép các bộ vi xử lý khác dùng Bus. RQ/GTO có mức ưu tiên cao hơn RQ/RT1. 49 Bảng 2ề3. Bảng các trạng thái của đệm lệnh QS1 QS0 Trạng thái đệm lệnh 0 0 Khồng hoạt động 0 1 Đọc byte mã lệnh đầu tiên từ đệm lệnh 1 0 Đệm lệnh rỗng 1 1 Đọc byte tiếp theo từ đệm lệnh - LOCK [O]: Tín hiệu do CPU đưa ra để cấm các bộ vi xử lý khác dùng Bus trong khi nó đang thi hành một lệnh nào đó đặt sau lệnh LOCK (xem phần tập lệnh vi xử lý 8086). 2.1ể4. TỎ CHỨC B ộ NHỚ CỦA VI x ử LÝ 8086 Vi xử lý 8086 có 20 đường địa chỉ và do đó có thể địa chi hoá được 220 ô nhớ dữ liệu 8 bit kéo dài từ địa chỉ OOOOOh đến FFFFFh. Bộ nhớ logic được chia thành đoạn lệnh (CS), đoạn dữ liệu (DS), đoạn ngăn xếp (SS), đoạn thêm (ES) với 64 Kbyte cho mỗi đoạn. Tổ chức bộ nhớ của 8086 được biểu diễn như hình 2.3. Bộ nhớ của 8086 được đánh địa chi theo đơn vị byte (8 bit), trong khi đó có nhiều thao tác sử dụng số 16 bit. Trong bộ nhớ một sổ 16 bit được lun thành hai byte kề nhau. Byte thấp được lưu ờ địa chi thấp hơn. Chẳng hạn, với số 3D7Fh sè được lưu trong bộ nhớ thành 7F3Dh. Đây là một chú ý quan trọng khi làm việc với các số 16 bit ưong bộ nhớ. CPU sẽ thực hiện lệnh đầu tiên ở địa chỉ FFFFOh mà ở đó thường chứa một lệnh nhảy. Các vị trí từ OOOOOh - 003 FFh được dự tính cho các thao tác xử lý ngắt. Trong phần này chứa CPU sẽ thực hiện lệnh đầu tiên ở địa chi FFFFOh mà ở đó thường chứa một lệnh nhảy. 50 64K cs DS ss ES LOFFSET _ L _ cs DS ss ES FFFFFh Đoạn lệnh Đoạn dữ liệu Đoạn ngân xếp Đoạn dữ liệu thêm OOOOOh Hình 2.3. Tỗ chức bộ nhớ của vi xử lý 8086 Các vị trí từ OOOOOh - 003FFh được dự tính cho các thao tác xử lý ngắt. Trong phần này chứa địa chỉ chương trình con xử lý ngắt nên được gọi là bảng vector ngắt. 2.2. CÁC CHẾ Đ ộ ĐỊNH ĐỊA CHỈ CỦA Bộ VI x ử LÝ 8086 Chế độ địa chi (addressing mode) là cách để CPU tìm thấy toán hạng cho các lệnh của nó khi hoạt động. Một bộ vi xử lý có thể có nhiều chế độ địa chi. Các chế độ địa chi này được xác định ngay từ khi chế tạo và không thể thay đổi được. Bộ vi xử lý 8086/8088 có 7 chế độ địa chi sau: - Chế độ địa chi thanh ghi. - Chế độ địa chi tức thì. 51 - Chế độ địa chi trực tiếp. - Chế độ địa chi gián tiếp qua thanh ghiử - Chế độ địa chi tương đối cơ sở. - Chế độ địa chi tương đối chi số. - Chế độ địa chỉ tương đối cơ sở chi số. 2.2.1. CHẾ Đ ộ ĐỊA CHỈ THANH GHI Trong chế độ địa chi này người ta sử dụng các thanh ghi có sẵn trong CPU như là các toán hạng để chứa dữ liệu cần thao tác, vì vậy khi thực hiện có thể đạt tốc độ truy nhập cao hơn so với các lệnh truy nhập đến bộ nhớ. Vỉ dụ : MOV BX, DX ; copy noi dung DX vao BX ADD AX, BX ;cong AX voi BX roi ghi ket qua vao AX 2.2.2. CHẾ Độ ĐỊA CHỈ TỬC THỈ Trong chế độ này toán hạng đích là một thanh ghi hay một ô nhớ, còn toán hạng nguồn là một hàng số. Ta có thể dùng chế độ địa chi này để nạp dữ liệu cần thao tác vào bất kỳ thanh ghi nào trừ (thanh ghi đoạn và thanh ghi cờ) và bất kỳ ô nhớ nào trong đoạn dữ liệu DS. Vỉ dụ: MOV CL, 100;chuyen 100 vao CL. MOV AX, 0BC8h;chuyen 0BC8h vao AX de roi MOV D S , AX;copy noi dung AX vao DS (vi ; khong duoc chuỵen true tiep vao thanh ghi doan) MOV [BX], 20;chuyen 20 vao o nho tai ;dia chi D S :B X . 52 2.23 . CHÉ Độ ĐỊA CHỈ TRựC TIÉP Trong chế độ địa chi này một toán hạng chứa địa chi lệnh của ô nhớ dùng chứa dữ liệu, còn toán hạng kia có thể là thanh ghi mà không được là ô nhớ. Ví dụ: MOV AL, [0243H];chuyen noi dung o nho ;DS:0243 vao AL MOV [4320],CX;chuyen cx vao hai o nho lien ;tiep DS:4320 va DS:4321 2.2.4ế CHẾ Đ ộ ĐỊA CHỈ GIÁN TIẾP QUA THANH GHI Trong chế độ địa chi này một toán hạng là một thanh ghi được sử dụng để chứa địa chỉ lệnh của ô nhớ dữ liệu, còn toán hạng kia là thanh ghi mà không được là ô nhớ. Vi dụ : MOV AL, [BX];copy noi dung o nho co dia ;chi D S :BX MOV [SI], CL;copy noi dung CL vao o nho ;co dia chi DS:SI MO V [DI], AX,Ệcopy noi dung AX vao hai o ;nho lien tiep co dia chi DS:DI va DS:(DI+1) 2.2.5. CHẾ Đ ộ ĐỊA CHỈ TƯƠNG ĐÓI c ơ SỞ Một toán hạng là thanh ghi, một toán hạng là ô nhớ chứa dữ liệu có địa chỉ lệnh được biểu diễn bởi một thanh ghi cơ sờ BX (hoặc BP) cộng với một hàng số biểu diễn giá trị dịch chuyển. Thanh ghi đoạn là DS hoặc ss 53 Ví dụ: MOV cx, [BX+10];copy noi dung hai o nho ,ẻlien tiep co dia chi DS:BX+10 va ;D S :B X + 1 1 vao cx MOV AL, [BP+5];chuyen noi dung o nho co ;dia chi SS:BP+5 vao AL Quan sát trên ta thấy: 10 và 5 là các dịch chuyển của các toán hạng tương ứng. BX+10, BP+5 gọi là địa chỉ hiệu dụng. DS:BX+10, SS:BP+5 chính là địa chi logic ứng với địa chi vật lý. 2.2.6ế CHÉ Đ ộ ĐỊA CHỈ TƯƠNG ĐÓI CHỈ SỐ Một toán hạng là thanh ghi, còn toán hạng kia là ô nhớ chứa dữ liệu có địa chi lệnh được biểu diễn bởi một thanh ghi chi số SI (hoặc DI) cộng với một hằng số biểu diễn giá trị dịch chuyển. Thanh ghi đoạn là DS. Vỉ dụ : MOV cx, [SI + 10] ,ế copy noi dung hai o nho lien ,ểtiep co dia chi DS:SI + 10 va DS:SI + llvao cx MOV AL, [DI+5];chuyen noi dung o nho co ;dia chi DS:DI+5 vao AL 2.2ễ7. CHÉ Độ ĐỊA CHỈ TƯƠNG ĐỐI CHỈ SỐ c ơ SỞ Một toán hạng là thanh ghi, một toán hạng là ô nhớ chứa dữ liệu có địa chi lệnh được biểu diễn bởi một thanh ghi cơ sở BX (hoặc BP) cộng với một thanh ghi chi số SI (hoặc DI) cộng với một hàng số biểu diễn giá trị dịch chuyển. Thanh ghi đoạn là DS hoặc ss. Vỉ dụ: MOV BX, [BX+SI+10] 54 MOV AL, [BP+DI+5] Các chế độ địa chi đã trình bày ở trên có thể tóm tắt lại trong bảng 2.4: Bảng 2.4 Chế độ địa chỉ Toán hạngThanh ghi đoạn ngầm định Thanh ghi Reg Tức thì Data Trực tiếp [offset] DS Gián tiếp qua[BX] DS [SI] DS thanh ghi[DI] DS Tương đổi cơ sở [BX]+Disp DS [BP]+Disp ss [DI]+Disp DS Tương đôi chì sô[SI]+Disp DS [BX]+[DI]+Disp DS Tương đối chi số cơ [BX]+[SI]+Disp DS sờ [BP]+[DI]+Disp ss [BP]+[SI]+Disp ss Chú ý: Reg: Thanh ghi, Data: Dữ liệu tức thì, Disp: Dịch chuyển. 2.3. TẬP LỆNH CỦA VI xừ LÝ 8086 2.3.1. GIỚI THIỆU CHUNG Tập lệnh của họ vi xử lý 80x86 đảm bảo tương thích thế hệ sau với thế hệ trước. Điều đó có nghĩa là các chương trình viết cho 8086 55 vẫn chạy được trên các bộ vi xử lý mới hom mà không phải thay đôi (không đảm bảo thứ tự ngược lại)ử Tập lệnh của một bộ vi xử lý thường có rất nhiều lệnh (hàng trăm lệnh), vì thế mà việc tiếp cận và làm chủ chúng là tương đối khó khăn. Có nhiều cách trình bày tập lệnh của bộ vi xử lý: Trình bày theo nhóm lệnh hoặc theo thứ tự abc. Đê có thể nhanh chóng và dễ dàng sử dụng các lệnh cơ bản và lập trình được ngay, ta sẽ trình bày theo nhóm lệnh: - Nhóm các lệnh vận chuyển (sao chép) dữ liệu. - Nhóm các lệnh tính toán số học. - Nhóm các lệnh tính toán logic. - Nhóm các lệnh dịch, quay toán hạng. - Nhóm các lệnh nhảy (rẽ"nhánh). - Nhóm các lệnh lặp. - Nhóm các lệnh điều khiển, đặc biệt khác. 2.3ệ2ế TẬP LỆNH CỦA VI x ử LÝ 8086 2.3ể2.1ặ Nhóm các lệnh vận chuyển (sao chép) dữ liệu 1. LDS - Load register and DS with words from memory (nạp một từ (từ bộ nhớ) vào thanh ghi cho trong lệnh và một từ tiếp theo vào DS). Dạng lệnh: LDS Đích, Nguồn Trong đó: - Đích là một trong các thanh ghi: AX, BX, cx, DX, SP, BP, SI, DI. - Nguồn là ô nhớ trong đoạn DS được chi ra trong lệnh. Đây là lệnh nạp vào thanh ghi đã chọn và vào DS từ 4 ô nhớ liên tiếp. Một trong những ứng dụng của lệnh này là làm cho SI và DS chi 56 vào địa chỉ đầu của vùng nhớ chứa chuỗi Nguồn trước khi đến lệnh thao tác chuỗi. Các cờ bị thay đổi: Không. Ví dụ: LDS SI, STR_PTR Nạp vào thanh ghi SI nội dung 2 ô nhớ STR PTR và STR PTR+1 và nạp vào DS nội dung 2 ô nhớ STR PTR+3 và STR PTR+4. Các ô nhớ này đều nằm trong đoạn dữ liệu DS và chứa địa chỉ của chuỗi Nguồn. Do vậy, sau đó DS:SI chi vào đầu chuỗi Nguồn cần thao tác. 2. LEA - Load Effective Address (nạp địa chi hiệu dụng vào thanh ghi). Dạng lệnh: LEA Đích, Nguồn Trong đó: - Đích là một trong các thanh ghi: BX, cx, DX, BP, SI, DI. - Nguồn là tên biến trong đoạn DS được chi rõ Ưong lệnh hoặc ô nhớ cụ thể. Đích*-Địa chi lệnh của Nguồn, hoặc Đích<-Địa chi hiệu dụng của Nguồn. Đây là lệnh để tính địa chỉ lệnh của biến hoặc địa chi của ô nhớ chọn làm Nguồn rồi nạp vào thanh ghi đã chọn. Các cờ bị thay đổi: Không. Vi dụ: LEA DX, Label ;nap dia chi lech cua Label vao DX LEA cx, [BX][DI];nap vao cx dia chi hieu dung ;do BX va DI chi ra EA=BX+DI 57 3ệ LES - Load register and ES with words from memory (nạp một từ (từ bộ nhớ) vào thanh ghi cho trong lệnh và một từ tiếp theo vào ES). Dạng lệnh: LES Đích, Nguồn Trong đó: - Đích là một trong các thanh ghi: AX, BX, cx, DX, SP, BP, SI, DI. - Nguồn là ô nhớ trong đoạn ES được chỉ ra trong lệnh. Đây là lệnh nạp vào thanh ghi đã chọn và vào ES từ 4 ô nhớ liên tiếp. Một trong những ứng dụng của lệnh này là làm cho DI và ES chi vào địa chỉ đầu của vùng nhớ chứa chuỗi Nguồn trước khi đến lệnh thao tác chuỗi. Các cờ bị thay đổi: Không. Ví dụ: LDS DI, [BX] Nạp vào thanh ghi DI nội dung 2 ô nhớ BX và BX+1 và nạp vào ES nội dung 2 ô nhớ BX+3 và BX+4. Các ô nhớ này đều nằm trong đoạn dữ liệu ES và chứa địa chỉ của chuỗi Nguồn. Do vậy, sau đó ES:SI chỉ vào đầu chuỗi Nguồn cần thao tác. 4. MOV - Mov a byte or word (chuyển một byte hay từ) Dạng lệnh: MOV Đích, Nguồn Mô tả: Đích4-Nguồn Trong đó, toán hạng Đích và Nguồn có thể tìm được theo các chế độ địa chi khác nhau, nhưng phải có cùng độ dài và không được phép đồng thời là hai ô nhớ hoặc hai thanh ghi đoạn. Các cờ bị thay đổi: Không. 58 Vỉ dụ : MOV AL, AH ; AL<— AH MOV cx, 50 ,ệ CX4-50 M OV DL, [SI] ;DL<— {D S :s I } 5. MOVS/MOVSB/MOVSW - Move String byte or String word (chuyển một phần tử của một chuỗi sang một chuỗi khác). Dạng lệnh: MOVS Chuỗi_ Đích, Chuỗi Nguồn MOVSB MOVSW Mô tả: Phần tử chuỖi_Đích<-phần từ chuỗi Nguồn Lệnh này dùng để chuyển từng byte hay từng từ của chuỗi Nguồn sang chuỗi Đích. Các cờ bị thay đổi: Không. Ví dụ: CLD;xoa co huong lam viec voi chuoi theo chieu —> M OV DI, OFFSETChuoi_dich;lay dia chi lech ;cua chuoi_dich tai ES vao DI MOV SI, OFFSET Chuoi_goc,ẻ lay dia chi lech ;cua chuoi_goc tai DS vao SI MOVSB;chuyen lbyte, SI va DI tang them 1 6. OUT - Output a byte or a work to a port. Dạng lệnh: OUT Port, Acc Mô tả: Acc—>{Port} 59 - Nếu Acc là AL thì dữ liệu 8 bit được đưa ra cổng Port. - Nếu Acc là AX thì dữ liệu 16 bit được đưa ra cổng Port và Port + 1. Có một cách khác để chứa địa chi cổng là thông qua thanh ghi DX. Khi dùng thanh ghi DX để chứa địa chi cổng ta có khả năng địa chỉ hoá cổng mềm dẻo hom. Lúc này địa chi cổng năm trong dải 0000H.ể. FFFFH và viết lệnh theo dạng: OUT DX, Acc Các cờ bị thay đổi: không. Vỉ dụ: OUT 45H, AL ,ếdua du lieu tu AL ra cong 45H MOV DX, 00FFH;nap dia chi cong vao DX OUT DX, AX;dua du lieu tu AX ra 00FFH 7. POP - Pop word from top of Stack (lấy lại 1 từ vào thanh ghi từ đỉnh ngăn xếp) Dạng lệnh: POP Đích Mô tả: Đích<-{SP} SP<-SP+2 Toán hạng Đích có thể là các thanh ghi đa năng, thanh ghi đoạn (nhưng không được là thanh ghi đoạn mã CS) hoặc ô nhớ. Các cờ bị thay đổi: không. Vi dụ: POP DX;lay 2 byte tu dinh ngan xep dua vao DX 8. POPF - Pop word from top of Stack to Flag register (lấy 1 từ vào thanh ghi cờ từ đỉnh ngăn xếp). 60 Dạng lệnh: POPF Mô tả: FR<—{SP} SP<-SP+2 Chuyển các bit xác định của từ ở đinh của Stack (được SP trỏ tới) tới các cờ và bàng cách đó nó thay thế tất cả các cờ hiện thời. Các cờ bị thay đổi: tất cả các cờ. 9. PUSH - Push word on the Stack (cất 1 từ vào ngăn xếp) Dạng lệnh: PUSH Nguồn Mô tả: SP<-SP-2 Nguồn—>{SP} Toán hạng Đích có thể là các thanh ghi đa năng, thanh ghi đoạn (kể cả CS) hoặc ô nhớ. Các cờ bị thay đổi: không. Ví dụ : PUSH BX;BX -> ngan xep tai vi tri do SP chi ra 10. PUSHF - Push Flag register to the Stack (cất thanh ghi cờ vào ngăn xếp) Dạng lệnh: PUSHF Mô tả: SP<-SP-2 FR-»{SP} PUSH giảm SP đi 2 byte và nhờ đó nó chuyền tất cả các cờ tới đinh của Stack. Các cờ bị thay đổi: không. 61 Vỉ dụ: PUSH BX;BX -> ngan xep tai vi tri do SP chi ra 11. XCHG - Exchange (hoán đổi nội dung hai toán hạng) Dạng lệnh: XCHG Đích, Nguồn Mô tả: Đích <-> Nguồn Toán hạng Đích và Nguồn phải có cùng độ dài, không được đồng thời là 2 ô nhớ cũng không được là thanh ghi đoạn. Các cờ bị thay đổi: không. Ví dụ: XCHG AH, AL ,ềtrao doi noi dung AH va AL XCHG AX, BX ;trao doi noi dung AX va BX 2.3.2.2ể Nhóm các lệnh tính toán số học 12. ADC - Add with Carry (cộng có nhớ) Dạng lệnh: ADC Đích, Nguồn Mô tả: Đích <— Đích + Nguồn + CF Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF. Vỉ dụ: ADC CL, BL ; CL<— CL+BL+CF 13. ADD - Add (cộng hai toán hạng) Dạng lệnh: ADD Đích, Nguồn Mô tả: Mô tả: Đích <— Đích + Nguồn Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF. Vi dụ : ADD DX, cx ;DX<— DX+CX 14. DEC — Decrement (giảm byte hay word đi một giá trị) Dạng lệnh: DEC Đích 62 DEC trừ toán hạng Đích đi 1. Các cờ bị thay đổi: AF, OF, PF, SF, ZFể Vỉ dụ: M OV BX, 1200H ,ữchuyen 1200H vao BX DEC BX ;BX=11FFH 15. DIV - Division (chia không dấu) Dạng lệnh: DIV Nguồn Toán hạng Nguồn là số chia. Tuỳ theo độ dài toán hạng Nguồn ta có hai trường hợp bố trí phép chia. - Nếu Nguồn là số 8 bit: AX/Nguồn, thương để vào AL, số dư để vào AH. - Nếu Nguồn là số 16 bit: DXAX/Nguồn, thương để vào AX, số dư để vào DX. Các cờ bị thay đổi: không. Vỉ dụ: MOV AX, 0033H ;chuyen 0033H vao AX MOV BL, 25 DIV BL ,ẳ AL=02H va AH=01H 16. IDIV - Integer Division (chia có dấu) Dạng lệnh: IDIV Nguồn Thực hiện một phép chia có dấu thanh ghi tổng (và phần mở rộng của nó) cho toán hạng Nguồn. - Sau phép chia AL (AX) chứa thương số (số có dấu), AH (DX) chứa số dư (số có dấu). - Dấu của sổ dư trùng với dấu của số bị chia. Các cờ bị thay đổi: không. 63 Ví dụ : IDIVCL 17. IMUL - Integer Multiplication (nhân có dấu) Dạng lệnh: IMULNguồn - Nếu Nguồn là số có dấu 8 bit: ALxNguồn. Sau khi nhân AX<—tích. - Nếu Nguồn là số có dấu 16 bit: AXxNguồn. Sau khi nhân DXAX<-tích. Các cờ bị thay đổi: CF, OF. Ví dụ: IMULCL 18. IN - Input data from a port (đọc dữ liệu từ cổng vào thanh ghi Acc). Dạng lệnh: IN Acc, địa_chỉ_cổng Lệnh IN truyền một byte hoặc một từ từ một cổng vào lần lượt tới thanh ghi AL hoặc AX. Địa chỉ của cổng có thể được xác định là một hằng tức thì kiểu byte cho phép truy nhập các cổng từ 0...255 hoặc thông qua một số đã được đưa ra trước đó trong thanh ghi DX mà cho phép truy nhập các cổng từ 0...65535. Các cờ bị thay đổi: không. Ví dụ: IN AL, 4 5H ;doc mot byte tu mot cong IN AX, DX ;doc mot tu tu mot cong 19ế INC - Increment (tảng toán hạng lên 1) Dạng lệnh: INC Đích Mô tả: Đích <— Đích + 1 64 Các cờ bị thay đổi: AF, OF, PF, SF, ZF. Vỉ dụ: INC AL 20. MUL - Multiply unsigned byte or word (nhân số không dấu) Dạng lệnh: MƯL Nguồn Nếu Nguồn là số 8 bit: AL*Nguồn. số bị nhân phải là số 8 bit đặt trong AL, sau khi nhân tích lưu vào AX. Nếu Nguồn là sổ 16 bit: AX*Nguồn. số bị nhân phải là số 16 bit đặt trong AX, sau khi nhân tích lưu vào DXAX. Các cờ bị thay đổi: CF, OF. Vỉ dụ: MUL cx ; AXxCX -> DXAX MUL BL ; ALxBL -> AX 21. NEG - Negation (lấy bù hai của một toán hạng, đảo dấu của một toán hạng)ằ Dạng lệnh: NEG Đích Mô tả: Đích <- 0 - Đích Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF Vỉ dụ : NEG AL ; AL<—0- (AL) 22Ệ SBB - Substract with Borrow (trừ có mượn). Dạng lệnh: SBB Đích, Nguồn Mô tả: Đích <— Đích - Nguồn - CF Toán hạng Đích vào Nguồn phải chứa cùng một loại dữ liệu và không được đồng thòi là hai ô nhớ, cũng không được là thanh ghi đoạn. 65 Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF. Ví dụ : S B B AL, 7 8H ; AL<— A L - 7 8 H - C F 23. SUB - Substract (trừ hai toán hạng) Dạng lệnh: SUB Đích, Nguồn Mô tả: Đích<-Đích - Nguồn Toán hạng Đích vào Nguồn phải chứa cùng một loại dừ liệu và không được đồng thời là hai ô nhớ, cũng không được là thanh ghi đoạn. Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF. Vỉ dụ: SUB AL, 78H ;AL<-AL-78H 2.3.2.3. Nhóm các lệnh tính toán logic 24. AND (phép và logic) Dạng lệnh: AND Đích, Nguồn Mô tả: Đích <— Đích A Nguồn Các cờ bị thay đổi: CF, OF, PF, SF, ZF. Ví dụi AND DX, cx ,ẻ DX<— DX AND cx theo tung b it 25. NOT - Logical Negation (phủ định logic) Dạng lệnh: NOT Đích NOT đảo các giá trị của các bit của toán hạng Đích. Các cờ bị thay đổi: không. Ví dụ: MOV AL, 02H ; AL= (0000 0010) B NOT AL ;A L = (1111 1101)B 26. OR - Logic OR (phép hoặc logic) Dạng lệnh: OR Đích, Nguồn Mô t ả : Đích = Đích V Nguồn Các cờ bị thay đổi: CF, OF, PF, SF, ZF. Ví dụ: O R AX, B X ;AX<— A X v B X t h e o t u n g b i t 2.3Ề2ặ4Ệ Nhóm các lệnh dịch, quay toán hạng 27. RCL - Rotate though CF to the Left (quay trái thông qua cờ nhớ) Dạng lệnh: RCL Đích, CL Mô tả: CL phải dược chứa sần số lần quay. Trong trường hợp quay 1 lần có the viết RCL Đích. 1 Các cờ bị thay đổi: CF, OF. Vi dụ: MOV CL, 3 ;so lan quay la 3 RCL AL, CL Trước khi thực hiện lệnh: AL = 01011110, CF = 0. Sau khi thực hiện lệnh: AL = 11110001, CF = 0. 28. RCR - Rotate though CF to the Right (quay phải thông qua cờ nhớ) Dạng lệnh: RCR Đích, CL 67 Mô tả: CL phải được chứa sẵn số lần quay. Trong trường hợp quay 1 lần có thể viết RCR Đích, 1 Các cờ bị thay đổi: CF, OF. Vi dụ : MOV CL, 2 ;so lan quay la 2 RCR AL, CL Trước khi thực hiện lệnh: AL = 11000010, CF = 1. Sau khi thực hiện lệnh: AL = 01110000, CF = 1. 29. ROL - Rotate all bit to the Left (quay vòng sang trái). Dạng lệnh: ROL Đích, CLề Mô tả: CL phải chứa sẵn số lần quay mong muốnỗ Trong trường hợp quay 1 lần có thể viết ROL Đích, 1 Các cờ bị thay đổi: cF OF. Vi dụ : MOV CL, 2 ; so la n quay la 2 ROL AL, CL Trước khi thực hiện lệnh: AL = 11001100, CF = 1 Sau khi thực hiện lệnh: AL = 00110011, CF = 1 68 30. ROR - Rotate all bit to the Left (quay vòng sang phải)ỗ Dạng lệnh: ROR Đích, CL Mô tả: CL phải chứa sẵn số lần quay mong muốn. Trong trường hợp quay 1 lần có thể viết ROR Đích, 1 Các cờ bị thay đổi: CF, OF. Vi dụ : MOV CL, 2 ;so lan quay la 2 ROR AL, CL Trước khi thực hiện lệnh: AL = 11001100, CF = 0 Sau khi thực hiện lệnh: AL = 00110011, CF = 0 31ề SAL/SHL - Shift Arithmetically Left (dịch trái số học)/Shift Logically Left (dịch tó i logic). Dạng lệnh: SAL Đích, CL SHL Đích, CL Mô tả: CF MSB LSB CL phải chứa sẵn số lần quay mong muốn. Trong trường hợp quay 1 lần có thể viết SAL Đích, 1 Các cờ bị thay đổi: SF, ZF, CF, OF, PF. Vi dụ: M O V CL, 2 ;so lan quay la 2 SAL AL, CL Trước khi thực hiện lệnh: AL = 11001100, CF = 0 Sau khi thực hiện lệnh: AL = 00110000, CF = 1 32. SAR - Shift Arithmetically Right (dịch phải số học). Dạng lệnh: SAR Đích, CL Mô tả: CL phải chứa sẵn số lần quay mong muốn. Trong trường hợp quay 1 lần thì ta có thể viết s AR Đích, 1. Các cờ bị thay đổi: SF, ZF, CF, OF, PF. Ví dụ : M O V CL, 2 ,ệso lan q u a y la 2 SAR AL, CL Trước khi thực hiện lệnh: AL = 11001100, CF = 1 Sau khi thực hiện lệnh: AL = 11110011, CF = 0 33. SHR - Shift logically Right (dịch phải logic) Dạng lệnh: SHR Đích, CL Mô tả: MSB LSB CF CL phải chứa sẵn số lần quay mong muốn. Trong trường hợp quay 1 lần có thể viết SHR Đích, 1 Các cờ bị thay đổi: SF, ZF, CF, OF, PF. Vi dụ: MOV CL, 2 ; so lan quay la 2 SHR AL, CL Trước khi thực hiện lệnh: AL = 11001100, CF = 1 Sau khi thực hiện lệnh: AL = 00110011, CF = 0 34. TEST - Logic Camparison (lệnh so sánh logic) Dạng lệnh: TEST Đích, Nguồn Mô tả: Đích A Nguồn TEST thực hiện phép so sánh hai toán hạng (dạng byte hoặc từ) và cập nhật các cờ nhưng không trả lại kết quả (tức là không có toán hạng nào thay đổi, không lưu kết quả). Nếu phía sau lệnh TEST là lệnh JNZ (nhảy nếu khác 0), thì một lệnh nhảy sẽ được thực hiện nếu có một cặp các bit tương ứng đều bàng 1. Các cờ bị thay đổi: CF, OF, PF, SF, ZF. Ví dụ: TEST AL, 3FH TEST AX, 0034H 35. XOR - Exclusive OR (lệnh logic XOR (hoặc đảo)). Dạng lệnh: XOR Đích, Nguồn Mô tả: Đích<-Đích © Nguồn. Các cờ bị thay đổi: CF, OF, PF, SF, ZF. Ví dụ: XOR AX, AX XOR BX, BX MOV AX, 5857H MOV BX, 58A8H XOR AX, BX 71 Trước khi thực biện lệnh XOR Sau khi thực hiện lệnh XOR AX=5857H AX=00FFH BX=58A8H BX=58A8H 2.3ẳ2ề5. Nhóm các lệnh so sánh 36. CMP - Compare (so sánh) Dạng lệnh: CMP Đích, Nguồn CMP trừ toán hạng Đích cho toán hạng Nguồn, nhưng không lưu trữ kết quả. Các toán hạng không bị thay đổi. Kết quả của lệnh này dùng để cập nhật các cờ và có thể được dùng để làm điều kiện cho các lệnh nhảy có điều kiện tiếp theo. Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF. Các cờ chính theo quan hệ Đích và Nguồn khi so sánh hai số không dấu. So sánh CF ZF Đích = Nguồn 0 1 Đích > Nguồn 0 0 Đích < Nguồn 1 0 37. CMPS/CMPSB/CMPSW — Compare String Bytes or String Words (so sánh hai chuỗi byte hay hai chuỗi từ). Dạng lệnh: CMPS Chuỗi_Đích, Chuỗi Nguồn CMPSB CMPSW 72 — Lệnh này so sánh từng phần tử (byte hay từ) của hai xâu có các phần tử cùng loại. Lệnh chi tạo các cờ, không lưu kết quả so sánh, sau khi so sánh các toán hạng không bị thay đổi. Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF. Ví dụ: StrBytel DB "chuoi bytel" StrByte2 DB "chuoi byte2" StrWordl DW "chuoi wordl" StrWord2 DW "chuoi word2" LEA SI, StrBytel ;nap gia tri hieu ;StrBytel vao SI LEA DI, StrByte2 ;nap gia tri hieu ,ềStrByte2 vaoDI COMPS StrByte2, StrBytel ;co the thay bang ;COMPSB LEA SI, StrWordl ;nap gia tri hieu dung ;StrWordl vao SI LEA DI, StrWord2 ;nap gia tri hieu dung ;StrWord2 vaoDI COMPS StrWord2,StrWord ;co the thay bang COMPSW 2ẽ3.2ề6. Nhóm các lệnh nhảy (rẽ nhánh) 38. JA/JNBE - Jump if Above/Jump if Not Below or Equal (nhảy nếu cao hơn/nhảy nếu không thấp hơn hoặc bàng)ề Dạng lệnh: JA NHAN JNBE NHAN 73 Mô tả: IP<— IP + dịch chuyển Hai lệnh trên biểu diễn cùng một thao tác nhảy có điêu kiện tới NHAN nếu CF + ZF = 0. Quan hệ cao hom/thấp hom là quan hệ dành cho việc so sánh (do lệnh CMP thực hiện) độ lớn hai số không dâu. Các cờ bị thay đổi: không. Ví dụ: CMP AX, 12ABH;so sanh AX voi 12ABH JA THOI ;nhay den THOI neu AX cao hon 12ABH 39ễ JAE/JNB/JNC - Jump if Above or Equal/Jump if Not Below/Jump if No Carry (nhảy nếu lớn hom hoặc bàng/nhảy nếu không thấp hom/nhảy nếu không có nhớ). Dạng lệnh: JAE NHAN JNB NHAN JNC NHAN Mô tả: IP<— IP+dịch chuyển Ba lệnh trên biểu diễn cùng một thao tác nhảy có điều kiện tới NHAN nếu CF = 0. Quan hệ cao hơn/thấp hơn là quan hệ dành cho việc so sánh (do lệnh CMP thực hiện) độ lớn hai số không dấu. Các cờ bị thay đổi: không. Vỉ dụ: CMP AL, 10H ,ệso sanh AL voi 10H JAE THOI;Den THOI neu AL cao hon hoac bang 10H 40. JB/JC/JTNAE - Jump if Below/Jump if Carry/Jump if Not Above or Equal (nhảy nếu thấp hơn/nhảy nếu có nhớ/nhảy nếu không cao hơn hoặc bàng). 74 Dạng lệnh: JB NHAN JC NHAN JNAE NHAN Mô tả: IP<-IP+dịch chuyển Ba lệnh trên biểu diễn cùng một thao tác nhảy có điều kiện tới NHAN nếu CF = 1 ẻ Quan hệ cao hơn/thấp hom là quan hệ dành cho việc so sánh (do lệnh CMP thực hiện) độ lớn hai số không dấu. Các cờ bị thay đổi: không. Ví dụ: CMP AL, 10H ;so sanh AL voi 10H JB THOI ,ẳnhay den THOI neu AL thap hon 10H 41. JBE/JNA - Jump if Below or Equal/Jump if Not Above (nhảy nếu thấp hom hoặc bằng/nhảy nếu không cao hom). Dạng lệnh: JBE NHAN JNA NHAN Mô tả: IP<-IP+dịch chuyển Hai lệnh trên biểu diễn cùng một thao tác nhảy có điều kiện tới NHAN nếu CF + ZF = 1. Quan hệ cao hơn/thấp là quan hệ dành cho việc so sánh (do lệnh CMP thực hiện) độ lớn hai số không dấu. Các cờ bị thay đổi: không. Vỉ dụ : CMP AL, 10H ;so sanh AL voi 10H JBE THOI,ẳDen THOI neu AL thap hon hoac bang 10H 42. JCX Z - Jump if c x register is Zero (nhảy nếu nội dung thanh đếm cx rỗng). Dạng lệnh: JCXZ NHAN Mô tả: IP<-IP+dịch chuyển Lệnh trên biểu diễn thao tác nhảy có điều kiện tới NHAN nếu cx = 0 và không liên quan đến ZF. Các cờ bị thay đổi: không. Vỉ dụ: JCXZ THOI ;nhay den THOI neu cx = 0 43. JE /JZ - Jump if Equal/Jump if Zero (nhảy nếu bàng nhau/nhày nếu kết quả bàng không) Dạng lệnh: JE NHAN JZ NHAN Mô tả: IP<— IP+dịch chuyển Lệnh trên biểu diễn thao tác nhảy có điều kiện tới NHAN nếu Z F= 1. Các cờ bị thay đổi: không. Vỉ dụ: SUB AL, 10H ,-tru AL cho 10H JE THOI ;nhay den THOI neu AL bang 10H 44ẽ JG/JNLE - Jump if Greater than/Jump if Not Less than or Equal (nhảy nếu lớn hơn/nhảy nếu không bé hơn hoặc bàng) Dạng lệnh: JG NHAN JNLE NHAN Mô tả: IP<-IP+dịch chuyển Hai lệnh ừên biểu diễn cùng một thao tác nhảy có điều kiệri tới NHAN nếu (SF xor OF) + ZF = 0. Quan hệ lớn hơn/bé hơn là quan hệ dành cho việc so sánh (do lệnh CMP thực hiện) của hai số có dấu. Lớn hơn có nghĩa là dương hom. Các cờ bị thay đổi: không. Vỉ dụ: CMP AL, 10H ; so sanh AL voi 10H JG THOI ;nhay den THOI neu AL lon hon 10H 45. JGE/JNL - Jump if Greater than or Equal/Jump if Not Less than (nhảy nếu lớn hơn hoặc bằng/nhảy nếu không nhỏ hơn) Dạng lệnh: JGE NHAN JNL NHAN Mô tả: IP<-IP+dịch chuyển Hai lệnh trên biểu diễn cùng một thao tác nhảy có điều kiện tới NHAN nếu (SF xor OF) = 0. Quan hệ lớn hơn/bé hom là quan hệ dành cho việc so sánh (do lệnh CMP thực hiện) của hai số có dấu. Lớn hơn có nghĩa là dương hơn. Các cờ bị thay đổi: không. Ví dụ: CMP AL, 10H ;so sanh AL voi 10H JGE THOI;Den THOI neu AL lon hon hoac bang 10H 46ế JL/JNGE - Jump if Less than/Jump if Not Greater than or Equal (nhảy nếu bẻ hơn/nhảy nếu không lớn hơn hoặc bằng). Dạng lệnh: JL NHAN JNGE NHAN Mô tả: IP<— IP+dịch chuyển 77 Hai lệnh trên biểu diễn cùng một thao tác nhảy có điêu kiện tới NHAN nếu (SF xor OF) = 1. Quan hệ lớn hom/bé hơn là quan hệ dành cho việc so sánh (do lệnh CMP thực hiện) của hai số có dâu. Lớn hơn có nghĩa là dương hơn. Các cờ bị thay đổi: không. Ví dụ: CMP AL, 10H ;so sanh AL voi 10H JL THOI ;nhaỵ den THOI neu AL nho hon 10H 47. JLE/JNG - Jump if Less than or Equal/Jump if Not Greater than (nhảy nếu nhỏ hơn hoặc bàng/nhảy nếu không lớn hom) Dạng lệnh: JLE NHAN JNG NHAN Mô tà: IP<-IP+dịch chuyển Hai lệnh trên biểu diễn cùng một thao tác nhảy có điều kiện tới NHAN nếu (SF xor OF) + ZF = 1. Quan hệ lớn hơn/bé hơn là quan hệ dành cho việc so sánh (do lệnh CMP thực hiện) của hai số có dấu. Lớn hom có nghĩa là dương hơn. Các cờ bị thay đổi: không. Ví dụ : CMP AL, 10H ;so sanh AL voi 10H JLE THOI;Den THOI neu AL nho hon hoac bang 10H 48. JM P - Unconditional Jump (lệnh nhảy không điều kiện). JMP trao quyền điều khiển cho vùng mục tiêu một cách không điều kiện. Lệnh này có các chế độ giống như lệnh CALL. Dạng lệnh: Sau đây là những cách viết lệnh không điều kiện. JM P NHAN 78 Các cờ bị thay đổi: không. 49. JNE/JNZ - Jump if Not Equal/Jump if Not Zero (nhảy nếu không bàng nhau/nhảy nếu kết quả không rỗng). Dạng lệnh: JNE NHAN JNZ NHAN Mô tả: IP<—IP+dịch chuyển Hai lệnh trên biểu diễn cùng một thao tác nhảy có điều kiện tới NHAN nếu ZF = 0. Các cờ bị thay đổi: không. Vỉ dụ: CMP AL, 10H ;so sanh AL voi 10H JNE THOI ;nhay den THOI neu AL khac 10H 50. JNO - Jump if Not Overflow (nhảy nếu không tràn) Dạng lệnh: JNO NHAN Mô tả: IP<-IP+dịch chuyển Đây là lệnh nhảy có điều kiện tới NHAN nếu OF = 0. Các cờ bị thay đổi: không. Vỉ dụ: MUL AL, BL ;nhan AL voi BL JNO THOI ;nhay den THOI neu khong tran 51ẵ JN P/JPO - Jump if Not Parity/Jump if Parity Odd (nhảy nếu parity lẻ). Dạng lệnh: JNP NHAN JPO NHAN 79