Giáo trình Vi xử lý - Phạm Hùng Kim Khánh

pdf 201 trang ngocly 100
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Vi xử lý - Phạm Hùng Kim Khánh", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_vi_xu_ly_pham_hung_kim_khanh.pdf

Nội dung text: Giáo trình Vi xử lý - Phạm Hùng Kim Khánh

  1. BỘ GIÁO DỤC & ĐÀO TẠO TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHỆ THÀNH PHỐ HỒ CHÍ MINH KHOA ĐIỆN – ĐIỆN TỬ oOo GIÁO TRÌNH VI XỬ LÝ Tác giả: ThS. PHẠM HÙNG KIM KHÁNH 08/2006
  2. Giáo trình vi xử lý LỜI NÓI ĐẦU Giáo trình Vi xử lý được biên soạn nhằm cung cấp cho sinh viên kiến thức cơ bản về vi xử lý, cấu trúc của một hệ vi xử lý cũng như cách thức lập trình điều khiển thiết bị dựa cơ sở trên Vi xử lý 8086/8088. Giáo trình được sử dụng cho khóa học 60 tiết dành cho sinh viên hệ đại học Khoa Điện Điện tử trường Đại học Dân lập Kỹ thuật Công nghệ TPHCM. Bố cục giáo trình gồm 4 chương dựa theo đề cương môn học Kỹ thuật Vi xử lý dành cho sinh viên ngành Điện Tử Viễn Thông: Chương 1. Tổ chức hệ thống Vi xử lý Chương 2. Lập trình hợp ngữ Chương 3. Tổ chức nhập / xuất Chương 4. Giao tiếp với các thiết bị đơn giản Phụ lục 1: 8255 Phụ lục 2: Tập lệnh của họ 8086 PHẠM HÙNG KIM KHÁNH i
  3. Giáo trình vi xử lý MỤC LỤC CHƯƠNG 1: TỔ CHỨC HỆ THỐNG VI XỬ LÝ 1 1. Các hệ thống số dùng trong máy tính và các loại mã 1 1.1. Hệ thập phân (Decimal Number System) 1 1.2. Hệ nhị phân (Binary Number System) 1 1.3. Hệ thập lục phân (Hexadecimal Number System) 2 1.4. Mã BCD (Binary Coded Decimal) 3 1.5. Mã hiển thị Led 7 đoạn (7-segment display) 3 2. Các phép toán số học 4 2.1. Hệ nhị phân 4 2.2. Hệ thập lục phân 7 3. Các thiết bị số cơ bản 8 3.1. Cổng đệm (buffer) và các cổng logic (logic gate) 8 3.2. Thiết bị logic lập trình được 9 3.3. Chốt, flipflop và thanh ghi 10 3.4. Bộ nhớ 12 4. Giới thiệu vi xử lý 13 4.1.Các thế hệ vi xử lý 13 4.2. Vi xử lý (μP – microproccessor) 13 4.3. Giao tiếp với bộ nhớ 16 5. μP 8086/8088 21 5.1. Giới thiệu 21 5.2. Mô tả chân 22 5.3. Kiến trúc nội 28 5.4. Các thanh ghi 30 6. Phân đoạn bộ nhớ 32 7. Các cách định địa chỉ 36 7.1 Định địa chỉ tức thời 37 7.2. Định địa chỉ thanh ghi 37 7.3. Định địa chỉ trực tiếp 37 7.4. Định địa chỉ truy xuất bộ nhớ gián tiếp 37 7.5. Định địa chỉ chuỗi 38 7.6. Thay đổi thanh ghi đoạn mặc định 39 ii
  4. Giáo trình vi xử lý Bài tập chương 1 40 CHƯƠNG 2: LẬP TRÌNH HỢP NGỮ 43 1. Các tập tin .EXE và .COM 43 1.1. Tập tin .COM 43 1.2. Tập tin .EXE 43 2. Khung của một chương trình hợp ngữ 43 3. Cú pháp của các lệnh trong chương trình hợp ngữ 45 3.1. Khai báo dữ liệu 45 3.2. Khai báo biến 45 3.3. Khai báo hằng 47 4. Các toán tử trong hợp ngữ 47 5. Các cách định địa chỉ trong hợp ngữ 50 6. Tạo và thực thi chương trình hợp ngữ 51 7. Tập lệnh hợp ngữ 51 7.1. Nhóm lệnh chuyển dữ liệu 51 7.2. Nhóm lệnh chuyển điều khiển 54 7.3. Nhóm lệnh xử lý số học 57 7.4. Nhóm lệnh xử lý chuỗi 62 8. Các cấu trúc cơ bản trong lập trình hợp ngữ 63 8.1. Cấu trúc tuần tự 63 8.2. Cấu trúc IF – THEN, IF – THEN – ELSE 63 8.3. Cấu trúc CASE 64 8.4. Cấu trúc FOR 64 8.5. Cấu trúc lặp WHILE 65 8.6. Cấu trúc lặp REPEAT 65 9. Các ngắt của 8086 65 9.1. Ngắt 21h 66 9.2. Ngắt 10h 67 10. Truyền tham số giữa các chương trình 68 10.1. Truyền tham số qua thanh ghi 68 10.2. Truyền tham số qua ô nhớ (biến) 69 10.3. Truyền tham số qua ô nhớ do thanh ghi chỉ đến 69 10.4. Truyền tham số qua stack 70 11. Các ví dụ minh hoạ 71 iii
  5. Giáo trình vi xử lý 11.1. In chuỗi ký tự ra màn hình 71 11.2. In chuỗi ký tự ra màn hình tại toạ độ nhập vào 71 11.3. Cộng 2 số nhị phân dài 5 byte 72 11.4. Nhập một chuỗi ký tự và chuyển chữ thường thành chữ hoa 73 Bài tập chương 2 74 CHƯƠNG 3: TỔ CHỨC NHẬP / XUẤT 77 1. Các mạch phụ trợ 8284 và 8288 77 1.1. Mạch tạo xung nhịp 8284 77 1.2. Mạch điều khiển bus 8288 78 2. Giao tiếp với thiết bị ngoại vi 80 2.1. Các kiểu giao tiếp nhập / xuất 80 2.2. Giải mã địa chỉ cho thiết bị nhập / xuất 80 2.3. Các mạch cổng đơn giản 81 2.4.Giao tiếp nhập / xuất song song lập trình được 8255A PPI (Programmable Peripheral Interface) 81 2.4.1. Giới thiệu 81 2.4.2. Sơ đồ khối 82 2.4.3. Mode 0: Nhập / xuất đơn giản 85 2.4.4. Mode BSR 89 2.4.5. Mode 1: Nhập / xuất với bắt tay (handshake) 90 2.4.6. Mode 2: Truyền dữ liệu song hướng 94 2.4.7. Các ví dụ minh họa 95 Bài tập chương 3 108 CHƯƠNG 4: GIAO TIẾP VỚI CÁC THIẾT BỊ ĐƠN GIẢN 109 1. Giao tiếp LED (Light Emitting Diode) 109 1.1. Giao tiếp LED đơn 109 1.2. Giao tiếp ma trận LED 111 2. Giao tiếp bàn phím 115 2.1. Giao tiếp phím đơn 115 2.2. Giao tiếp bàn phím Hex 119 Bài tập chương 4 126 Phụ lục 1: 8255 127 Phụ lục 2: Tập lệnh của 8086 153 iv
  6. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý CHƯƠNG 1: TỔ CHỨC HỆ THỐNG VI XỬ LÝ 1. Các hệ thống số dùng trong máy tính và các loại mã 1.1. Hệ thập phân (Decimal Number System) Trong thực tế, ta thường dùng hệ thập phân để biểu diễn các giá trị số. Ở hệ thống này, ta dùng các tổ hợp của các chữ số 0 9 để biểu diễn các giá trị. Một số trong hệ thập phân được biểu diễn theo các số mũ của 10. VD: Số 5346.72 biểu diễn như sau: 5346.72 = 5x103 + 3x102 + 4x10 + 6 + 7x10-1 + 2x10-2 Tuy nhiên, trong các mạch điện tử, việc lưu trữ và phân biệt 10 mức điện áp khác nhau rất khó khăn nhưng việc phân biệt hai mức điện áp thì lại dễ dàng. Do đó, người ta sử dụng hệ nhị phân để biểu diễn các giá trị trong hệ thống số. 1.2. Hệ nhị phân (Binary Number System) Hệ nhị phân chỉ dùng các chữ số 0 và 1 để biểu diễn các giá trị số. Một số nhị phân (binary digit) thường được gọi là bit. Một chuỗi gồm 4 bit nhị phân gọi là nibble, chuỗi 8 bit gọi là byte, chuỗi 16 bit gọi là word và chuỗi 32 bit gọi là double word. Chữ số nhị phân bên phải nhất của chuỗi bit gọi là bit có ý nghĩa nhỏ nhất (least significant bit – LSB) và chữ số nhị phân bên trái nhất của chuỗi bit gọi là bit có ý nghĩa lớn nhất (most significant bit – MSB). Một số trong hệ nhị phân được biểu diễn theo số mũ của 2. Ta thường dùng chữ b cuối chuỗi bit để xác định đó là số nhị phân. VD: Số 101110.01b biểu diễn giá trị số: 101110.01b Æ 1x25 + 0x24 + 1x23 +1x22 + 1x21 + 0 + 0x2-1 + 1x2-2 ™ Chuyển số nhị phân thành số thập phân: Để chuyển một số nhị phân thành một số thập phân, ta chỉ cần nhân các chữ số của số nhị phân với giá trị thập phân của nó và cộng tất cả các giá trị lại. VD: 1011.11B Æ 1x23 + 0x22 + 1x21 + 1 + 1x2-1 + 1x2-2 = 11.75 ™ Chuyển số thập phân thành số nhị phân: Để chuyển một số thập phân thành số nhị phân, ta dùng 2 phương pháp sau: ¾ Phương pháp 1: Ta lấy số thập phân cần chuyển trừ đi 2i trong đó 2i là số lớn nhất nhỏ hơn hay bằng số thập phân cần chuyển. Sau đó, ta lại lấy kết quả này và thực hiện tương tự cho đến 20 thì dừng. Trong quá trình thực hiện, ta sẽ ghi lại các giá trị 0 hay 1 cho các bit tuỳ theo trường hợp số thập phân nhỏ hơn 2i (0) hay lớn hơn 2i (1). Phạm Hùng Kim Khánh Trang 1
  7. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý VD: Xét số 21 thì số 2i lớn nhất là 24 24 23 22 21 20 16 8 4 2 1 21 = 1 0 1 0 1 ( 21 Æ 10101B) 5 5 1 1 0 ¾ Phương pháp 2: Lấy số cần chuyển chia cho 2, ta nhớ lại số dư và lấy tiếp thương của kết quả trên chia cho 2 và thực hiện tương tự cho đến khi thương cuối cùng bằng 0. Kết quả chuyển đổi sẽ là chuỗi các bit là các số dư lấy theo thứ tự ngược lại. VD: Chuyển 227 ra số nhị phân Số bị chia Thương Số dư 227 113 1 ( LSB) 113 56 1 56 28 0 28 14 0 14 7 0 7 3 1 3 1 1 1 0 1 ( MSB) ( 227 Æ 11100011b) ¾ Để thực hiện chuyển các số thập phân nhỏ hơn 1 sang các số nhị phân, ta làm như sau: lấy số cần chuyển nhân với 2, giữ lại phần nguyên và lại lấy phần lẻ nhân với 2. Quá trình tiếp tục cho đến khi phần lẻ bằng 0 thì dừng. Kết quả chuyển đổi là chuỗi các bit là giá trị các phần nguyên. VD: Chuyển 0.625 thành số nhị phân: 0.625 × 2 = 1.25 0.25 × 2 = 0.5 0.5 × 2 = 1.0 ( 0.625 = 0.101b) ¾ Để thực hiện chuyển đổi số nhị phân bất kỳ, ta thực hiện chuyển đổi tương ứng với số nhị phân lớn hơn 1 và nhỏ hơn 1 như trên. VD: Chuyển 227.625 thành số nhị phân: 227 Æ 11100011b 0.625 Æ 0.101b 227.625 Æ 11100011.101b 1.3. Hệ thập lục phân (Hexadecimal Number System) Như đã biết ở trên, nếu dùng hệ nhị phân thì sẽ cần một số lượng lớn các bit để biểu diễn. Giả sử như số 1024 = 210 sẽ cần 10 bit để biểu diễn. Để rút ngắn kết quả Phạm Hùng Kim Khánh Trang 2
  8. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý biểu diễn, ta dùng hệ thập lục phân dựa cơ sở trên số mũ của 16. Khi đó, 4 bit trong hệ nhị phân (1 nibble) sẽ biểu diễn bằng 1 chữ số trong hệ thập lục phân (gọi là số hex). Trong hệ thống này, ta dùng các số 0 9 và các kí tự A F để biểu diễn cho một giá trị số. Thông thường, ta dùng chữ h ở cuối để xác định đó là số thập lục phân. 1.4. Mã BCD (Binary Coded Decimal) Trong thực tế, đối với một số ứng dụng như đếm tần, đo điện áp, ngõ ra ở dạng số thập phân, ta dùng mã BCD. Mã BCD dùng 4 bit nhị phân để mã hoá cho một số thập phân 0 9. Như vậy, các số hex A F không tồn tại trong mã BCD. Mã BCD gồm có 2 loại: - Mã BCD không nén (unpacked): biểu diễn một số BCD bằng 8 bit nhị phân - Mã BCD nén (packed): biểu diễn một số BCD bằng 4 bit nhị phân VD: Số thập phân 5 2 9 Số BCD không nén 0000 0101b 0000 0010b 0000 1001b Số BCD nén 0101b 0010b 1001b 1.5. Mã hiển thị Led 7 đoạn (7-segment display) Đối với các ứng dụng dùng hiển thị số liệu ra Led 7 đoạn, ta dùng mã hiển thị Led 7 đoạn. Ứng với mỗi loại Led 7 đoạn (anode hay cathode chung) và tuỳ theo sơ đồ kết nối sẽ có một bảng mã riêng. Một ví dụ của mã Led 7 đoạn cho trong bảng 1.1. a a b cgd e f f b g e c d Hình 1.1 – Led 7 đoạn dạng cathode chung Bảng 1.1: Mã Led 7 đoạn Số thập phân Số thập lục phân Số nhị phân a b c d e f g Hiển thị 0 0 0000 1 1 1 1 1 1 0 0 1 1 0001 0 1 1 0 0 0 0 1 2 2 0010 1 1 0 1 1 0 1 2 3 3 0011 1 1 1 1 0 1 1 3 4 4 0100 0 1 1 0 0 1 1 4 5 5 0101 1 0 1 1 0 1 1 5 6 6 0110 1 0 1 1 1 1 1 6 7 7 0111 1 1 1 0 0 0 0 7 Phạm Hùng Kim Khánh Trang 3
  9. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 8 8 1000 1 1 1 1 1 1 1 8 9 9 1001 1 1 1 0 0 1 1 9 10 A 1010 1 1 1 1 1 0 1 A 11 B 1011 0 0 1 1 1 1 1 B 12 C 1100 0 0 0 1 1 0 1 C 13 D 1101 0 1 1 1 1 0 1 D 14 E 1110 1 1 0 1 1 1 1 E 15 F 1111 1 0 0 0 1 1 1 F 2. Các phép toán số học 2.1. Hệ nhị phân 2.1.1. Phép cộng Phép cộng trong hệ nhị phân cũng thực hiện giống như trong hệ thập phân. Bảng sự thật của phép cộng 2 bit với 1 bit nhớ (carry) như sau: Bảng 1.2: Vào Ra ABCIN SCOUT 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 S = A ⊕ B ⊕ CIN COUT = AB + CIN(A ⊕ B) VD: 1001 1010b 1 + 1100 1100b Nhớ 0111 0110b 2.1.2. Số bù 2 (2’s component) Trong hệ thống số thông thường, để biểu diễn số âm ta chỉ cần thêm dấu – vào các chữ số. Tuy nhiên, trong hệ thống máy tính, ta không thể biểu diễn được như trên. Phương pháp thông dụng là dùng bit có ý nghĩa lớn nhất (MSB) làm bit dấu (sign bit): nếu MSB = 1 sẽ là số âm còn MSB = 0 là số dương. Khi đó, các bit còn lại sẽ biểu diễn độ lớn (magnitude) của số. Như vậy, nếu ta dùng 8 bit để biểu diễn thì sẽ thu được 256 tổ hợp ứng với các giá trị 0 255 (số không dấu) hay –127 –0 +0 +127 (số có dấu). Phạm Hùng Kim Khánh Trang 4
  10. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý Để thuận tiện hơn trong việc tính toán số có dấu, ta dùng một dạng biểu diễn đặc biệt là số bù 2. Số bù 2 của một số nhị phân xác định bằng cách lấy đảo các bit rồi cộng thêm 1. VD: Số 7 biểu diễn là : 0000 0111b có MSB = 0 (biểu diễn số dương) Số bù 2 là : 111 1000b + 1b = 111 1001b. Số đại diện cho số – 7 là: 1111 1001b có MSB = 1 (biểu diễn số âm) Ta thấy, để thực hiện việc xác định số bù 2 của một số A, cần phải: - Biểu diễn số A theo mã bù 2 của nó. - Đảo các bit (tìm số bù 1 của A). - Cộng thêm 1 vào để nhận được số bù 2. Khi biểu diễn theo số bù 2, nếu sử dụng 8 bit ta sẽ có các giá trị số thay đổi từ - 128 127. 2.1.3. Phép trừ Phép trừ các số nhị phân cũng được thực hiện tương tự như trong hệ thập phân. Bảng sự thật của phép trừ 2 bit với 1 bit mượn (borrow) như sau: Bảng 1.3: Vào Ra A B BIN D BOUT 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 1 S = A ⊕ B ⊕ BIN BOUT = AB + (A ⊕ B)BIN VD: 0110 1101b Æ 149 - 0011 0001b Æ 49 0011 1100b Æ 100 Ngoài cách trừ như trên, ta cũng có thể thực hiện phép trừ thông qua số bù 2 của số trừ. VD: 0110 1101b 0110 1101b - 0011 0001b → + 1100 1111b 1 0011 1100b Số bù 1 Nhớ 100 1110b + 1b = 100 1111b (Số bù 2) Phạm Hùng Kim Khánh Trang 5
  11. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý Trong phép cộng với số bù 2, ta bỏ qua bit nhớ cuối cùng → kết quả phép cộng số bù 2 là 0011 1100. Đây cũng chính là kết quả phép trừ, bit MSB = 0 cho biết kết quả là số dương. VD: 77 0100 1101b 0100 1101b - 88 - 0101 1000b → + 1010 1000b - 11 1111 0101b Số 88 Æ 0101 1000b → số bù 1 là 010 0111 → số bù 2: 010 1000 và bit dấu = 1 Æ -88 trở thành 1010 1000b Kết quả phép cộng số bù 2 là 1111 0101b có MSB = 1 nên là số âm. Số bù 1 là 000 1010b → số bù 2: 000 1011b. Kết quả này chính là 11 nên phép trừ sẽ cho kết quả là –11. Ta thấy, để thực hiện chuyển số bù 2 thành số có dấu thì cần thực hiện: - Lấy bù các bit để tìm số bù 1. - Cộng với 1. - Thêm dấu trừ để xác định là số âm. 2.1.4. Phép nhân Phép nhân các số nhị phân cũng tương tự như đối với các số thập phân. Chú ý rằng đối với phép nhân nếu nhân 2 số 4 bit sẽ có kết quả là số 8 bit, 2 số 8 bit sẽ có kết quả là số 16 bit, VD: 11 1011b X 9 1001b 99 1011 0000 0000 1011 1100011b Đối với máy tính, phép nhân được thực hiện bằng phương pháp cộng và dịch phải (add-and-right-shift): - Thành phần dầu tiên của tổng sẽ chính là số bị nhân nếu như LSB của số nhân là 1. Ngược lại, nếu LSB của số nhân bằng 0 thì thành phần này bằng 0. - Mỗi thành phần thứ i kế tiếp sẽ được tính tương tự với điều kiện là phải dịch trái số bị nhân i bit. - Kết quả cần tìm chính là tổng các thành phần nói trên. 2.1.5. Phép chia Phép chia các số nhị phân cũng tương tự như đối với các số thập phân. Phạm Hùng Kim Khánh Trang 6
  12. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý VD: 30/5 = 6 11110 b 110b 110 101b 011 000 110 110 0 Tương tự như đối với phép nhân, ta có thể dùng phép trừ và phép dịch trái cho đến khi không thể thực hiện phép trừ được nữa. Tuy nhiên, để thuận tiện cho tính toán, thay vì dùng phép trừ đối với số chia, ta sẽ thực hiện phép cộng đối với số bù 2 của số chia. - Đổi số chia ra số bù 2 của nó. - Lấy số bị chia cộng với số bù 2 của số chia. + Nếu kết quả này có bit dấu = 0 thì bit tương ứng của thương = 1. + Nếu kết quả này có bit dấu = 1 thì bit tương ứng của thương = 0 và ta phải khôi phục lại giá trị của số bị chia bằng cách cộng kết quả này với số chia. - Dịch trái kết quả thu được và thực hiện tiếp tục như trên cho đến khi kết quả là 0 hay nhỏ hơn số chia. 2.2. Hệ thập lục phân 2.2.1. Phép cộng Thực hiện chuyển các số hex cần cộng thành các số nhị phân, tính kết quả trên số nhị phân và sau đó chuyển lại thành số hex. VD: 7Ah → 0111 1010b 3Fh → 0011 1111b B9h ← 1011 1001b Thực hiện cộng trực tiếp trên số hex, nếu kết quả cộng lớn hơn 15 thì sẽ nhớ và trừ cho 16. VD: 7 Ah 3 Fh 1010 2510 → B9h Ah + Fh = 1010 + 1510 = 2510 → nhớ 1 và 2510 – 1610 = 910 = 9h 7h + 3h = 710 + 310 = 1010 → cộng số nhớ: 1010 + 110 = 1110 = Bh 2.2.2. Phép trừ Thực hiện tương tự như phép cộng. Phạm Hùng Kim Khánh Trang 7
  13. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 3. Các thiết bị số cơ bản 3.1. Cổng đệm (buffer) và các cổng logic (logic gate) ™ Cổng đệm: A A X 3 2 0 0 1 1 ™ Cổng NOT: A X = A A X 1 2 0 1 1 0 ™ Cổng AND: A 1 X = A B 3 A B X 2 B 0 0 0 0 1 0 1 0 0 1 1 1 ™ Cổng NAND: A B X 0 0 1 A 1 X = A B 3 0 1 1 2 B 1 0 1 1 1 0 ™ Cổng OR: A B X 0 0 0 A 1 X = A + B 3 0 1 1 B 2 1 0 1 1 1 1 ™ Cổng NOR: A 2 X = A + B 1 B 3 A B X 0 0 1 0 1 0 1 0 0 1 1 0 Phạm Hùng Kim Khánh Trang 8
  14. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý ™ Cổng EX-OR: A B X 0 0 0 A 1 X = A ⊕ B 3 0 1 1 B 2 1 0 1 1 1 0 ™ Cổng EX-NOR: X = A ⊕B A 1 3 A B X 2 0 0 1 0 1 0 1 0 0 1 1 1 3.2. Thiết bị logic lập trình được Thay vì sử dụng các cổng logic rời rạc, ta có thể dùng các thiết bị logic lập trình được (programmable logic device) như PLA (Programmable Logic Array), PAL (Programmable Array of Logic) để liên kết các thiết bị LSI (Large Scale Intergration). ™ PLA (hay FPLA – Field PLA): Dùng ma trận cổng AND và OR để lập trình bằng cácc phá huỷ các cầu chì. FPLA rất linh động nhưng lại khó lập trình. A B AB AB B A B AB A + AB AB + B Hình 1.2 – Sơ đồ PLA Phạm Hùng Kim Khánh Trang 9
  15. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý ™ PAL: ma trận OR đã cố định sẵn và ta chỉ lập trình trên ma trận AND. AB AB AB B A A+ AB AB + B A + B AB + AB Hình 1.3 – Sơ đồ PAL 3.3. Chốt, flipflop và thanh ghi ™ Chốt (latch): Chốt là thiết bị số lưu trữ lại giá trị số tại ngõ ra của nó. 2 5 D Q D CLK Q 3 CLK X 0 QN 0 1 0 1 1 1 ™ Flipflop: PR CL D CLK Q Q 4 2 5 1 1 1 1 0 D Q ↑ PR 3 1 1 0 0 1 CLK ↑ 6 1 1 X 0 QN Q N CL Q 1 1 X 1 QN Q 1 N 0 1 X X 1 0 1 0 X X 0 1 0 0 X X . . CL: clear PR: Preset CLK: Clock Phạm Hùng Kim Khánh Trang 10
  16. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý - Nếu xuất hiện cạnh lên của tín hiệu CLK thì ngõ ra Q sẽ có giá trị theo dữ liệu tại D. - Nếu PR = 0 thì Q = 1. Nếu CL = 0 thì Q = 0. - Trạng thái PR = CL = 0 là trạng thái cấm, ngõ ra sẽ không ổn định. ™ Thanh ghi (register): Thanh ghi là một nhóm các flipflop được kết nối song song để lưu trữ các số nhị phân. Giá trị nhị phân sẽ được đưa vào ngõ vào của các flipflop. Khi có tác động cạnh lên của tín hiệu CLK thì ngõ ra các flipflop sẽ lưu trữ giá trị nhị phân cho đến khi một số nhị phân mới được đưa vào và tác động một cạnh len cho tín hiệu CLK. Q3 Q2 Q1 Q0 4 4 4 4 2 5 2 5 2 5 2 5 D3D Q D2 D Q D1 D Q D0 D Q PR PR PR PR 3 3 3 3 CLK CLK CLK CLK 6 6 6 6 CL Q CL Q CL Q CL Q 1 1 1 1 CLK Hình 1.4 – Thanh ghi dạng đơn giản Trong trường hợp các flipflop được kết nối nối tiếp với nhau, ta sẽ có thanh ghi dịch (shift register). 4 4 4 4 OUT 2 5 2 5 2 5 2 5 IN D Q D Q D Q D Q PR PR PR PR 3 3 3 3 CLK CLK CLK CLK 6 6 6 6 CL Q CL Q CL Q CL Q 1 1 1 1 CLK Hình 1.5 – Thanh ghi dịch Phạm Hùng Kim Khánh Trang 11
  17. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 3.4. Bộ nhớ 3.4.1. Các kiểu bộ nhớ ™ ROM (Read Only Memory): Đặc tính chung của ROM là dữ liệu lưu trữ sẽ không bị mất đi dù cho không còn nguồn cung cấp cho ROM (tính nonvolatile – ổn định). Ta chỉ có thể thực hiện tác vụ đọc đối với ROM. ROM có thể được chia thành: ROM che mặt nạ (Masked ROM), PROM (ROM lập trình được), EPROM (ROM có thể xoá bằng tia cực tím) và EEPROM (ROM có thể xoá bằng điện). ™ RAM (Random Access Memory): RAM có đặc tính là tất cả nội dung chứa trong RAM sẽ bị mất đi khi không còn nguồn cung cấp cho RAM (tính volatile – không ổn định). Có 2 loại RAM: tĩnh và động. - SRAM (Static RAM): dùng các ma trận flipflop để lưu trữ dữ liệu nên ta có thể ghi các giá trị nhị phân vào RAM bằng cách đưa dữ liệu vào các ngõ vào các flipflop và cấp xung clock cho các flipflop này. - DRAM (Dynamic RAM): tạo ra bằng các cổng transistor và lưu trữ bằng điện tích. Tuy nhiên, do hiện tượng rò rỉ điện tích theo thời gian, ta phải thực hiện nạp điện lại. Quá trình này gọi là làm tươi (refreshing) bộ nhớ. Thuận lợi của DRAM là một số lượng lớn transistor có thể được đặt trên một chip nhớ nên nó có dung lượng cao hơn và nhanh hơn SRAM. 3.4.2. Cấu trúc bên trong của bộ nhớ OE CS EN WE Đệm ngõ ra Ma trận nhớ Giải mã hàng EN Đệm ngõ vào Giải mã cột Hình 1.6 – Cấu trúc nội một bộ nhớ tiêu biểu Phạm Hùng Kim Khánh Trang 12
  18. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý CS(Chip Select):cho phép bộ nhớ hoạt động OE (Output Enable): cho phép đọc dữ liệu từ bộ nhớ ra ngoài WE(Write Enable): cho phép ghi dữ liệu vào trong bộ nhớ 4. Giới thiệu vi xử lý 4.1. Các thế hệ vi xử lý - Thế hệ 1 (1971 – 1973): vi xử lý 4 bit, đại diện là 4004, 4040, 8080 (Intel) hay IPM-16 (National Semiconductor). + Độ dài word thường là 4 bit (có thể lớn hơn). + Chế tạo bằng công nghệ PMOS với mật độ phần tử nhỏ, tốc độ thấp, dòng tải thấp nhưng giá thành rẻ. + Tốc độ 10 ÷ 60 μs / lệnh với tần số xung nhịp 0.1 ÷ 0.8 MHz. + Tập lệnh đơn giản và phải cần nhiều vi mạch phụ trợ. - Thế hệ 2 (1974 – 1977): vi xử lý 8 bit, đại diện là 8080, 8085 (Intel) hay Z80 (Zilog). + Tập lệnh phong phú hơn. + Địa chỉ có thể đến 64 KB. Một số bộ vi xử lý có thể phân biệt 256 địa chỉ cho thiết bị ngoại vi. + Sử dụng công nghệ NMOS hay CMOS. + Tốc độ 1 ÷ 8 μs / lệnh với tần số xung nhịp 1 ÷ 5 MHz - Thế hệ 3 (1978 – 1982): vi xử lý 16 bit, đại diện là 68000/68010 (Motorola) hay 8086/80286/80386 (Intel) + Tập lệnh đa dạng với các lệnh nhân, chia và xử lý chuỗi. + Địa chỉ bộ nhớ có thể từ 1 ÷ 16 MB và có thể phân biệt tới 64KB địa chỉ cho ngoại vi + Sử dụng công nghệ HMOS. + Tốc độ 0.1 ÷ 1 μs / lệnh với tần số xung nhịp 5 ÷ 10 MHz. - Thế hệ 4: vi xử lý 32 bit 68020/68030/68040/68060 (Motorola) hay 80386/80486 (Intel) và vi xử lý 32 bit Pentium (Intel) + Bus địa chỉ 32 bit, phân biệt 4 GB bộ nhớ. + Có thể dùng thêm các bộ đồng xử lý (coprocessor). + Có khả năng làm việc với bộ nhớ ảo. + Có các cơ chế pipeline, bộ nhớ cache. + Sử dụng công nghệ HCMOS. - Thế hệ 5: vi xử lý 64 bit 4.2. Vi xử lý (μP – microproccessor) 4.2.1. Phân loại vi xử lý - Multi chip: dùng 2 hay nhiều chip LSI (Large Scale Intergration: tích hợp từ 1000 ÷ 10000 transistor) cho ALU và control. - Microprocessor: dùng 1 chip LSI/VLSI (Very Large Scale Intergration: tích hợp ÷ 10000 transistor) cho ALU và control. - Single chip microprocessor (còn gọi là microcomputer / microcontroller): là 1 chip LSI/VLSI chứa toàn bộ các khối như hình 1.7. Phạm Hùng Kim Khánh Trang 13
  19. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 4.2.2. Sơ đồ khối một máy tính cổ điển ALU Input Memory (Arithmetic Logic Unit) Output Control Hình 1.7 – Sơ đồ khối một máy tính cổ điển - ALU (đơn vị logic số học): thực hiện các bài toán cho máy tính bao gồm: +, -, *, /, phép toán logic, - Control (điều khiển): điều khiển, kiểm soát các đường dữ liệu giữa các thành phần của máy tính. - Memory (bộ nhớ): lưu trữ chương trình hay các kết quả trung gian. - Input (nhập), Output (Xuất): xuất nhập dữ liệu (còn gọi là thiết bị ngoại vi). 4.2.3. Sơ đồ khối của μP Có 3 khối chức năng: đơn vị thực thi (EU - Execution unit), bộ tuần tự (Sequencer) và đơn vị giao tiếp bus (BIU – Bus interface unit). - EU: thực hiện các lệnh số học và logic. Các toán hạng được chứa trong các thanh ghi dữ liệu (data register) hay thanh ghi địa chỉ (address register), hay từ bus nội (internal bus). - Bộ tuần tự: gồm bộ giải mã lệnh (instruction decoder) và bộ đếm chương trình (program counter) + Bộ đếm chương trình chứa các lệnh kế tiếp sẽ thực hiện + Bộ giải mã sẽ thực hiện các bước cần thiết để thực thi lệnh. EU Sequencer Data register Instruction decoder ALU Addr. register Program counter Internal bus BIU Data bus Control bus Addr. bus driver driver driver Data bus Control bus Addr. bus Hình 1.8 – Sơ đồ khối của vi xử lý Phạm Hùng Kim Khánh Trang 14
  20. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý Khi chương trình bắt đầu, bộ đếm chương trình (PC) sẽ ở địa chỉ bắt đầu. Địa chỉ này được chuyển qua bộ nhớ thông qua address bus. Khi tín hiệu Read đưa vào control bus, nội dung bộ nhớ liên quan sẽ đưa vào bộ giải mã lệnh. Bộ giải mã lệnh sẽ khởi động các phép toán cần thiết để thực thi lệnh. Quá trình này đòi hỏi một số chu kỳ máy (machine cycle) tuỳ theo lệnh. Sau khi lệnh đã thực thi, bộ giải mã lệnh sẽ đặt PC đến địa chỉ của lệnh kế. 4.2.4. Sơ đồ khối của hệ vi xử lý cơ bản ADDRESS BUS Input Port μP Memory Output Port DATA BUS CONTROL BUS Hình 1.9 – Sơ đồ khối hệ vi xử lý Mọi hoạt động cơ bản của một hệ vi xử lý đều giống nhau, không phụ thuộc loại vi xử lý hay quá trình thực hiện. μP sẽ đọc một lệnh từ bộ nhớ (memory), thực thi lệnh và sau đó đọc lệnh kế. Quá trình đọc lệnh gọi là instruction fetch còn quá trình thực hiện tuần tự như trên gọi là fetch – execute sequence. Tuy nhiên có một số μP sẽ nhận một số lệnh rồi mới bắt đầu thực thi. ™ Các port I/O: Các port nhập (input) và xuất (output) dùng để giao tiếp giữa μP và thiết bị ngoại vi (không thể nối trực tiếp với các bus). Port xuất là một thanh ghi. Khi μP ghi dữ liệu ra địa chỉ của Port thì Port sẽ chứa dữ liệu hiện tại trên data bus. Dữ liệu này sẽ được chốt tại Port cho đến khi μP ghi dữ liệu mới ra Port. Port nhập là một driver 3 trạng thái. Khi μP đọc vào từ địa chỉ của Port, driver 3 trạng thái lái dữ liệu từ bên ngoài vào data bus. Sau đó, μP đọc dữ liệu từ bus. Phạm Hùng Kim Khánh Trang 15
  21. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý ™ Các tín hiệu tiêu biểu của một μP: CK Address Reset Data Interrupt Ready/ Wait Read Bus Req. Control Write Bus Ack. Hình 1.10 – Các tín hiệu cơ bản trong μP Các bus dùng để liên kết các thành phần của hệ thống với μP. μP sẽ chọn một thiết bị cần sử dụng thông qua address bus và đọc hay ghi dữ liệu thông qua data bus. Data bus là bus 2 chiều, dùng chung cho tất cả các quá trình trao đổi dữ liệu. Mỗi chu kỳ bus (bus cycle) là việc thực hiện trao đổi một từ dữ liệu giữa μP và ô nhớ hay thiết bị I/O. Mỗi chu kỳ bus bắt đầu khi μP xuất một địa chỉ nhằm chọn thiết bị I/O hay chọn một ô nhớ nào đó. Chu kỳ ghi Chu kỳ đọc Address bus Databus RD WR Hình 1.11 – Định thì bus cơ bản 4.3. Giao tiếp với bộ nhớ 4.3.1. Giao tiếp bus cơ bản - Các bit địa chỉ thấp (giả sử 13 đường A0 ÷ A12) nối trực tiếp đến chip bộ nhớ (giả sử RAM có dung lượng 8K × 8) Phạm Hùng Kim Khánh Trang 16
  22. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý - Các bit địa chỉ cao (giả sử A13 ÷ A19) nối với bộ giải mã địa chỉ (address decoder) tạo tín hiệu cho phép chip bộ nhớ. Do đó, khi thiết kế ta phải xác định mỗi chip bộ nhớ thuộc vùng địa chỉ nào. Tập hợp các vùng này theo bảng gọi là bảng bộ nhớ (memory map). Các bit địa chỉ thấp A0 ÷ A12 Data bus RAM Các bit địa chỉ cao A13 ÷ A19 Address decoder Đến các thiết bị khác Hình 1.12 – Giao tiếp bus cơ bản Quan hệ giữa giải mã địa chỉ và bảng bộ nhớ: MSB LSB Address 2n khối bộ nhớ n bit đến m bit đến bộ nhớ bộ giải mã m 2 địa chỉ Hình 1.13 – Bảng bộ nhớ Phạm Hùng Kim Khánh Trang 17
  23. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 4.3.2. Giải mã địa chỉ 4.3.2.1. Dùng 74LS138 74LS138 A13 1 15 0000h - 1FFFh 2 A Y0 14 Các tín hiệu A14 B Y1 2000h - 3FFFh A15 3 13 4000h - 5FFFh đưa tới các C Y2 12 6000h - 7FFFh Y3 11 chân CS của Y4 8000h - 9FFFh Vcc 6 10 A000h - BFFFh các IC nhớ 4 G1 Y5 9 C000h - DFFFh 5 G2A Y6 7 G2B Y7 E000h - FFFFh Hình 1.14 – Giải mã địa chỉ dùng 74LS138 4.3.2.2. Dùng nhiều 74LS138 74LS138 A13 1 15 00000h - 01FFFh A14 2 A Y0 14 02000h - 03FFFh A15 3 B Y1 13 04000h - 05FFFh C Y2 12 06000h - 07FFFh Y3 11 08000h - 09FFFh Vcc 6 Y4 10 0A000h - 0BFFFh 4 G1 Y5 9 0C000h - 0DFFFh 74LS138 5 G2A Y6 7 00000h - 0FFFFh G2B Y7 0E000h - 0FFFFh A16 1 15 A17 2 A Y0 14 A18 3 B Y1 13 C Y2 12 Y3 11 74LS138 MEM/IO 6 Y4 10 1 15 10000h - 11FFFh A19 4 G1 Y5 9 70000h - 7FFFFh 2 A Y0 14 12000h - 13FFFh 5 G2A Y6 7 3 B Y1 13 14000h - 15FFFh G2B Y7 C Y2 12 16000h - 17FFFh Y3 11 18000h - 19FFFh Vcc 6 Y4 10 1A000h - 1BFFFh 10000h - 1FFFFh 4 G1 Y5 9 1C000h - 1DFFFh 5 G2A Y6 7 G2B Y7 1E000h - 1FFFFh Hình 1.15 – 74LS138 mắc cascaded (liên tầng) 4.3.2.3. Dùng bộ so sánh 74LS688 A23 2 19 A22 4 P0 P=Q A21 6 P1 74LS138 A20 8 P2 A13 1 15 xx0000h - xx1FFFh A19 11 P3 A14 2 A Y0 14 xx2000h - xx3FFFh A18 13 P4 A15 3 B Y1 13 xx4000h - xx5FFFh 15 P5 C Y2 12 A17 P6 Y3 xx6000h - xx7FFFh A16 17 11 xx8000h - xx9FFFh P7 Vcc 6 Y4 10 G1 Y5 xxA000h - xxBFFFh 3 4 9 xxC000h - xxDFFFh 5 Q0 5 G2A Y6 7 xxE000h - xxFFFFh 7 Q1 G2B Y7 9 Q2 12 Q3 14 Q4 16 Q5 Vcc 18 Q6 Q7 1 ALE G S1 1 16 1 16 2 15 2 15 3 14 3 14 4 13 4 13 5 12 5 12 6 11 6 11 7 10 7 10 8 9 8 9 SW DIP-8 Hình 1.16 – Giải mã dùng bộ so sánh Phạm Hùng Kim Khánh Trang 18
  24. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 4.3.3. Định thì bộ nhớ ™ Thời gian truy xuất (access time): - Với chu kỳ đọc: thời gian truy xuất là thời gian tính từ lúc địa chỉ mới xuất hiện ở bộ nhớ cho đến khi có dữ liệu đúng ở ngõ ra của bộ nhớ. - Với chu kỳ ghi: thời gian truy xuất là thời gian tính từ lúc địa chỉ mới xuất hiện ở bộ nhớ cho đến khi dữ liệu đã đưa vào bộ nhớ. ™ Thời gian chu kỳ (cycle time): là thời gian từ lúc bắt đầu chu kỳ bộ nhớ đến khi bắt đầu chu kỳ kế tiếp. Ngoài ra, μP có thể sử dụng thêm một số trạng thái chờ khi đọc bộ nhớ. tOE RD Data Memory buffer Data bus tdbuf tACC μP Address bus Addr. Address buffer decoder tdec tabuf Hình 1.17 – Các đường trì hoãn trong giao tiếp μP với bộ nhớ tdbuf: thời gian trì hoãn ở bộ đệm dữ liệu (data buffer) tabuf: thời gian trì hoãn ở bộ đệm địa chỉ (address buffer) tOE: thời gian đáp ứng của bộ nhớ với tín hiệu cho phép ngõ ra (ouput enable) tCS: thời gian bộ nhớ truy xuất từ Chip Select tACC: thời gian bộ nhớ truy xuất từ địa chỉ, thông thường tACC = tcs tdec: thời gian trì hoãn ở bộ giải mã (decoder) ™ Định thì đọc bộ nhớ: Thời gian truy xuất tổng cộng của hệ thống bộ nhớ chính là tổng thời gian trì hoãn trong các bộ đệm và thời gian truy xuất (access time) bộ nhớ. Hiệu giữa thời gian truy xuất cần thiết bởi μP với thời gian truy xuất thật sự của bộ nhớ gọi là biên định thì (timing margin). tDS (Data Setup): thời gian thiết lập dữ liệu cung cấp bởi hệ thống bộ nhớ Phạm Hùng Kim Khánh Trang 19
  25. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý tDH (Data Hold): thời gian giữ dữ liệu cung cấp bởi hệ thống bộ nhớ Timing margin Thôøi gian truy xuaát μP ñôøi hoûi Thôøi gian truy xuaát boä nhôù Thôøi gian thieát laäp μP caàn Ñòa chæ (töø μP) Ñòa chæ (ñeán boä nhôù) tabuf CS tdec RD tOE Döõ lieäu (töø boä nhôù) Döõ lieäu (ñeán μP) tCS = tACC tDS tDH Hình 1.18 – Định thì đọc bộ nhớ ™ Định thì ghi bộ nhớ: taw t cw tAH tAS twp tDS tDH Hình 1.19 – Định thì ghi bộ nhớ Phạm Hùng Kim Khánh Trang 20
  26. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý taw: thời gian truy xuất ghi (access write) twp: độ rộng xung ghi tối thiểu (write pulse) tAS: thời gian địa chỉ hợp lệ trước khi WR = 0 Thông thường, ta không quan tâm đến địa chỉ cho đến khi xác nhận CS nên thường tcw = taw. 5. μP 8086/8088 5.1. Giới thiệu Tất cả các máy vi tính IBM họ PC hoặc các máy vi tính tương thích IBM đều sử dụng μP Intel họ iAPX. Bảng 2.1 liệt kê các đặc tính cơ bản của một số μP của Intel trong đó 80486 chứa một bộ điều khiển cache tích hợp và 8 KB RAM tĩnh, Pentium chứa cache 16 KB RAM tĩnh. Bảng 1.4: Kiến trúc các μP của Intel 8 bit, 16 bit và 32 bit Dung lượng bộ Bộ nhớ Tốc độ Bus Số transistor nhớ tối đa ảo 108 4 2,300 4004 640 bytes KHz bits (10 microns) 108 8 8008 3,500 16 KBytes KHz bits 8 6,000 8080 2 MHz 64 KBytes bits (6 microns) 5 MHz 16 29,000 8086 8 MHz 1 Megabyte bits (3 microns) 10 MHz 5 MHz 8 29,000 8088 8 MHz bits (3 microns) 8 MHz 16 134,000 1 80286 10 MHz 16 Megabytes bits (1.5 microns) gigabyte 12 MHz 16 MHz Intel386(TM)DX 20 MHz 32 275,000 64 4 gigabytes Microprocessor 25 MHz bits (1 micron) terabytes 33 MHz Intel386(TM)SX 16 MHz 16 275,000 64 4 gigabytes Microprocessor 20 MHz bits (1 micron) terabytes 25 MHz 1,200,000 Intel486(TM)DX 32 64 33 MHz (1 micron, .8 micron 4 gigabytes Microprocessor bits terabytes 50 MHz with 50 MHz) 16 MHz Intel486(TM)SX 20 MHz 32 1,185,000 64 4 gigabytes Microprocessor 25 MHz bits (.8 micron) terabytes 33 MHz Pentium® Processor 60MHz 32 3.1 million 4 gigabytes 64 Phạm Hùng Kim Khánh Trang 21
  27. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 66MHz bits (.8 micron) terabytes 75MHz 90MHz 100MHz 120MHz 133MHz 150MHz 166MHz 150MHz Pentium® Pro 32 5.5 million 64 180MHz 4 gigabytes Processor bits (.32 micron) terabytes 200MHz 5.2. Mô tả chân 1 40 2 GND VCC 39 3 AD14 AD15 38 4 AD13 A16/S3 37 5 AD12 A17/S4 36 AD11 A18/S5 6 35 7 AD10 A19/S6 34 8 AD9 BHE/S7 33 9 AD8 MN/MX 32 10 AD7 RD 31 11 AD6 HOLD (RQ/GT0) 30 AD5 HLDA (RQ/GT1) 12 29 13 AD4 WR (LOCK) 28 14 AD3 IO/M (S2) 27 15 AD2 DT/R (S1) 26 16 AD1 DEN (S0) 25 17 AD0 ALE (QS0) 24 NMI INTA (QS1) 18 23 19 INTR TEST 22 20 CLK READY 21 GND RESET 8086 Hình 1.20 – Sơ đồ chân của 8086 8086 có bus địa chỉ 20 bit, bus dữ liệu 16 bit, 3 chân nguồn và 17 chân dùng cho các chức năng điều khiển. Tuy nhiên, ta có thể dùng kỹ thuật ghép kênh thời gian (time multiplexing) để cho phép một chân có nhiều chức năng nên các chân sẽ được phân ra: - 16 chân dữ liệu và địa chỉ (AD0 ÷ AD15): các chân này sẽ là các đường địa chỉ trong trạng thái T1 và dữ liệu trong các trạng thái T2 – T4. - 4 chân địa chỉ và trạng thái - 3 chân nguồn - 17 chân định thì và điều khiển Phạm Hùng Kim Khánh Trang 22
  28. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 8086 có thể hoạt động ở chế độ tối thiểu (minimum mode) hay chế độ tối đa (maximum mode). Chế độ tối thiểu chỉ dùng cho các hệ thống μP đơn giản còn chế độ tối đa dùng cho các hệ thống phúc tạp hơn giao tiếp với các bộ nhớ và I/O riêng. ™ Các tín hiệu chung cho cả hai chế độ tối đa và tối thiểu: Bảng 1.5: Chân Chức năng Loại AD15 ÷ AD0 Bus dữ liệu / địa chỉ 2 chiều, 3 trạng thái A19/S6 ÷ A16/S3 Địa chỉ / trạng thái Ngõ ra 3 trạng thái MX Điều khiển chế độ Ngõ vào RD Điều khiển đọc Ngõ ra 3 trạng thái TEST Chờ kiểm tra điều khiển Ngõ vào READY Chờ trạng thái điều khiển Ngõ vào RESET Reset hệ thống Ngõ vào NMI Yêu cầu ngắt không thể che Ngõ vào INTR Yêu cầu ngắt Ngõ vào CLK Xung nhịp hệ thống Ngõ vào VCC +5V Ngõ vào GND GND Ngõ vào ™ Các tín hiệu chỉ dùng trong chế độ tối thiểu: Bảng 1.6: Chân Chức năng Loại HOLD Yêu cầu giữ Ngõ vào HLDA Ghi nhận giữ Ngõ vào WR Điều khiển ghi Ngõ ra 3 trạng thái IO/ M Điều khiển I/O và bộ nhớ Ngõ ra 3 trạng thái DT/ R Truyền / nhận dữ liệu Ngõ ra 3 trạng thái DEN Cho phép dữ liệu Ngõ ra 3 trạng thái BHE /S7 Đường trạng thái Ngõ ra 3 trạng thái ALE Cho phép chốt địa chỉ Ngõ ra INTA Ghi nhận ngắt Ngõ ra ™ Các tín hiệu chỉ dùng trong chế độ tối đa: Bảng 1.7: Chân Chức năng Loại RQ / GT1,0 Yêu cầu / cấp bus 2 chiều LOCK Điều khiển khóa ưu tiên bus Ngõ ra 3 trạng thái S2 ÷ S0 Trạng thái chu kỳ bus Ngõ ra 3 trạng thái QS1, QS2 Trạng thái hàng lệnh Ngõ ra Phạm Hùng Kim Khánh Trang 23
  29. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý ™ Trạng thái bus: Bảng 1.8: Ngõ vào trạng thái Chu kỳ CPU S2 S1 S0 0 0 0 Ghi nhận ngắt 0 0 1 Đọc I/O port 0 1 0 Ghi I/O port 0 1 1 Ngừng 1 0 0 Nhận lệnh 1 0 1 Đọc bộ nhớ 1 1 0 Ghi bộ nhớ 1 1 1 Thụ động ™ Trạng thái hàng lệnh: Bảng 1.9: QS1 QS0 Trạng thái hàng lệnh 0 0 Không hoạt động 0 1 Lấy byte đầu tiên của lệnh 1 0 Hàng rỗng 1 1 Lấy byte kế tiếp ™ Nguồn cung cấp và xung nhịp (VCC, GND và CLK): - 8086 sử dụng nguồn cấp điện +5V và có 2 chân đất. - Dòng điện cực đại là 340 mA (10 mA cho loại CMOS). - Xung nhịp dùng dạng xung chữ nhật có chu kỳ với thời gian cạnh lên và xuống nhỏ hơn 10 ns. - Tiêu hao công suất và tần số xung nhịp cực đại: ™ Các chân trạng thái trong chế độ tối đa (S0, S1 và S2 - status): Các chân này sử dụng bởi bộ điều khiển bus 8288 để tạo các tín hiệu điều khiển như bảng 2.5. ™ Các chân điều khiển bus (HOLD, HLDA, RQ/ GT0 , RQ/ GT1, LOCK ): Chế độ tối thiểu: - HOLD (giữ): ngõ vào tác động mức cao làm cho μP hở mạch tất cả các bus của nó, tách μP khỏi bộ nhớ của nó và I/O để cho phép thiết bị khác xử lý Phạm Hùng Kim Khánh Trang 24
  30. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý bus hệ thống. Quá trình này gọi là truy xuất bộ nhớ trực tiếp (DMA – Direct Memory Access). - HLDA (Hold acknowledge): ghi nhận yêu cầu DMA đối với bộ điều khiển DMA. Chế độ tối đa: - RQ / GT0, RQ / GT1 (Request / Grant): các chân này dùng cả hai chức năng vào (nhận yêu cầu) và ra (chấp nhận yêu cầu). Khi một thiết bị muốn lấy điều khiển của bus cục bộ, nó sẽ phát yêu cầu bằng cách đưa tín hiệu mức thấp vào chân yêu cầu. Sau khi nhận yêu cầu, 8086 sẽ ở trạng thái HOLD và gởi tín hiệu chấp nhận ra chân này. Ở đây, chân RQ / GT0 có độ ưu tiên cao hơn chân RQ / GT1. - LOCK : báo cho các thiết bị khác biết không thể lấy điều khiển của bus cục bộ. ™ Các chân ngắt (NMI, INTR và INTA): INTR và NMI là các yêu cầu ngắt khởi động bằng phần cứng, làm việc chính xác như các ngắt mềm. NMI (Non-Maskable Interrupt) là ngõ vào tác động cạnh lên. NMI là ngắt không thể che được và luôn được phục vụ, thường dùng cho các sự kiện như hư nguồn hay các lỗi bộ nhớ. INTR tác động mức cao và có thể bị che bằng cách xoá cờ IF trong thanh ghi cờ (xem 2.3.4) bằng lệnh CLI. Khi NMI tích cực, điều khiển sẽ được chuyển đến địa chỉ chứa trong các vị trí 00008h ÷ 0000Bh. Khi INTR tích cực, chu kỳ ghi nhận ngắt (interrupt acknowledge cycle) được thực hiện. Quá trình này giống như chu kỳ đọc bộ nhớ ngoại trừ INTA tích cực thay vì RD . Thiết bị tạo ngắt sẽ đặt một giá trị 8 bit vào data bus và chuyển điều khiển đến vị trí giá trị × 4 đến giá trị × 4 + 3. ™ Chân RESET: hoạt động khi có xung tác động mức cao, dùng để khởi động lại (P. Sau khi khởi động, (P sẽ đọc lệnh tại địa chỉ FFFF0h. RESET được sử dụng khi hệ thống có sự cố. ™ Các chân điều khiển bus (READY, RD, ALE, DEN , DT/ R, WR và IO/ M ): Trong các chân điều khiển này, chỉ có hai chân READY và RD làm việc ở chế độ tối đa. - Chân READY: ngõ vào READY được lấy mẫu ở cạnh lên của xung nhịp T2. Nếu chân này ở mức thấp (không sẵn sàng) thì sẽ thêm vào một chu kỳ T3 nữa. Chu trình này sẽ tiếp tục cho đến khi nào chân READY lên mức cao. Ngõ vào này thường được điều khiển bởi thiết bị bộ nhớ chậm, không thể cung cấp dữ liệu kịp thời cho μP. Phạm Hùng Kim Khánh Trang 25
  31. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý - Chân IO/ M (IO/Memory – Xuất nhập /Bộ nhớ): xác định chu kỳ bus hiện hành làm việc với bộ nhớ (mức thấp) hay I/O (mức cao). - Chân RD (Read): tín hiệu tác động mức thấp chỉ chiều truyền dữ liệu từ bộ nhớ hay I/O đến μP. Ta có thể kết hợp với tín hiệu này với IO/ M để tạo các tín hiệu MEMR và IOR . Nó được xuất ra trong trạng thái T2 và lấy đi trong trạng thái T4. Thiết bị bộ nhớ hay I/O giả sử là đã đặt byte hay word vào các đường dữ liệu khi RD trở về mức cao. - Chân WR (Write): tín hiệu này ngược với RD , nó xác định chiều truyền dữ liệu từ μP đến I/O hay bộ nhớ. RD 1 2 1 MEMR 3 2 1 IOR 3 2 IO/ M 1 2 1 3 IOW 2 1 MEMW 3 WR 1 2 2 Hình 1.21 – Tạo tín hiệu điều khiển bộ nhớ và I/O - Chân ALE (Address Latch Enable - cho phép chốt địa chỉ): tín hiệu ra trên chân này có thể dùng để phân kênh các đường địa chỉ, dữ liệu và trạng thái trên AD0 ÷ AD15, A16/S3 ÷ A19/S6 và BHE /S7. Mọi chu kỳ bắt đầu với xung ALE trong trạng thái T1. Địa chỉ 20 bit được bảo đảm sẽ hợp lệ khi ALE chuyển từ mức cao xuống mức thấp. - Chân DEN (Data Enable – cho phép dữ liệu): tín hiệu này được dùng với DT/ R để cho phép nối các bộ đệm hai chiều vào data bus. Nó ngăn ngừa sự tranh chấp bus bằng cách cấm các bộ đệm dữ liệu cho đến trạng thái T2 khi các đường dữ liệu / địa chỉ không còn lưu trữ địa chỉ của bộ nhớ hay I/O. - Chân DT/ R (Data transmit/receive – truyền/nhận dữ liệu): dùng để điều khiển chiều của luồng dữ liệu qua các bộ đệm (nếu có) vào bus dữ liệu của hệ thống. Khi ở mức thấp, nó chỉ thực hiện tác vụ đọc và khi ở mức cao nó chỉ thực hiện tác vụ ghi. Phạm Hùng Kim Khánh Trang 26
  32. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý T1 T2 T3 T4 Clk ALE IO/ M Địa chỉ / BHE S3 ÷ S7 trạng thái A16 ÷ A19, Dữ liệu vào AD0 ÷ AD15 A0 ÷ A15 D0 ÷ D15 Chu kỳ RD đọc DT/ R DEN AD0 ÷ AD15 A0 ÷ A15 Döõ lieäu ra D0 ÷ D15 Chu kỳ RD ghi DT/ R DEN Hình 1.22 – Các chu kỳ đọc và ghi của 8086 ™ Các chân trạng thái (AD16/S3 ÷ AD19/S6 và BHE /S7): 5 tín hiệu trạng thái này được xuất ra trong các trạng thái T2 ÷ T4, dùng cho các mục đích kiểm tra. Bit S7 là bit trạng thái dư (không dùng), bit S6 luôn bằng 0, S5 mô tả trạng thái của cờ ngắt IF còn S3, S4 dùng để xác định đoạn đang sử dụng: Bảng 1.10: S4 S3 Đoạn 0 0 Thêm 0 1 Stack 1 0 Mã (hay không) 1 1 Dữ liệu Phạm Hùng Kim Khánh Trang 27
  33. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý Tín hiệu BHE /S7 (Bus High Enable) chỉ được xuất trong trạng thái T1. Khi chân này ở mức thấp, nó sẽ chỉ AD8 ÷ AD15 liên quan đến việc truyền dữ liệu. Quá trình này có thể xảy ra đối với các truy xuất bộ nhớ, I/O hay truy xuất 1 byte dữ liệu từ địa chỉ lẻ. ™ Bus dữ liệu (AD0 ÷ AD15): 16 chân này tạo thành bus dữ liệu hai chiều. Các đường này chỉ hợp lệ trong các trạng thái T2 ÷ T4. Trong trạng thái T1, chúng giữ 16 bit thấp của địa chỉ bộ nhớ hoặc I/O. ™ Bus địa chỉ (AD0 ÷ AD15 và AD16/S3 ÷ AD19/S6): 20 chân này tương ứng với bus địa chỉ 20 bit và cho phép μP truy xuất 1 MB vị trí bộ nhớ. Các đường ra này chỉ hợp lệ trong trạng thái T1, chuyển thành các đường dữ liệu và trạng thái trong trạng thái T2 ÷ T4. ™ Chọn chế độ MX : Chân này dùng để chọn chế độ hoạt động cho 8086, nếu ở mức cao thì sẽ hoạt động ở chế độ tối thiểu còn ở mức thấp thì sẽ hoạt động ở chế độ tối đa. 5.3. Kiến trúc nội μP có khả năng thực hiện các tác vụ dữ liệu theo tập lệnh bên trong. Một lệnh được ghi nhận bằng mã đã được định nghĩa trước, gọi là mã lệnh (opcode). Trước khi thực thi một lệnh, μP phải nhận được mã lệnh từ bộ nhớ chương trình của nó. Quá trình xử lý này gọi là chu kỳ nhận lệnh (fetch cycle). Một khi các mã được nhận và được giải mã thì mạch bên trong μP có thể tiến hành thực thi (execute) mã lệnh. BIU EU ← Hàng lệnh ← Bus hệ thống Hình 1.23 – Kiến trúc nội của μP 8086 BIU (Bus Interface Unit – đơn vị giao tiếp bus) nhận các mã lệnh từ bộ nhớ và đặt chúng vào hàng chờ lệnh. EU (Execute Unit – đơn vị thực thi) sẽ giải mã và thực hiện các lệnh trong hàng. Chú ý rằng các đơn vị EU và BIU làm việc độc lập với nhau nên BIU có khả năng đang nhận một lệnh mới trong khi EU dang thực thi lệnh trước đó. Khi EU đã thực hiện xong lệnh, nó sẽ lấy mã lệnh kế tiếp trong hàng đợi lệnh (instruction queue). Phạm Hùng Kim Khánh Trang 28
  34. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý Kiến trúc nội của μP 8086 ở hình 1.24. Nó có 2 bộ xử lý riêng: BIU và EU. BIU cung cấp các chức năng phần cứng, bao gồm tạo các địa chỉ bộ nhớ và I/O để chuyển dữ liệu giữa EU và bên ngoài μP. BIU EU Điều khiển bus và sinh địa chỉ Σ AH AL 5 BH BL 4 CH CL 3 DH DL CS 2 BP ES 1 DI SS SI DS SP IP Internal bus Thanh ghi cờ ALU Hình 1.24 – Kiến trúc nội của 8086 EU nhận các mã lệnh chương trình và dữ liệu từ BIU, thực thi các lệnh này và chứa các kết quả trong các thanh ghi. Ngoài ra, dữ liệu cũng có thể chứa trong một vị trí bộ nhớ hay được ghi vào thiết bị xuất. Chú ý rằng EU không có bus hệ thống nên phải thực hiện nhận và xuất tất cả các dữ liệu của nó thông qua BIU. Phạm Hùng Kim Khánh Trang 29
  35. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý Sự khác biệt giữa μP 8086 và 8088 là BIU. Trong 8088, đường bus dữ liệu là 8 bit trong khi của 8086 là 16 bit. Ngoài ra hàng lệnh của 8088 dài 4 byte trong khi của 8086 là 6 byte. Tuy nhiên do EU giữa hai loại μP này giống nhau nên các chương trình viết cho 8086 có thể chạy được trên 8088 mà không cần thay đổi gì cả. 5.4. Các thanh ghi μP 8086/8088 có tất cả 14 thanh ghi nội. Các thanh ghi này có thể phân loại như sau: - Thanh ghi dữ liệu (data register) - Thanh ghi chỉ số và con trỏ (index & pointer register) - Thanh ghi đoạn (segment register) - Thanh ghi trạng thái và điều khiển (status & control register) 5.4.1. Các thanh ghi dữ liệu Các thanh ghi dữ liệu gồm có các thanh ghi 16 bit AX, BX, CX và DX trong đó nửa cao và nửa thấp của mỗi thanh ghi có thể định địa chỉ một cách độc lập. Các nửa thanh ghi này (8 bit) có tên là AH và AL, BH và BL, CH và CL, DH và DL. Các thanh ghi này được sử dụng trong các phép toán số học và logic hay trong quá trình chuyển dữ liệu. Bảng 1.11: Thanh ghi Sử dụng trong AX MUL, IMUL (toán hạng nguồn kích thước word) DIV, IDIV (toán hạng nguồn kích thước word) IN (nhập word) OUT (xuất word) CWD Các phép toán xử lý chuỗi (string) AL MUL, IMUL (toán hạng nguồn kích thước byte) DIV, IDIV (toán hạng nguồn kích thước byte) IN (nhập byte) OUT (xuất byte) XLAT AAA, AAD, AAM, AAS (các phép toán ASCII) CBW (đổi sang word) DAA, DAS (số thập phân) Các phép toán xử lý chuỗi (string) AH MUL, IMUL (toán hạng nguồn kích thước byte) DIV, IDIV (toán hạng nguồn kích thước byte) CBW (đổi sang word) BX XLAT CX LOOP, LOOPE, LOOPNE Các phép toán string với tiếp dầu ngữ REP Phạm Hùng Kim Khánh Trang 30
  36. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý CL RCR, RCL, ROR, ROL (quay với số đếm byte) SHR, SAR, SAL (dịch với số đếm byte) DX MUL, IMUL (toán hạng nguồn kích thước word) DIV, IDIV (toán hạng nguồn kích thước word) AX (ACC – Accumulator): thanh ghi tích luỹ BX (Base): thanh ghi cơ sở CX (Count): đếm DX (Data): thanh ghi dữ liệu 5.4.2. Các thanh ghi chỉ số và con trỏ Bao gồm các thanh ghi 16 bit SP, BP, SI và DI, thường chứa các giá trị offset (độ lệch) cho các phần tử định địa chỉ trong một phân đoạn (segment). Chúng có thể được sử dụng trong các phép toán số học và logic. Hai thanh ghi con trỏ (SP – Stack Pointer và BP – Base Pointer) cho phép truy xuất dễ dàng đến các phần tử đang ở trong ngăn xếp (stack) hiện hành. Các thanh ghi chỉ số (SI – Source Index và DI – Destination Index) được dùng để truy xuất các phần tử trong các đoạn dữ liệu và doạn thêm (extra segment). Thông thường, các thanh ghi con trỏ liên hệ đến đoạn stack hiện hành và các thanh ghi chỉ số liên hệ đến doạn dữ liệu hiện hành. SI và DI dùng trong các phép toán chuỗi. 5.4.3. Các thanh ghi đoạn Bao gồm các thanh ghi 16 bit CS (Code segment), DS (Data segment), SS (stack segment) và ES (extra segment), dùng để định địa chỉ vùng nhớ 1 MB bằng cách chia thành 16 đoạn 64 KB. Tất cả các lệnh phải ở trong đoạn mã hiện hành, được định địa chỉ thông qua thanh ghi CS. Offset (độ lệch) của mã được xác định bằng thanh ghi IP. Dữ liệu chương trình thường được đặt ở đoạn dữ liệu, định vị thông qua thanh ghi DS. Stack định vị thông qua thanh ghi SS. Thanh ghi đoạn thêm có thể sử dụng để định địa chỉ các toán hạng, dữ liệu, bộ nhớ và các phần tử khác ngoài đoạn dữ liệu và stack hiện hành. 5.4.4. Các thanh ghi điều khiển và trạng thái Thanh ghi con trỏ lệnh IP (Instruction Pointer) giống như bộ đếm chương trình (Program Counter). Thanh ghi điều khiển này do BIU quản lý nhằm lưu trữ offset từ bắt đầu đoạn mã đến lệnh thực thi kế tiếp. Ta không thể xử lý trực tiếp trên thanh ghi IP. Thanh ghi cờ (Flag register) hay từ trạng thái 16 bit chứa 3 bit điều khiển (TF, IF và DF) và 6 bit trạng thái (OF, SF, ZF, AF, PF và CF) còn các bit còn lại mà 8086/8088 không sử dụng thì không thể truy xuất được. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 X X X X OF DF IF TF SF ZF X AF X PF X CF Phạm Hùng Kim Khánh Trang 31
  37. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý - OF (Overflow - tràn): OF = 1 xác định tràn số học, xảy ra khi kết quả vượt ra ngoài phạm vi biểu diễn - DF (Direction- hướng): xác định hướng chuyển string, DF = 1 khi μP làm việc với string theo thứ tự từ phải sang trái. - IF (Interrupt - ngắt): cho phép hay cấm các interrupt có mặt nạ - TF (Trap - bẫy): đặt μP vào chế độ từng bước, dùng cho các chương trình gỡ rối (debugger). - SF (Sign - dấu): dùng để chỉ các kết quả số học là số dương (SF = 0) hay âm (SF = 1). - ZF (Zero): = 1 nếu kết quả của phép toán trước là 0. - AF (Auxiliary – nhớ phụ): dùng trong các số thập phân để chỉ nhớ từ nửa byte thấp hay mượn từ nửa byte cao. - PF (Parity): PF = 1 nếu kết quả của phép toán là có tổng số bit 1 là chẵn (dùng để kiểm tra lỗi truyền dữ liệu) - CF (Carry): CF = 1 nếu có nhớ hay mượn từ bit cao nhất của kết quả. Cờ này cũng dùng cho các lệnh quay. 6. Phân đoạn bộ nhớ Ta biết rằng dù 8086 là μP 16 bit (có bus dữ liệu 16 bit) nhưng vẫn dùng bộ nhớ theo các byte. Điều này cho phép μP làm việc với byte cũng như word, nó rất quan trọng trong giao tiếp với các thiết bị I/O như máy in, thiết bị đầu cuối và modem (chúng được thiết kế để chuyển dữ liệu mã hoá ASCII 7 hay 8 bit). Ngoài ra, nhiều mã lệnh của 8086/8088 có chiều dài 1 byte nên cần phải truy xuất được các byte riêng biệt để có thể xử lý các lệnh này. 8086/8088 có bus địa chỉ 20 bit nên có thể cho phép truy xuất 220 = 1048576 địa chỉ bộ nhớ khác nhau. Byte 1048575 Word 524287 Byte 1048574 Byte 1 Word 0 Byte 0 Hình 1.25 – Vùng nhớ của 8086/8088 có 1048576 byte hay 524288 word Để thực hiện đọc 16 bit từ bộ nhớ, 8086 sẽ thực hiện đọc đồng thời byte có địa chỉ lẻ và byte có địa chỉ chẵn. Do đó, 8086 tổ chức bộ nhớ thành các bank chẵn và lẻ. Theo hình 1.25, ta có thể thấy rằng các word luôn bắt đầu tại địa chỉ chẵn nhưng ta vẫn Phạm Hùng Kim Khánh Trang 32
  38. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý có thể đọc word có địa chỉ lẻ bằng cách thực hiện 2 chu kỳ đọc bộ nhớ: một chu kỳ đọc byte thấp và một chu kỳ đọc byte cao. Điều này sẽ làm chậm tốc độ xử lý. Đối với 8088 thì do bus dữ liệu 8 bit nên dù word có địa chỉ chẵn hay lẻ, nó cũng cần phải thực hiện 2 chu kỳ đọc hay ghi bộ nhớ và giao tiếp với bộ nhớ như một bank. Byte 1048574 Byte 1048575 Byte 1048575 Byte 1048572 Byte 1048573 Byte 1048574 Byte 2 Byte 3 Byte 3 Byte 0 Byte 1 Byte 2 Đọc lần 2 Byte 1 Đọc lần 1 Byte 0 Word dữ liệu 16 bit Hình 1.26 – Đọc word địa chỉ chẵn và địa chỉ lẻ Ngoài ra bộ nhớ cũng chia thành 16 khối, mỗi khối có kích thước 64 KB, bắt đầu ở địa chỉ 00000h và kết thúc ở FFFFFh. Địa chỉ bắt đầu mỗi khối sẽ tăng lên 1 ở số hex có ý nghĩa nhiều nhất khi thay đổi từ khối này sang khối kia. Ví dụ như khối 00000h → 10000h → 20000h FFFFFh FFFFFh Dự trữ FFFFBh F0000h Dành riêng FFFF0h 0007Fh Dự trữ 20000h 10000h 00013h Dành riêng 00000h 00000h Hình 1.27 – Bảng bộ nhớ cho 8086/8088 Phạm Hùng Kim Khánh Trang 33
  39. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý ™ Các thanh ghi phân đoạn: 8086/8088 định nghĩa 4 khối bộ nhớ 64KB: đoạn mã (code segment) giữ các mã lệnh chương trình, đoạn ngăn xếp (stack segment) lưu các địa chỉ sẽ trả về từ các chương trình con (subroutine) hay trình phục vụ ngắt (interrupt subroutine), đoạn dữ liệu (data segment) lưu trữ dữ liệu cho chương trình và đoạn thêm (extra segment) thường dùng cho các dữ liệu dùng chung. Các thanh ghi đoạn (CS, DS, SS và ES) dùng để chỉ vị trí nền của mỗi đoạn. Các thanh ghi này có 16 bit trong khi địa chỉ bộ nhớ là 20 bit nên để xác dịnh vị trí bộ nhớ, ta sẽ thêm 4 bit 0 vào các bit thấp của thanh ghi đoạn. Giả sử như thanh ghi CS chứa giá trị 1111h thì nó sẽ chỉ tới địa chỉ nền là 11110h. Chú ý rằng địa chỉ bắt đầu một đoạn không thể tuỳ ý mà phải bắt đầu tại một địa chỉ chia hết cho 16. Nghĩa là 4 bit thấp phải là 0. Ta cũng chú ý rằng 4 đoạn có thể không tách rời nhau mà chồng lấp lên nhau và ta cũng có thể cho 4 giá trị của các thanh ghi đoạn bằng nhau nghĩa là 4 đoạn này trùng nhau. VD: Thanh ghi DS có giá trị là 1000h thì địa chỉ nền là 10000h. Địa chỉ kết thúc tìm được bằng cách cộng địa chỉ nền với giá trị FFFFh (64K) → địa chỉ kết thúc là 10000h + FFFFh = 1FFFFh. Như vậy đoạn dữ liệu có địa chỉ từ 10000h = 1FFFFh. Các vị trí bộ nhớ không được định nghĩa trong các đoạn hiện hành không thể truy xuất được. Muốn truy xuất đến các vị trí đó, ta phải định nghĩa lại một trong các thanh ghi đoạn sau cho đoạn phải chứa vị trí đó. Như vậy, tại một thời điểm bất kỳ ta chỉ có thể truy xuất tối đa 4 × 64 KB = 256 KB bộ nhớ. Nội dung của các thanh ghi đoạn chỉ có thể xác định thông qua phần mềm. VD: Giả sử các thanh ghi đoạn có các giá trị CS = 2800h, DS = E000h, SS = 2900h và ES = 1000h. Ta có vị trí các đoạn trong bảng bộ nhớ như sau: EFFFFh Đoạn dữ liệu E0000h 38FFFh Đoạn stack 29000h ÷ 38FFFh 37FFFh 29000h Đoạn mã 28000h ÷ 37FFFh 28000h 1FFFFh Đoạn thêm 10000h Hình 1.28 – Vị trí các phân đoạn theo giá trị các thanh ghi đoạn Phạm Hùng Kim Khánh Trang 34
  40. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý ™ Địa chỉ logic và địa chỉ vật lý: Các địa chỉ trong một đoạn thay đổi từ 0000h ÷ FFFFh, tương ứng với chiều dài đoạn là 64 KB. Một địa chỉ trong một đoạn được gọi là địa chỉ logic hay offset. Ví dụ như địa chỉ logic 0010h của đoạn mã trong hình 1.28 sẽ có địa chỉ thật sự là 28000h + 0010h = 28010h. Địa chỉ này gọi là địa chỉ vật lý. Như vậy, địa chỉ vật lý chính là địa chỉ thật sự xuất hiện ở bus địa chỉ, nó có chiều dài 20 bit còn địa chỉ logic là độ lệch (offset) từ vị trí 0 của một đoạn cho trước. VD: Giả sử xét các đoạn như hình 1.28. Địa chỉ vật lý tương ứng với địa chỉ logic 1000h trong đoạn stack là: 29000h + 1000h = 2A000h Địa chỉ vật lý tương ứng với địa chỉ logic 2000h trong đoạn mã là: 28000h + 2000h = 2A000h Ta thấy rằng có thể địa chỉ vật lý trùng nhau khi địa chỉ logic khác nhau nghĩa là một địa chỉ vật lý có thể có nhiều địa chỉ logic khác nhau. Để chỉ địa chỉ logic 1000h trong đoạn mã, ta dùng ký hiệu CS:1000h. Tương tự như vậy cho các đoạn khác, nghĩa là địa chỉ logic 1111h trong đoạn dữ liệu sẽ là DS:1111h. Mọi lệnh tham chiếu bộ nhớ sẽ có một thanh ghi đoạn mặc nhiên. Thanh ghi IP cung cấp địa chỉ offset khi truy xuất đến đoạn mã và BP cho đoạn stack. Ví dụ như IP = 1000h và CS = 2000h thì BIU sẽ truy xuất đến địa chỉ 20000h + 1000h = 21000h và nhận byte tại vị trí này. Bảng 1.12: Tham chiếu bộ nhớ Đoạn mặc nhiên Đoạn khác Offset Nhận lệnh CS Không IP Tác vụ stack SS Không SP Dữ liệu tổng quát DS CS,ES,SS Địa chỉ hiệu dụng Nguồn của string DS CS,ES,SS SI Đích của string ES Không DI BX dùng làm con trỏ DS CS,ES,SS Địa chỉ hiệu dụng BP dùng làm con trỏ SS CS,ES,SS Địa chỉ hiệu dụng VD: Ta sử dụng lệnh MOV [BP],AL với BP = 2C00h. Ở đây BP dùng làm con trỏ nên dùng đoạn stack. Giả sử các phân đoạn như hình 2.11 thì địa chỉ vật lý sẽ là 29000h + 2C00h = 2BC00h ™ Định nghĩa các vị trí bộ nhớ: Thông thường ít khi nào ta cần biết đến địa chỉ vật lý của một vị trí bộ nhớ mà ta chỉ quan tâm đến địa chỉ logic của nó mà thôi. Lý do là vì địa chỉ vật lý còn phải phụ thuộc vào nội dung của các thanh ghi đoạn ngay cả khi địa chỉ logic giữ không đổi như đã xét ở trên. Phạm Hùng Kim Khánh Trang 35
  41. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 7. Các cách định địa chỉ Bảng 1.13: Cách định Mã đối Ví dụ địa chỉ tượng Từ gợi nhớ Đoạn Hoạt động Mô tả truy xuất Tức thời B80010 MOV AX,1000h Mã AH ← 10h (1) AL ← 00h Thanh ghi 8BD1 MOV DX,CX Trong μPDX ← CX (2) Trực tiếp 8A260010 MOV AH,[1000h] Döõ AH ← [1000h] (3) lieäu Gián tiếp 8B04 MOV AX,[SI] Dữ liệu AL ← [SI]; AH ←[SI+1] (4) thanh ghi FF25 JMP [DI] Dữ liệu IP←[DI+1:DI] FE4600 INC BYTE PTR [BP] Stack [BP]←[BP]+1 FF0F DEC WORD PTR [BX] Dữ liệu [BX+1:BX]← [BX+1:BX]-1 Có chỉ số 8B4406 MOV AX,[SI+6] Dữ liệu AL ← [SI+6]; AH ←[SI+7] (5) FF6506 JMP [DI+6] Dữ liệu IP←[DI+7:DI+6] Có nền 8B4602 MOV AX,[BP+2] Stack AL←[BP+2]; AH ←[BP+3] (6) FF6702 JMP [BP+2] Dữ liệu IP←[BX+3:BX+6] Có nền và 8B00 MOV AX,[BX+SI] Dữ liệu AL←[BX+SI];AH←[BX+SI+1] (7) có chỉ số FF21 JMP [BX+DI] Dữ liệu IP←[BX+DI+1:BX+DI] FE02 INC BYTE PTR [BP+SI] Stack [BP+SI]←[BP+SI]+1 FF0B DEC WORD PTR [BP+DI] Stack [BP+DI+1:BP+DI]← [BP+DI+1:BP+DI]-1 Có nền và 8B4005 MOV AX,[BX+SI+5] Dữ liệu AL←[BX+SI+5] (8) có chỉ số FF6105 AH←[BX+SI+1] với độ dời FE4205 JMP [BX+DI+5] Dữ liệu IP←[BX+DI+6:BX+DI+5] FF4B05 INC BYTE PTR [BP+SI+5] Stack [BP+SI+5]←[BP+SI+5]+1 DEC WORD PTR [BP+DI+5] Stack [BP+DI+6:BP+DI+5]← [BP+DI+6:BP+DI+5]-1 String A4 MOVSB Thêm, [ES:DI] ← [DS:DI] (9) dữ liệu Nếu DF = 0 thì SI ← SI + 1; DI ← DI + 1 Nếu DF = 1 thì SI ← SI - 1; DI ← DI - 1 - BYTE PTR và WORD PTR tránh lầm giữa truy xuất byte và word. - Độ dời được cộng vào thanh ghi con trỏ hay nền là số nhị phân dạng bù 2. - (1): nguồn dữ liệu trong lệnh - (2): đích và nguồn là các thanh ghi của μP - (3): địa chỉ bộ nhớ cung cấp trong lệnh - (4): địa chỉ bộ nhớ cung cấp trong thanh ghi con trỏ hay chỉ số - (5): địa chỉ bộ nhớ là tổng của thanh ghi chỉ số cộng với độ dời trong lệnh - (6): địa chỉ bộ nhớ là tổng của thanh ghi BX hay BP cộng với độ dời trong lệnh - (7): địa chỉ bộ nhớ là tổng của thanh ghi chỉ số và thanh ghi nền Phạm Hùng Kim Khánh Trang 36
  42. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý - (8): địa chỉ bộ nhớ là tổng của thanh ghi chỉ số, thanh ghi nền và độ dời trong lệnh - (9): địa chỉ nguồn bộ nhớ là thanh ghi SI trong đoạn dữ liệu và địa chỉ đích bộ nhớ là thanh ghi DI trong đoạn thêm 7.1. Định địa chỉ tức thời Các lệnh dùng cách định địa chỉ tức thời lấy dữ liệu trong lệnh làm một phần của lệnh. Trong cách này, dữ liệu sẽ được chứa trong đoạn mã thay vì trong đoạn dữ liệu. Dữ liệu cho lệnh MOV AX,1000h được cung cấp tức thời sau mã lệnh B8. Chú ý rằng trong mã đối tượng byte dữ liệu cao đi sau byte dữ liệu thấp. Cách định địa chỉ tức thời thường dùng để nạp một thanh ghi hay vị trí bộ nhớ với các dữ liệu ban đầu. Sau đó, các lệnh kế tiếp sẽ làm việc với các dữ liệu này. Tuy nhiên, cách định địa chỉ này không sử dụng được cho các thanh ghi đoạn. 7.2. Định địa chỉ thanh ghi Một số lệnh chỉ làm công việc chuyển dữ liệu giữa các thanh ghi của μP. Ví dụ như MOV DX,CX sẽ chuyển dữ liệu từ thanh ghi CX vào thanh ghi DX. Ở đây ta không cần thực hiện tham chiếu bộ nhớ. Ta có thể kết hợp cách định địa chỉ tức thời và định địa chỉ thanh ghi để nạp dữ liệu cho các thanh ghi đoạn. VD: MOV AX, 1000h MOV CS,AX Sau khi thực hiện 2 lệnh này, giá trị của thanh ghi CS sẽ là 1000h. 7.3. Định địa chỉ trực tiếp Ngoài 2 cách định địa chỉ trên, tất cả các cách định địa chỉ còn lại cho trong bảng 2.6 đều cần phải truy xuất đến bộ nhớ với ít nhất một toán hạng. Trong cách định địa chỉ trực tiếp, địa chỉ bộ nhớ được cung cấp trực tiếp như là một phần của lệnh. Ví dụ như lệnh MOV AH,[1000h] sẽ đưa nội dung chứa trong ô nhớ DS:1000h vào thanh ghi AH hay lệnh MOV [2000h],AX sẽ đưa nội dung chứa trong AX vào 2 ô nhớ liên tiếp DS:2000h và DS:2001h 7.4. Định địa chỉ truy xuất bộ nhớ gián tiếp Các cách định địa chỉ trực tiếp sẽ thuận lợi cho các truy xuất bộ nhớ không thường xuyên. Tuy nhiên, nếu một ô nhớ cần phải truy xuất nhiều lần trong một chương trình thì quá trình nhận địa chỉ (2 byte) sẽ phải thực hiện nhiều lần. Điều này sẽ không hiệu quả. Để giải quyết vấn đề này, ta thực hiện lưu trữ địa chỉ của ô nhớ cần truy xuất trong một thanh ghi con trỏ, chỉ số hay thanh ghi cơ sở (BX, BP, SI hay DI). Ngoài ra, Phạm Hùng Kim Khánh Trang 37
  43. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý ta có thể sử dụng độ dời bù 2 bằng cách cộng vào các thanh ghi để dời đi so với vị trí được các thanh ghi chỉ đến. Bảng 2.13: Cách định địa chỉ Địa chỉ hiệu dụng (EA – Effective Address) Độ dời Thanh ghi nền Thanh ghi chỉ số Gián tiếp thanh ghi Không BX hay BP Không Không Không SI hay DI Có chỉ số -128 ÷ 127 Không SI hay DI Có nền -128 ÷ 127 BX hay BP Không Có nền và chỉ số Không BX hay BP SI hay DI Có nền và chỉ số với độ dời -128 ÷ 127 BX hay BP SI hay DI Như vậy, một độ dời có thể được cộng vào thanh ghi nền và kết quả này được cộng tiếp vào thanh ghi chỉ số. Địa chỉ thu được gọi là địa chỉ hiệu dụng EA. Ngoài ra ta cũng có thể viết cách định địa chỉ gián tiếp như sau: MOV AX,table[SI] Trong đó table là nhãn gán cho một vị trí ô nhớ nào đó. Lệnh này sẽ truy xuất phần tử thứ SI trong dãy table (giả sử SI = 2 thì sẽ truy xuất phần tử thứ 2). Ta cũng có thể viết lệnh trên như sau: MOV AX,[table + SI] Chú ý rằng các đoạn mặc định cho các cách định địa chỉ gián tiếp là đoạn stack khi dùng BP, là đoạn dữ liệu khi dùng BX, SI hay DI. VD: Lệnh: MOV AH,10h thực hiện định địa chỉ tức thời MOV AX,[BP + 10] thực hiện định địa chỉ có nền MOV AH,[BP + SI] thực hiện định địa chỉ có nền và có chỉ số 7.5. Định địa chỉ chuỗi Chuỗi là một dãy liên tục các byte hay word lưu trữ trong bộ nhớ dưới dạng các ký tự ASCII. 8086/8088 có các lệnh dùng để xử lý chuỗi, các lệnh này sử dụng cặp thanh ghi DS:SI để chỉ nguồn chuỗi ký tự và ES:DI để chỉ đích chuỗi. Lệnh MOVSB sẽ chuyển byte dữ liệu nguồn đến vị trí đích trong đó SI và DI sẽ tăng hay giảm tuỳ theo giá trị của DF (xem 2.3.4 và bảng 2.13) Phạm Hùng Kim Khánh Trang 38
  44. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 7.6. Thay đổi thanh ghi đoạn mặc định Như đã nói ở phần trên, khi sử dụng các lệnh định địa chỉ thanh ghi, ta chỉ cần dùng các thanh ghi để xác định độ lệch còn các thanh ghi đoạn thì được hiểu mặc định. Ví dụ như ta dùng lệnh MOV AH,[BP] thì sẽ đưa dữ liệu tại ô nhớ SS:BP vào thanh ghi AH. Trong trường hợp không muốn dùng thanh ghi đoạn mặc định, ta có thể thay đổi bằng cách thêm tên thanh ghi đoạn vào để loại bỏ thanh ghi đoạn mặc định. Ví dụ lệnh MOV AH,CS:[BP] sẽ đưa dữ liệu tại CS:[BP] vào AH. Phạm Hùng Kim Khánh Trang 39
  45. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý BÀI TẬP CHƯƠNG 1 1. Cần bao nhiêu byte để tạo thành một word 32 bit? 2. Giả sử μP có tất cả 16 đường địa chỉ, hỏi nó có thể xử lý tất cả bao nhiêu địa chỉ? 3. Nếu một IC nhớ có dung lượng 1024 × 4 bits thì để tạo 2KB bộ nhớ phải cần bao nhiêu IC? Nếu một IC nhớ có dung lượng 256 × 1 bits thì để tạo 1KB bộ nhớ phải cần bao nhiêu IC? Nếu một IC nhớ có dung lượng 8K × 8 bits thì cần phải có bao nhiêu đường địa chỉ? 4. Giả sử một IC nhớ có dung lượng 8 KB bắt đầu tại địa chỉ 1000h trong bảng bộ nhớ. Xác định vùng địa chỉ của IC. 5. Ngõ nào của bộ giải mã 74LS138 sẽ tích cực (mức thấp) nếu dữ liệu ngõ vào từ A7 ÷ A0 = 11110111? Nếu muốn ngõ ra Y4 tích cực thì dữ liệu ngõ vào phải là bao nhiêu? A2 1 15 A3 2 A Y0 14 A4 3 B Y1 13 A7 C Y2 12 A6 1 Y3 11 A5 2 6 Y4 10 6 4 G1 Y5 9 A1 4 5 G2A Y6 7 A0 5 G2B Y7 74LS138 6. Xác định bảng bộ nhớ: 8 15 7 A0 D0 14 6 A1 D1 13 5 A2 D2 12 4 A3 D3 3 A4 2 A5 1 A6 19 A7 18 A8 A19 1 2 17 A9 A12 1 15 16 A10 A13 2 A Y0 14 A11 A18 1 A14 3 B Y1 13 9 3 C Y2 12 11 CS A17 2 Y3 11 WE 6 Y4 10 A16 1 4 G1 Y5 9 8 15 3 5 G2A Y6 7 7 A0 D0 14 A15 2 G2B Y7 6 A1 D1 13 74LS138 5 A2 D2 12 4 A3 D3 3 A4 2 A5 1 A6 19 A7 18 A8 17 A9 16 A10 A11 9 11 CS WE Phạm Hùng Kim Khánh Trang 40
  46. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý 7. Thiết kế mạch giải mã địa chỉ dùng 74LS138 và các cổng logic cho 4 ROM kích thước 8K × 8 bits, 2 RAM 4K × 8 bits và 1 ROM 16K x 8 bits dùng bus địa chỉ 20 bits (A0 ÷ A19). 8. Thiết kế bộ nhớ có dung lượng 16KB từ các bộ nhớ có dung lượng 2K x 4 bits. 9. Thiết kế mạch giải mã địa chỉ chọn chip theo vùng địa chỉ sau: CS0: 8000h – 9FFFh CS2: C000h - DFFFh CS1: A000h – BFFFh CS3: E000h – FFFFh 10. Tìm địa chỉ của các I/O port và các giá trị của các chân IOR , IOW khi thực hiện xuất dữ liệu ra Led và đọc bàn phím. D2 3 2 4 D0 Q0 5 D1 Q1 7 6 LED 8 D2 Q2 9 13 D3 Q3 12 14 D4 Q4 15 D5 Q5 17 16 D3 A17 A10 1 15 18 D6 Q6 19 2 A Y0 14 D7 Q7 A11 B Y1 A16 1 A12 3 13 1 LED 3 C Y2 12 11 OC 0 2 Y3 11 CLK A15 Y4 6 10 1 2 1 74LS374 A14 1 4 G1 Y5 9 3 3 5 G2A Y6 7 2 A13 2 G2B Y7 74LS138 1 IOW 1 2 3 2 Ñeán maõ hoaù phím IOR 1 2 11. Xác định dãy địa chỉ của các thiết bị: A13 1 15 ROM 4K x 8 A14 2 A Y0 14 A15 3 B Y1 13 C Y2 12 Y3 A16 1 11 ROM 8K x 8 3 6 Y4 10 G1 Y5 A17 2 4 9 5 G2A Y6 7 G2B Y7 RAM 2K x 8 A18 74LS138 A19 12. Xác định giá trị các cờ SF, ZF, AF và CF sau khi thực hiện các phép toán sau: a. 1000h - 1234h b. 1234h + 13FFh c. ABCDh + 1234h d. 2345h – 2345h 13. Xác định phương pháp định địa chỉ trong các lệnh sau: Phạm Hùng Kim Khánh Trang 41
  47. Giáo trình vi xử lý Tổ chức hệ thống vi xử lý a. MOV AH,DS:[SI] b. MOV AL,AH c. MOV DS:[BX+1],AX d. MOV AL,DS:[BX+SI] e. MOV CX,DS:[BX+SI+10] f. MOV DX,20h g. MOV DS:[10],CL Phạm Hùng Kim Khánh Trang 42
  48. Giáo trình vi xử lý Lập trình hợp ngữ CHƯƠNG 2: LẬP TRÌNH HỢP NGỮ 1. Các tập tin .EXE và .COM DOS chỉ có thể thi hành được các tập tin dạng .COM và .EXE. Tập tin .COM thường dùng để xây dựng cho các chương trình nhỏ còn .EXE dùng cho các chương trình lớn. 1.1. Tập tin .COM - Tập tin .COM chỉ có một đoạn nên kích thước tối đa của một tập tin loại này là 64 KB. - Tập tin .COM được nạp vào bộ nhớ và thực thi nhanh hơn tập tin .EXE nhưng chỉ áp dụng được cho các chương trình nhỏ. - Chỉ có thể gọi các chương trình con dạng near. Khi thực hiện tập tin .COM, DOS định vị bộ nhớ và tạo vùng nhớ dài 256 byte ở vị trí 0000h, vùng này gọi là PSP (Program Segment Prefix), nó sẽ chứa các thông tin cần thiết cho DOS. Sau đó, các mã lệnh trong tập tin sẽ được nạp vào sau PSP ở vị trí 100h và đưa giá trị 0 vào stack. Như vậy, kích thước tối đa thực sự của tập tin .COM là 64 KB – 256 byte PSP – 2 byte stack. Tất cả các thanh ghi đoạn đều chỉ đến PSP và thanh ghi con trỏ lệnh IP chỉ đến 100h, thanh ghi SP có giá trị 0FFFEh. 1.2. Tập tin .EXE - Nằm trong nhiều đoạn khác nhau, kích thước thông thường lớn hơn 64 KB. - Có thể gọi được các chương trình con dạng near hay far. - Tập tin .EXE chứa một header ở đầu tập tin để chứa các thông tin điều khiển cho tập tin. 2. Khung của một chương trình hợp ngữ Khung của một chương trình hợp ngữ có dạng như sau: TITLE Chương trình hợp ngữ .MODEL Kiểu kích thước bộ nhớ ; Khai báo quy mô sử ; dụng bộ nhớ .STACK Kích thước ; Khai báo dung lượng ; đoạn stack .DATA ; Khai báo đoạn dữ liệu msg DB 'Hello$' .CODE ; Khai báo đoạn mã main PROC CALL Subname ; Gọi chương trình con main ENDP Phạm Hùng Kim Khánh Trang 43
  49. Giáo trình vi xử lý Lập trình hợp ngữ Subname PROC ; Định nghĩa chương ; trình con RET Subname ENDP END main ™ Quy mô sử dụng bộ nhớ: Bảng 2.1: Loại Mô tả Tiny Mã lệnh và dữ liệunằmtrongmột đoạn Small Mã lệnh trong một đoạn, dữ liệu trong một đoạn Medium Mã lệnh không nằm trong một đoạn, dữ liệu trong một đoạn Compact Mã lệnh trong một đoạn, dữ liệu không nằmtrongmột đoạn Large Mã lệnh không nằm trong một đoạn, dữ liệu không nằm trong một đoạn và không có mảng nào lớn hơn 64KB Huge Mã lệnh không nằm trong một đoạn, dữ liệu không nằm trong một đoạn và các mảng có thể lớnhơn64KB Thông thường, các ứng dụng đơn giản chỉ đòi hỏi mã chương trình không quá 64 KB và dữ liệu cũng không lớn hơn 64 KB nên ta sử dụng ở dạng Small: .MODEL SMALL ™ Khai báo kích thước stack: Khai báo stack dùng để dành ra một vùng nhớ dùng làm stack (chủ yếu phục vụ cho chương trình con), thông thường ta chọn khoảng 256 byte là đủ để sử dụng (nếu không khai báo thì chương trình dịch tự động cho kích thước stack là 1 KB): .STACK 256 ™ Khai báo đoạn dữ liệu: Đoạn dữ liệu dùng để chứa các biến và hằng sử dụng trong chương trình. ™ Khai báo đoạn mã: Đoạn mã dùng chứa các mã lệnh của chương trình. Đoạn mã bắt đầu bằng một chương trình chính và có thể có các lệnh gọi chương trình con (CALL). Một chương trình chính hay chương trình con bắt đầu bằng lệnh PROC và kết thúc bằng lệnh ENDP (đây là các lệnh giả của chương trình dịch). Trong chương trình con, ta sử dụng thêm lệnh RET để trả về địa chỉ lệnh trước khi gọi chương trình con. Chương trình được kết thúc bằng lệnh END trong đó tên chương trình phía sau lệnh END sẽ xác định đó là chương trình chính. Nếu sau lệnh END không chỉ ra Phạm Hùng Kim Khánh Trang 44
  50. Giáo trình vi xử lý Lập trình hợp ngữ chương trình nào cả thì sẽ lấy chương trình con ở đàu đoạn mã làm chương trình chính. 3. Cú pháp của các lệnh trong chương trình hợp ngữ Một dòng lệnh trong chương trình hợp ngữ gồm có các trường (field) sau (không nhất thiết phải đầy đủ tất cả các trường): Tên Lệnh Toán hạng Chú thích A: MOV AH,10h ; Đưa giá trị 10h vào thanh ghi AH Main PROC Trường tên chứa nhãn, tên biến hay tên thủ tục. Các tên nhãn có thể chứa tối đa 31 ký tự, không chứa ký tự trắng (space) và không được bắt đầu bằng số (A: hay Main:). Các nhãn được kết thúc bằng dấu ':'. Trường lệnh chứa các lệnh sẽ thực hiện. Các lệnh này có thể là các lệnh thật (MOV) hay các lệnh giả (PROC). Các lệnh thật sẽ được dịch ra mã máy. Trường toán hạng chứa các toán hạng cần thiết cho lệnh (AH,10h). Trường chú thích phải được bắt đầu bằng dấu ';'. Trường này chỉ dùng cho người lập trình để ghi các lời giải thích cho chương trình. Chương trình dịch sẽ bỏ qua các lệnh nằm phía sau dấu ;. 3.1. Khai báo dữ liệu Khi khai báo dữ liệu trong chương trình, nếu sử dụng số nhị phân, ta phải dùng thêm chữ B ở cuối, nếu sử dụng số thập lục phân thì phải dùng chữ H ở cuối. Chú ý rằng đối với số thập lục phân, nếu bắt đầu bằng chữ A F thì phải thêm vào số 0 ở phía trước. Ví dụ: 1011b ; Số nhị phân 1011 ; Số thập phân 1011d ; Số thập phân 1011h ; Số thập lục phân 3.2. Khai báo biến Khai báo biến nhằm để chương trình dịch cung cấp một địa chỉ xác định trong bộ nhớ. Ta dùng các lệnh giả sau để định nghĩa các biến ứng với các kiểu dữ liệu khác nhau: DB (define byte), DW (define word) và DD (define double word). VD: A1 DB 1 ; Định nghĩa biến A1 dài 1 byte (chương ; trình dịch sẽ dùng 1 byte trong bộ nhớ để ; lưu trữ A1), trị ban đầu A1 = 1 A2 DB ? ; Biến A2 kiểu byte, không có giá trị gán Phạm Hùng Kim Khánh Trang 45
  51. Giáo trình vi xử lý Lập trình hợp ngữ ; ban đầu A3 DB 'A' ; Biến kiểu ký tự A4 DW 1 ; Định nghĩa biến A4 dài 2 byte, giá trị ban ; đầu A4 = 1, ta cũng có thể dùng dấu ? để ; xác định biến không cần khởi tạo giá trị ban đầu A5 DD 1 ; Biến A5 dài 4 byte A6 DB 1,2,3 ; Định nghĩa biến mảng (array) gồm có 3 ; phần tử, mỗi phần tử dài 1 byte (nghĩa là ; sẽ dùng 3 byte lưu trữ) với các giá trị ban ; đầu của các phần tử lần lượt là 1,2,3 A7 DB 10 DUP(0) ; Khai báo biến mảng gồm 10 phần tử, mỗi ; phần tử có chiều dài 1 byte với giá trị gán ; ban đầu là 0 A8 DB 10 DUP(?) ; Khai báo biến mảng gồm 10 phần tử, mỗi ; phần tử có chiều dài 1 byte, không cần ; gán giá trị ban đầu Ngoài ra ta có thể dùng các toán tử DUP lồng vào nhau khi khai báo biến mảng. Giả sử ta cần khai báo mảng A9 có các giá trị gán ban đầu 1,2,3,1,1,3,2,2,1,1,3,2,2. Ta có thể thực hiện như sau: A9 DB 1,2,3,1,1,3,2,2,1,1,3,2,2 Hay: A9 DB 1,2,3,2 DUP(1,1,3,2,2) Hay: A9 DB 1,2,3,2 DUP(2 DUP(1),3,2 DUP(2)) Đối với các biến có nhiều hơn 1 byte, byte thấp sẽ chứa ở ô nhớ có địa chỉ thấp và byte cao sẽ chứa ở ô nhớ có địa chỉ cao. VD: A10 DW 1234h Biến A10 giả sử bắt đầu lưu tại địa chỉ 1000h thì ô nhớ 1000h chứa giá trị 34h còn ô nhớ 1001h chứa giá trị 12h. Đối với biến kiểu chuỗi (string), thực chất là một mảng các ký tự, ta có thể khai báo như sau: A11 DB 'ABCD' Hay A11 DB 65h,66h,67h,68h Sau lệnh khai báo này thì ô nhớ 1000h (giả sử biến A11 lưu trữ tại địa chỉ 1000h) chứa 'A', 1001h chứa 'B', 1002h chứa 'C' và 1003h chứa 'D'. Phạm Hùng Kim Khánh Trang 46
  52. Giáo trình vi xử lý Lập trình hợp ngữ 3.3. Khai báo hằng Các hằng khai báo trong chương trình hợp ngữ bằng lệnh giả EQU để chương trình dễ hiểu hơn. Hằng có thể ở dạng số, ký tự hay chuỗi. VD: A12 EQU 10 A13 EQU 'AAA' Sau khi sử dụng khai báo này, nếu ta dùng lệnh: MOV AH,A12 thì AH = 10h A14 DB 'B',A13 thì khai báo chuỗi A14 với giá trị gán ban đầu là 'BAAA'. 4. Các toán tử trong hợp ngữ ™ Toán tử số học: Bảng 2.2: Toán tử Cú pháp Mô tả + +bt Số dương - -bt Số âm * bt1*bt2 Nhân / bt1/bt2 Chia mod bt1 mod bt2 Lấy phần dư + bt1 + bt2 Cộng - bt1 – bt2 Trừ shl bt shl n Dịch trái n bit shr btshr n Dịch phảinbit Trong đó bt, bt1, bt2 là các biểu thức hằng, n là số nguyên. VD: MOV AH,(8+1)*7/3 ; AH ← 21 MOV AH, 00010001b shr 2 ; AH ← 0000 0100b MOV AH,00010001b shl 2 ; AH ← 0100 0100b MOV AH,100 mod 3 ; AH ← 1 ™ Toán tử logic: Bao gồm các toán tử AND, OR, NOT, XOR VD: MOV AH,10 OR 4 AND 2 ; AH = 10 MOV AH, 0F0h AND 7Fh ; AH = 70h Phạm Hùng Kim Khánh Trang 47
  53. Giáo trình vi xử lý Lập trình hợp ngữ ™ Toán tử quan hệ: Các toán tử quan hệ so sánh 2 biểu thức, cho giá trị true (-1) nếu điều kiện thoả và false (0) nếu không thoả. Bảng 2.3: Toán tử Cú pháp Mô tả EQ bt1 EQ bt2 Bằng NE bt1 NE bt2 Không bằng LT bt1 LT bt2 Nhỏ hơn LE bt1 LE bt2 Nhỏ hơn hay bằng GT bt1 GT bt2 Lớn hơn GE bt1 GE bt2 Lớnhơnhaybằng ™ Các toán tử cung cấp thông tin: ¾ Toán tử SEG: SEG bt Toán tử SEG xác định địa chỉ đoạn của biểu thức bt. bt có thể là biến, nhãn, hay các toán hạng bộ nhớ. ¾ Toán tử OFFSET: OFFSET bt Toán tử OFFSET xác định địa chỉ offset của biểu thức bt. bt có thể là biến, nhãn, hay các toán hạng bộ nhớ. VD: MOV AX,SEG A ; Nạp địa chỉ đoạn và địa chỉ offset MOV DS,AX ; của biến A vào cặp thanh ghi MOV AX,OFFSET A ; DS:AX ¾ Toán tử chỉ số [ ]: (index operator) Toán tử chỉ số thường dùng với toán hạng trưc tiếp và gián tiếp. ¾ Toán tử (:) (segment override operator) Segment:bt Toán tử : quy định cách tính địa chỉ đối với segment được chỉ. Segment là các thanh ghi đoạn CS, DS, ES, SS. Chú ý rằng khi sử dụng toán tử : kết hợp với toán tử [ ] thì segment: phải đặt ngoài toán tử [ ]. VD: Cách viết [CS:BX] là sai, ta phải viết CS:[BX] Phạm Hùng Kim Khánh Trang 48
  54. Giáo trình vi xử lý Lập trình hợp ngữ ¾ Toán tử TYPE: TYPE bt Trả về giá trị biểu thị dạng của biểu thức bt. - Nếu bt là biến thì sẽ trả về 1 nếu biến có kiểu byte, 2 nếu biến có kiểu word, 4 nếu biến có kiểu double word. - Nếu bt là nhãn thì trả về 0FFFFh nếu bt là near và 0FFFEh nếu bt là far. - Nếu bt là hằng thì trả về 0. ¾ Toán tử LENGTH: LENGTH bt Trả về số đơn vị bộ nhớ cấp cho biến bt ¾ Toán tử SIZE: SIZE bt Trả về tổng số các byte cung cấp cho biến bt VD: A DD 100 DUP(?) MOV AX,LENGTH A ; AX = 100 MOV AX,SIZE A ; AX = 400 ™ Các toán tử thuộc tính: ¾ Toán tử PTR: Loai PTR bt Toán tử này cho phép thay đổi dạng của biểu thức bt. - Nếu bt là biến hay toán hạng bộ nhớ thì Loai là byte, word hay dword. - Nếu bt là nhãn thì Loai là near hay far. VD: A DW 100 DUP(?) B DD ? MOV AH,BYTE PTR A ; Đưa byte đầu tiên trong mảng A ; vào thanh ghi AH MOV AX,WORD PTR B ; Đưa 2 byte thấp trong biến B ; vào thanh ghi AX ¾ Toán tử HIGH, LOW: HIGH bt LOW bt Cho giá trị của byte cao và thấp của biểu thức bt, bt phải là một hằng. Phạm Hùng Kim Khánh Trang 49
  55. Giáo trình vi xử lý Lập trình hợp ngữ VD: A EQU 1234h MOV AH,HIGH A ; AH ← 12h MOV AH,LOW A ; AH ← 34h 5. Các cách định địa chỉ trong hợp ngữ ™ Toán hạng trực tiếp: Toán hạng trực tiếp là một biểu thức hằng xác định. Các hằng số có thể ở dạng thập phân (có dấu và không dấu), nhị phân, thập lục phân, các hằng số định nghĩa bằng lệnh EQU, VD: MOV AH,10 MOV AH,1010b MOV AH,0Ah MOV AH,A12 MOV AX,OFFSET msg MOV AX,SEG msg ™ Toán hạng thanh ghi: Các thanh ghi có thể sử dụng trong phép định địa chỉ thanh ghi là AH, BH, CH, DH, AL, BL, CL, DL, AX, BX, CX, DX, SP, BP, SI, DI, CS, DS, ES, SS. ™ Toán hạng bộ nhớ: ¾ Trực tiếp: Toán hạng này xác định dữ liệu lưu trong bộ nhớ tại một địa chỉ xác định khi dịch, địa chỉ này là một biểu thức hằng (có thể kết hợp với toán tử chỉ số [ ] hay toán tử +, -, :). Thanh ghi đoạn mặc định là thanh ghi DS nhưng ta có thể dùng toán tử : để chỉ thanh ghi đoạn khác. VD: A DW 1000h B DB 100 DUP(0) MOV AX,A ; Chuyển nội dung của biến A vào MOV AX,[A] ; thanh ghi AX MOV AH,B ; Truy xuất phần tử đầu tiên của MOV AH,B[0] ; mảng B MOV AH,B + 1 ; Truy xuất phần tử thứ hai của MOV AH,B[1] ; mảng B MOV AH,B + 5 ; Truy xuất phần tử thứ 6 của MOV AH,B[5] ; mảng B Chú ý rằng lệnh MOV AX,[1000h] sẽ chuyển giá trị 1000h vào thanh ghi AX. Nếu muốn chuyển nội dung tại ô nhớ 1000h vào thanh ghi AX thì phải dùng lệnh MOV AX,DS:[1000h] hay MOV AX,DS:1000h ¾ Gián tiếp: Toán hạng bộ nhớ gián tiếp cho phép dùng các thanh ghi BX, BP, SI, DI để chỉ các giá trị trong bộ nhớ. Phạm Hùng Kim Khánh Trang 50
  56. Giáo trình vi xử lý Lập trình hợp ngữ VD: MOV BX,2 MOV SI,3 MOV AH,B[BX] ; Chuyển phần tử thứ 3 của mảng B ; vào thanh ghi AH MOV AH,B[BX+1] ; Chuyển phần tử thứ 4 của mảng B MOV AH,B[BX]+1 ; vào thanh ghi AH (BX + 1 = 3) MOV AH,B[BX+SI] ; Chuyển phần tử thứ 6 của mảng B MOV AH,B[BX][SI] ; vào thanh ghi AH MOV AH,[B+BX+SI] ; BX + SI = 5 MOV AH,[B][BX][SI] MOV AH,B[BX+SI+5] ; Chuyển phần tử thứ 11 của mảng B MOV AH,B[BX][SI]+5 ; vào thanh ghi AH MOV AH,[B+BX+SI+5] ; BX + SI + 5 = 10 6. Tạo và thực thi chương trình hợp ngữ Ta có thể tạo và thực thi một chương trình hợp ngữ trên một máy PC theo các bước sau: - Dùng một chương trình soạn thảo văn bản không định dạng (như NC, Notepad, ) tạo một tập tin chứa chương trình hợp ngữ (gán phần mở rộng của tập tin này là .ASM, giả sử là TEMP.ASM). - Dùng chương trình TASM.EXE (Turbo Assembler) để dịch ra mã máy dạng .OBJ: TASM TEMP - Sau khi dịch xong, ta sẽ được file TEMP.OBJ chứa các mã máy của chương trình. Để chuyển thành file thực thi, ta dùng chương trình TLINK.EXE để chuyển thành tập tin .EXE: TLINK TEMP - Nếu tập tin thực thi ở dạng .COM thì ta dùng thêm chương trình EXE2BIN.EXE: EXE2BIN TEMP TEMP.COM 7. Tập lệnh hợp ngữ 7.1. Nhóm lệnh chuyển dữ liệu 7.1.1. Nhóm lệnh chuyển dữ liệu đa dụng ™ Lệnh MOV dst,src: chuyển nội dung toán hạng src vào toán hạng dst. Toán hạng nguồn src có thể là thanh ghi (reg), bộ nhớ (mem) hay giá trị tức thời (immed); toán hạng đích dst có thể là reg hay mem. Lệnh MOV có thể có các trường hợp sau: Reg8 ← reg8 MOV AL,AH Reg16 ← reg16 MOV AX,BX Mem8 ← reg8 MOV [BX],AL Reg8 ← mem8 MOV AL,[BX] Mem16 ← reg16 MOV [BX],AX Reg16 ← mem16 MOV AX,[BX] Reg8 ← immed8 MOV AL,04h Mem8 ← immed8 MOV mem[BX],01h Reg16 ← immed16 MOV AL,0F104h Phạm Hùng Kim Khánh Trang 51
  57. Giáo trình vi xử lý Lập trình hợp ngữ Mem16 ← immed16 MOV mem[BX],0101h SegReg ← reg16 MOV DS,AX SegReg ← mem16 MOV DS,mem Reg16 ← segreg MOV AX,DS Mem16 ← segreg MOV [BX],DS - Lệnh MOV không ảnh hưởng đến các cờ. - Không thể chuyển trực tiếp dữ liệu giữa hai ô nhớ mà phải thông qua một thanh ghi MOV AX,mem1 MOV mem2,AX - Không thể chuyển giá trị trực tiếp vào thanh ghi đoạn MOV AX,1010h MOV DS,AX - Không thể chuyển trực tiếp giữa 2 thanh ghi đoạn - Không thể dùng thanh ghi CS làm toán hạng đích ™ Lệnh XCHG dst,src: (Exchange) hoán chuyển nội dung 2 toán hạng. Toán hạng chỉ có thể là reg hay mem. - Lệnh XCHG không ảnh hưởng đến các cờ - Không thể dùng cho các thanh ghi đoạn ™ Lệnh PUSH src: cất nội dung một thanh ghi vào stack. Toán hạng chỉ có thể là reg16 ™ Lệnh POP dst: lấy dữ liệu 16 bit từ stack đưa vào toán hạng dst. Ta có thể dùng nhiều lệnh PUSH để cất dữ liệu vào stack nhưng khi dùng lệnh POP để lấy dữ liệu ra thì phải dùng theo thứ tự ngược lại. PUSH AX PUSH BX PUSH CX POP CX POP BX POP AX ™ Lệnh XLAT [src]: chuyển nội dung của ô nhớ 8 bit vào thanh ghi AL. Địa chỉ ô nhớ xác định bằng cặp thanh ghi DS:BX (nếu không chỉ ra src) hay src, địa chỉ offset chứa trong thanh ghi AL. Lệnh XLAT tương đương với các lệnh: MOV AH,0 MOV SI,AX Phạm Hùng Kim Khánh Trang 52
  58. Giáo trình vi xử lý Lập trình hợp ngữ MOV AL,[BX+SI] 7.1.2. Nhóm lệnh chuyển địa chỉ ™ Lệnh LEA reg16,mem16: (Load Effective Address) chuyển địa chỉ offset của toán hạng bộ nhớ vào thanh ghi reg16. Lệnh này sẽ tương đương với MOV reg16, OFFSET mem16 ™ Lệnh LDS reg16,mem32: (Load pointer using DS) chuyển nội dung bộ nhớ toán hạng mem32 vào cặp thanh ghi DS:reg16. Lệnh LDS AX,mem tương đương với: MOV AX,mem MOV BX,mem+2 MOV DS,BX ™ Lệnh LES reg16,mem32: (Load pointer using ES) giống như lệnh LDS nhưng dùng cho thanh ghi ES 7.1.3. Nhóm lệnh chuyển cờ hiệu ™ Lệnh LAHF: (Load AH from flag) chuyển các cờ SF, ZF, AF, PF và CF vào các bit 7,6,4,2 và 0 của thanh ghi AH (3 bit còn lại không đổi) ™ Lệnh SAHF: (Store AH into flag) chuyển các bit 7,6,4,2 và 0 của thanh ghi AH vào các cờ SF, ZF, AF, PF và CF. ™ Lệnh PUSHF: chuyển thanh ghi cờ vào stack ™ Lệnh POPF: lấy dữ liệu từ stack chuyển vào thanh ghi cờ 7.1.4. Nhóm lệnh chuyển dữ liệu qua cổng Mỗi I/O port giao tiếp với CPU sẽ có một địa chỉ 16 bit cho nó. CPU gởi hay nhận dữ liệu từ cổng bằng cách chỉ đến địa chỉ cổng đó. Tuỳ theo chức năng mà cổng có thể: chỉ đọc dữ liệu (input port), chỉ ghi dữ liệu (output port) hay có thể đọc và ghi dữ liệu (input/output port). ™ Lệnh IN: đọc dữ liệu từ cổng và đưa vào thanh ghi AL IN AL,port8 IN AL,DX Nếu địa chỉ port chỉ có 8 bit thì có thể đưa giá trị trực tiếp vào, nếu là 16 bit thì phải thông qua thanh ghi AX. ™ Lệnh OUT: ghi dữ liệu trong thanh ghi AL ra cổng OUT port8,AL OUT DX,AL VD: MOV AL,3 OUT 61h,AL ; Gởi giá trị 03h ra cổng 61h MOV AL,1 Phạm Hùng Kim Khánh Trang 53
  59. Giáo trình vi xử lý Lập trình hợp ngữ MOV DX,03F8h ; Xuất ra cổng máy in OUT DX,AL MOV DX,03F8h IN AL,DX ; Đọc dữ liệu từ cổng máy in 7.2. Nhóm lệnh chuyển điều khiển 7.2.1. Lệnh nhảy không điều kiện JMP JMP label JMP reg/mem Lệnh JMP dùng để chuyển điều khiển chương trình từ vị trí này sang vị trí khác (thay đổi nội dung cặp thanh ghi CS:IP). 7.2.2. Lệnh nhảy có điều kiện Lệnh nhảy có điều kiện chỉ sử dụng cho các nhãn nằm trong khoảng từ –127 đến 128 byte so với vị trí của lệnh. ™ Lệnh JA label: (Jump if Above) Nếu CF = 0 và ZF = 0 thì JMP label ™ Lệnh JAE label: (Jump if Above or Equal) Nếu CF = 0 thì JMP label ™ Lệnh JB label: (Jump if Below) Nếu CF = 1 thì JMP label ™ Lệnh JBE label: (Jump if Below or Equal) Nếu CF = 1 hoặc ZF = 1 thì JMP label ™ Lệnh JNA label: (Jump if Not Above) Giống lệnh JBE ™ Lệnh JNAE label: (Jump if Not Above or Equal) Giống lệnh JB ™ Lệnh JNB label: (Jump if Not Below) Giống lệnh JAE ™ Lệnh JNBE label: (Jump if Not Below or Equal) Giống lệnh JA ™ Lệnh JG label: (Jump if Greater) Nếu SF = OF và ZF = 0 thì JMP label ™ Lệnh JGE label: (Jump if Greater or Equal) Nếu SF = OF thì JMP label Phạm Hùng Kim Khánh Trang 54
  60. Giáo trình vi xử lý Lập trình hợp ngữ ™ Lệnh JL label: (Jump if Less) Nếu SF OF hoặc ZF = 1 thì JMP label ™ Lệnh JNG label: (Jump if Not Greater) Giống lệnh JLE ™ Lệnh JNGE label: (Jump if Not Greater or Equal) Giống lệnh JL ™ Lệnh JNL label: (Jump if Not Less) Giống lệnh JGE ™ Lệnh JNLE label: (Jump if Not Less or Equal) Giống lệnh JG ™ Lệnh JC label: (Jump if Carry) Giống lệnh JB ™ Lệnh JNC label: (Jump if Not Carry) Giống lệnh JNB ™ Lệnh JZ label: (Jump if Zero) Nếu ZF = 1 thì JMP label ™ Lệnh JE label: (Jump if Equal) Giống lệnh JZ ™ Lệnh JNZ label: (Jump if Not Zero) Nếu ZF = 0 thì JMP label ™ Lệnh JNE label: (Jump if Equal) Giống lệnh JNZ ™ Lệnh JS label: (Jump on Sign) Nếu SF = 1 thì JMP label ™ Lệnh JNS label: (Jump if No Sign) Nếu SF = 0 thì JMP label ™ Lệnh JO label: (Jump on Overflow) Nếu OF = 1 thì JMP label ™ Lệnh JNO label: (Jump if No Overflow) Nếu OF = 0 thì JMP label ™ Lệnh JP label: (Jump on Parity) Nếu PF = 1 thì JMP label Phạm Hùng Kim Khánh Trang 55
  61. Giáo trình vi xử lý Lập trình hợp ngữ ™ Lệnh JNP label: (Jump if No Parity) Nếu PF = 0 thì JMP label ™ Lệnh JCXZ label: (Jump if CX Zero) Nếu CX = 1 thì JMP label 7.2.3. Lệnh so sánh CMP left(reg/mem), right(reg/mem/immed) Lệnh CMP dùng để so sánh nội dung 2 toán hạng, kết quả chứa vào thanh ghi cờ và không làm thay đổi nội dung các toán hạng. VD: Đoạn chương trình so sánh 2 số A và B: A >B thì nhảy đến label1, A = B thì nhảy đến label2, A 0 thì JMP label ™ Lệnh LOOPE: LOOPE label Mô tả: CX = CX – 1 Nếu (ZF = 1) và (CX 0) thì JMP label ™ Lệnh LOOPNZ: Giống lệnh LOOPNE Phạm Hùng Kim Khánh Trang 56
  62. Giáo trình vi xử lý Lập trình hợp ngữ 7.2.5. Lệnh liên quan đến chương trình con ™ Lệnh CALL: Lệnh CALL dùng để gọi một chương trình con, có thể là near hay far. CALL label ; Gọi chương trình con tại vị trí xác định ; bởi nhãn label CALL reg/mem ; Gọi chương trình con tại vị trí xác định ; trong reg/mem ™ Lệnh RET: (return) RET [n] RETN [n] RETF [n] Lệnh RET dùng để kết thúc chương trình con, điều khiển sẽ được đưa về địa chỉ trước khi gọi chương trình con. RETN để kết thúc chương trình con dạng near và RETF dùng để kết thúc chương trình con dạng far. Trong trường hợp lệnh RET có hằng số n theo sau thì sẽ cộng với thanh ghi SP giá trị n (n phải là số chẵn). Lệnh này dùng để loại bỏ một số tham số chương trình con sử dụng ra khỏi stack. 7.3. Nhóm lệnh xử lý số học 7.3.1. Xử lý phép cộng ™ Lệnh ADD dst,src: dst ← dst + src Toán hạng src có thể là reg, mem hay immed còn toán hạng dst là reg hay mem. - Không thể cộng trực tiếp 2 thanh ghi đoạn - Lệnh ADD ảnh hưởng đến các cờ sau: + Cờ CF: = 1 khi kết quả phép cộng có nhớ hay có mượn + Cờ AF: = 1 khi kết quả phép cộng có nhớ hay có mượn đối với 4 bit thấp + Cờ PF: = 1 khi kết quả phép cộng có tổng 8 bit thấp là một số chẵn. + Cờ ZF: = 1 khi kết quả phép cộng là 0. + Cờ SF: = 1 nếu kết quả phép cộng là một số âm + Cờ OF: = 1 nếu kết quả phép cộng bị sai dấu, nghĩa là vượt ra ngoài phạm vi lớn nhất hay nhỏ nhất mà số có dấu có thể chứa trong toán hạng dst. ™ Lệnh ADC dst, src: (Add with Carry) dst ← dst + src + CF Lệnh ADC thường dùng để cộng các số lớn hơn 16 bit. Phạm Hùng Kim Khánh Trang 57
  63. Giáo trình vi xử lý Lập trình hợp ngữ ™ Lệnh INC dst: (Increment) dst ← dst + 1 Dst có thể là reg hay mem. ™ Lệnh AAA: (ASCII Adjust for Addition) Hiệu chỉnh kết quả phép cộng 2 số BCD dạng không nén (mỗi chữ số BCD lưu bằng 1 byte). VD: MOV AX,9 MOV BX,3 ADD AL,BL ; Kết quả là AX = 0Ch AAA ; AX = 0102h (AH = 1, AL = 2) Lệnh AAA chỉ ảnh hưởng đến các cờ AF và CF, không ảnh hưởng đến các cờ còn lại. ™ Lệnh DAA: (Decimal Adjust for Addition) Hiệu chỉnh kết quả phép cộng 2 số BCD dạng nén (mỗi chữ số BCD lưu bằng 4 bit, nghĩa là 1 byte biểu diễn được các số nguyên từ 0 đến 99). VD: MOV AX,4338h ADD AL,AH ; AX ← 437Bh DAA ; AX ← 4381h (43 + 38 = 81) Lệnh DAA chỉ ảnh hưởng đến các cờ AF, CF, PF, SF, ZF và không ảnh hưởng đến thanh ghi AH. 7.3.2. Xử lý phép trừ ™ Lệnh SUB dst,src: dst ← dst - src Toán hạng src có thể là reg, mem hay immed còn toán hạng dst chỉ có thể là reg hay mem. - Không thể trừ trực tiếp thanh ghi đoạn - Ảnh hưởng đến các cờ AF, CF, OF, PF, SF và ZF. ™ Lệnh SBB dst,src: dst ← dst – src – CF Lệnh ADC thường dùng để trừ các số lớn hơn 16 bit. ™ Lệnh DEC dst: (decrement) dst ← dst – 1 dst là reg hay mem. Lệnh DEC ảnh hưởng đến các cờ AF, OF, PF, SF, ZF. Phạm Hùng Kim Khánh Trang 58
  64. Giáo trình vi xử lý Lập trình hợp ngữ ™ Lệnh NEG dst: dst ← - dst dst là reg hay mem. Lệnh NEG ảnh hưởng đến các cờ: CF = 1 nếu nội dung kết quả là số khác 0. SF = 1 nếu nội dung kết quả là số âm khác 0. PF = 1 nếu tổng 8 bit thấp là một số chẵn. ZF = 1 nếu nội dung kết quả là 0. OF = 1 nếu nội dung toán hạng dst là 80h (dạng byte) hay 8000h (dạng word). VD: Nếu muốn thực hiện phép toán 100 – AH, ta không thể cùng lệnh: SUB 100,AH mà phải dùng lệnh: SUB AH,100 NEG AH ™ Lệnh AAS: (Ascii Adjust for Substract) Hiệu chỉnh kết quả phép trừ 2 số BCD dạng không nén (mỗi chữ số BCD lưu bằng 1 byte). Lệnh AAS chỉ ảnh hưởng cờ AF và CF. ™ Lệnh DAS: (Decimal Adjust for Substract) Hiệu chỉnh kết quả phép trừ 2 số BCD dạng nén (mỗi chữ số BCD lưu bằng 4 bit). Lệnh AAS chỉ ảnh hưởng cờ AF và CF. 7.3.3. Xử lý phép nhân ™ Lệnh MUL src: Nếu src là reg hay mem 8 bit: AX ← AL*src Nếu src là reg hay mem 16 bit: DX:AX ← AX*src Lệnh MUL chỉ ảnh hưởng đến cờ CF và OF. ™ Lệnh IMUL src: Giống như lệnh MUL nhưng kết quả là số có dấu. ™ Lệnh AAM: (Ascii Adjust for Multiple) Hiệu chỉnh kết quả phép nhân 2 số BCD dạng không nén, lệnh AAM thực hiện chia AL cho 10, lưu phần thương vào AL và phần dư vào AH. Lệnh AAM ảnh hưởng đến các cờ PF, SF và ZF. 7.3.4. Xử lý phép chia Phạm Hùng Kim Khánh Trang 59
  65. Giáo trình vi xử lý Lập trình hợp ngữ ™ Lệnh DIV src: Nếu src là reg/mem 8 bit: AL ← AX DIV src và AH ← AX MOD src Nếu src là reg/mem 16 bit: AX ← DX:AX DIV src và DX ← DX:AX MOD src Lệnh DIV không ảnh hưởng đến các cờ nhưng xảy ra tràn trong các trường hợp sau: - Chia cho 0 - Thương lớn hơn 256 đối với dạng 8 bit. - Thương lớn hơn 65536 đối với dạng 16 bit. ™ Lệnh IDIV src: Giống như lệnh DIV nhưng kết quả là số có dấu. Các trường hợp tràn: - Chia cho 0 - Thương nằm ngoài khoảng (-128,127) đối với dạng 8 bit. - Thương nằm ngoài khoảng (-32767,32768) đối với dạng 16 bit. ™ Lệnh AAD: (Ascii Adjust for Division) Hiệu chỉnh kết quả phép chia 2 số BCD dạng không nén. Lưu ý rằng lệnh AAD phải được thực hiện trước lệnh chia. Sau khi thực hiện chia thì phải hiệu chỉnh lại dạng BCD bằng cách dùng lệnh AAM. ™ Lệnh CBW: (Convert Byte to Word) Nếu AL < 80h thì AH = 0, ngược lại AH = 0FFh Lệnh CBW dùng để chuyển số nhị phân có dấu 8 bit thành số nhị phân có dấu 16 bit. ™ Lệnh CWD: (Convert Word to Double word) Nếu AX < 8000h thì DX = 0, ngược lại DX = 0FFFFh Lệnh CWD dùng để chuyển số nhị phân có dấu 16 bit thành số nhị phân có dấu 32 bit chứa trong DX:AX. 7.3.5. Dịch chuyển và quay ™ Lệnh SHL: (Shift Logical Left) SHL dst,1 SHL dst,CL Dịch trái 1 bit hay CL bit. CF ← dst7 ← dst6 ← dst0 ← 0 Phạm Hùng Kim Khánh Trang 60
  66. Giáo trình vi xử lý Lập trình hợp ngữ ™ Lệnh SHR: (Shift Logical Right) SHR dst,1 SHR dst,CL Dịch phải 1 bit hay CL bit. 0 → dst7 → dst6 → dst0 → CF ™ Lệnh SAL: giống SHL ™ Lệnh SAR: Giống như lệnh SHR nhưng giá trị bit dst7 không thay đổi, nghĩa là dst7 → dst7 → dst6 → dst0 → CF ™ Lệnh ROL: (Rotate Left) ROL dst,1 ROL dst,CL Quay trái 1 bit hay CL bit. CF ← dst7 ← dst6 ← dst0 ← dst7 ™ Lệnh ROR: (Rotate Right) ROR dst,1 ROR dst,CL Quay phải 1 bit hay CL bit. dst0 → dst7 → dst6 → dst0 → CF ™ Lệnh RCL: (Rotate though Carry Left) RCL dst,1 RCL dst,CL Quay trái 1 bit hay CL bit. CF ← dst7 ← dst6 ← dst0 ← CF ™ Lệnh RCR: (Rotate though Carry Right) RCR dst,1 RCR dst,CL Quay phải 1 bit hay CL bit. Phạm Hùng Kim Khánh Trang 61
  67. Giáo trình vi xử lý Lập trình hợp ngữ CF → dst7 → dst6 → dst0 → CF 7.3.6. Các lệnh logic ™ Lệnh AND: AND dst,src dst ← dst AND src CF ← 0, OF ← 0 Src là reg, mem hay immed còn dst là reg, mem. ™ Lệnh OR: OR dst,src dst ← dst OR src CF ← 0, OF ← 0 ™ Lệnh XOR: XOR dst,src dst ← dst XOR src CF ← 0, OF ← 0 ™ Lệnh NOT: NOT dst dst ← NOT dst Lệnh NOT không ảnh hưởng đến các cờ. ™ Lệnh TEST: TEST dst,src Lệnh TEST thực hiện phép toán AND 2 toán hạng nhưng chỉ ảnh hưởng đến các cờ và không ảnh hưởng đến toán tử. 7.4. Nhóm lệnh xử lý chuỗi Bao gồm các lệnh sau: - Lệnh MOVS: chuyển dữ liệu từ vùng nhớ này sang vùng nhớ khác. Phạm Hùng Kim Khánh Trang 62
  68. Giáo trình vi xử lý Lập trình hợp ngữ + MOVSB: chuyển 1 byte từ vị trí chỉ đến bởi SI đến vị trí chỉ bởi DI. Nếu DF = 0 thì SI ← SI + 1, DI ← DI + 1 còn nếu DF = 1 thì SI ← SI - 1, DI ← DI - 1. + MOVSW: chuyển 1 word từ vị trí chỉ đến bởi SI đến vị trí chỉ bởi DI. Nếu DF = 0 thì SI ← SI + 2, DI ← DI + 2 còn nếu DF ← 1 thì SI ← SI - 2, DI ← DI - 2. - Lệnh CMPS: so sánh nội dung 2 vùng nhớ + CMPSB: so sánh 1 byte tại vị trí chỉ đến bởi SI và tại vị trí chỉ bởi DI. Nếu DF = 0 thì SI ← SI + 1, DI ← DI + 1 còn nếu DF ← 1 thì SI ← SI - 1, DI ← DI - 1. + CMPSW: so sánh 1 word tại vị trí chỉ đến bởi SI và tại vị trí chỉ bởi DI. Nếu DF = 0 thì SI ← SI + 2, DI ← DI + 2 còn nếu DF = 1 thì SI ← SI - 2, DI ← DI - 2. - Lệnh SCAS: tìm một phần tử trong vùng nhớ, địa chỉ vùng nhớ xác định bằng cặp thanh ghi ES:DI, giá trị cần tìm đặt trong thanh ghi AL, nếu tìm thấy thì ZF = 1. Giá trị của DI và SI thay đổi giống như trên. - Lệnh LODS: đưa một byte hay word có địa chỉ xác định bởi cặp thanh ghi DS:SI vào thanh ghi AL hay AX. Giá trị của DI và SI thay đổi giống như trên. - Lệnh STOS: chuyển nội dung của AL hay AX vào vùng nhớ xác định bởi cặp thanh ghi ES:DI. Giá trị của DI và SI thay đổi giống như trên. 8. Các cấu trúc cơ bản trong lập trình hợp ngữ 8.1. Cấu trúc tuần tự Cấu trúc tuần tự là cấu trúc đơn giản nhất. Trong cấu trúc tuần tự, các lệnh được sắp xếp tuần tự, lệnh này tiếp theo lệnh kia. Lệnh 1 Lệnh 2 Lệnh n VD: Cộng 2 giá trị của thanh ghi BX và CX, rồi nhân đôi kết quả, kết quả cuối cùng chứa trong AX MOV AX,BX ADD AX,CX ; Cộng BX với CX SHL AX,1 ; Nhân đôi 8.2. Cấu trúc IF – THEN, IF – THEN – ELSE IF Điều kiện THEN Công việc IF Điều kiện THEN Công việc1 ELSE Công việc2 VD: Gán BX = |AX| CMP AX,0 ; AX > 0? Phạm Hùng Kim Khánh Trang 63
  69. Giáo trình vi xử lý Lập trình hợp ngữ JNL DUONG ; AX dương NEG AX ; Nếu AX 0? JNS AM ; AX âm MOV CL,1 ; CL = 1 (AX dương) JMP NEXT AM: MOV CL,0 ; CL = 0 (AX âm) NEXT: 8.3. Cấu trúc CASE CASE Biểu thức Giá trị 1: Công việc 1 Giá trị 2: Công việc 2 Giá trị n: Công việc n END VD: Nếu AX > 0 thì BH = 0, nếu AX < 0 thì BH = 1. Ngược lại BH = 2 CMP AX,0 JL AM JE KHONG JG DUONG DUONG: MOV BH,0 JMP NEXT AM: MOV BH,1 JMP NEXT KHONG: MOV BH,2 NEXT: 8.4. Cấu trúc FOR FOR Số lần lặp DO Công việc VD: Cho vùng nhớ M dài 200 bytes trong đoạn dữ liệu, chương trình đếm số chữ A trong vùng nhớ M như sau: MOV CX,200 ; Đếm 200 bytes MOV BX,OFFSET M ; Lấy địa chỉ vùng nhớ XOR AX,AX ; AX = 0 NEXT: CMP BYTE PTR [BX],'A'; So sánh với chữ A JNZ ChuA ; Nếu không phải là chữ A thì tiếp INC AX ; tục, ngược lại thì tăng AX ChuA: INC BX LOOP NEXT Phạm Hùng Kim Khánh Trang 64
  70. Giáo trình vi xử lý Lập trình hợp ngữ 8.5. Cấu trúc lặp WHILE WHILE Điều kiện DO Công việc VD: Chương trình đọc vùng nhớ bắt đầu tại địa chỉ 1000h vào thanh ghi AH, đến khi gặp ký tự '$' thì thoát: MOV BX,1000h CONT: CMP AH,'$' JZ NEXT MOV AH,DS:[BX] JMP CONT NEXT: 8.6. Cấu trúc lặp REPEAT REPEAT Công việc UNTIL Điều kiện VD: Chương trình đọc vùng nhớ bắt đầu tại địa chỉ 1000h vào thanh ghi AH, đến khi gặp ký tự '$' thì thoát: MOV BX,1000h CONT: MOV AH,DS:[BX] CMP AH,'$' JZ NEXT JMP CONT NEXT: 9. Các ngắt của 8086 Bảng 2.4: Vector ngắt Công dụng 00h CPU: tác động khi chia cho 0 01h CPU: chương trình thực thi từng bước 02h CPU: ngắt không che được 03h CPU: tạo điểm dừng chochương trình 04h CPU: tác động khi kết quả số học tràn 05h Tác động khi nhấn Print Screen 06h - 07h Dành riêng 08h Tác động bởi nhịp đồng hồ (18.2 lần/s) 09h Tác động khi có phím nhấn 0Ah Dành riêng 0Bh - 0Ch Tác động phần cứng liên lạc nối tiếp 0Dh Đĩa cứng 0Eh Đĩa mềm 0Fh Máy in 10h BIOS: màn hình 11h BIOS: xác định cấu hình máy tính 12h BIOS: thông báo kích thước RAM 13h BIOS: gọi các phụcvụ đĩacứng/mềm Phạm Hùng Kim Khánh Trang 65
  71. Giáo trình vi xử lý Lập trình hợp ngữ 14h BIOS: giao tiếp nối tiếp 15h BIOS: truy xuất cassette hay mở rộng ngắt 16h BIOS: xuất / nhập bàn phím 17h BIOS: máy in 18h Xâm nhập ROM basic 19h BIOS: khởi động máy tính 1Ah BIOS: ngày / giờ hệ thống 1Bh Lấy điều khiển từ ngắt bàn phím 1Ch Lấy điều khiển từ ngắt đồng hồ (sau int 08h) 1Dh Địa chỉ bảng tham số màn hình 1Eh Địa chỉ bảng tham số đĩa 1Fh Địa chỉ bộ mã ký tự 20h DOS: kết thúc chương trình 21h DOS: các chức năng DOS 22h Địa chỉ cần chuyển khi kết thúc chương trình 23h Địa chỉ cần chuyển khi gặp Ctrl – Break 24h Địa chỉ cần chuyển khi gặp lỗi 25h DOS: đọc đĩa cứng / mềm 26h DOS: ghi đĩa cứng / mềm 27h DOS: chấm dứt chương trình và thường trú 28h – 3Fh Dành riêng cho DOS 40h BIOS: các chức năng đĩa mềm 41h Bảng thông số đĩa cứng thứ nhất 42h – 45h Dành riêng 46h Bảng thông số đĩa cứng thứ hai 47h – 49h Định nghĩa do người sử dụng 4Ah Giờ báo hiệu (chỉ trong AT) 4Bh – 67h Định nghĩa do người sử dụng 68h – 6Fh Không sử dụng 70h Đồng hồ thời gian thực (chỉ trong AT) 71h – 7Fh Dành riêng 80h – 85h Dành riêng 86h – F0h Sử dụng bởi chương trình thông dịch BASIC F1h – FFh Không sử dụng 9.1. Ngắt 21h ™ Hàm 01h: nhập một ký tự từ bàn phím và hiện ký tự nhập ra màn hình. Nếu không có ký tự nhập, hàm 01h sẽ đợi cho đến khi nhập. - Gọi: AH = 01h - Trả về: AL chứa mã ASCII của ký tự nhập MOV AH,01h INT 21h ; AL chứa mã ASCII của ký tự nhập ™ Hàm 02h: xuất một ký tự trong thanh ghi DL ra màn hình tại vị trí con trỏ hiện hành - Gọi AH = 02h, DL = mã ASCII của ký tự - Trả về: không có Phạm Hùng Kim Khánh Trang 66
  72. Giáo trình vi xử lý Lập trình hợp ngữ MOV AH,02h MOV DL,'A' INT 21h ™ Hàm 08h: giống hàm 01h nhưng không hiển thị ký tự ra màn hình ™ Hàm 09h: xuất một chuỗi ký tự ra màn hình tại vị trí con trỏ hiện hành, địa chỉ chuỗi được chứa trong DS:DX và phải được kết thúc bằng ký tự $ - Gọi AH = 09h, DS:DX = địa chỉ chuỗi - Trả về: không có .DATA Msg DB 'Hello$' MOV AH,09h LEA DX,Msg INT 21h ™ Hàm 0Ah: nhập một chuỗi ký tự từ bàn phím (tối đa 255 ký tự), dùng phím ENTER kết thúc chuỗi - Gọi AH = 0Ah, DS:DX = địa chỉ lưu chuỗi - Trả về: không có Chuỗi phải có dạng sau: - Byte 0: Số byte tối đa cần đọc (kể cả ký tự Enter) - Byte 1: số byte đã đọc - Byte 2: lưu các ký tự đọc .DATA Msg DB 101 ; Đọc tối đa 100 ký tự DB ? DB 101 DUP(?) MOV AH,0Ah LEA DX,Msg INT 21h ™ Hàm 0Bh: kiểm tra phím nhấn trên bàn phím - Gọi: AH = 0Bh - Trả về: AL = 0FFh nếu có nhấn phím, AL = 0 nếu không nhấn phím ™ Hàm 4Ch: kết thúc chương trình MOV AH,4Ch INT 21h 9.2. Ngắt 10h ™ Xoá màn hình: - Gọi AX = 02h Phạm Hùng Kim Khánh Trang 67
  73. Giáo trình vi xử lý Lập trình hợp ngữ - Trả về: không có MOV AX,02h INT 10h ™ Chuyển toạ độ con trỏ: - Gọi AH = 02h, DH = dòng, DL = cột MOV AH,02h MOV DX,0F15h INT 10h 10. Truyền tham số giữa các chương trình Trong lập trình, một vấn đề ta cần quan tâm là truyền tham số giữa chương trình chính và chương trình con. Để thực hiện truyền tham số, ta có thể dùng các cách sau đây: - Truyền tham số qua thanh ghi - Truyền tham số qua ô nhớ (biến) - Truyền tham số qua ô nhớ do thanh ghi chỉ đến - Truyền tham số qua stack 10.1. Truyền tham số qua thanh ghi Ta thực hiện truyền tham số qua thanh ghi bằng cách: một chương trình con sẽ đưa giá trị vào thanh ghi và chương trình con khác sẽ xử lý giá trị trên thanh ghi đó. VD: Cộng giá trị tại 2 ô nhớ 1000h và 1001h, kết quả chứa trong 1002h (bye cao) và 1003h (byte thấp). .MODEL SMALL .STACK 100h .CODE main PROC MOV AX,@DATA MOV DS,AX ; ••a giá tr• vào các ô nh• MOV BYTE PTR DS:[1000h],10h MOV BYTE PTR DS:[1001h],0FFh CALL Read CALL Sum Mov AH,4Ch INT 21h main ENDP Read PROC ; ••c d• li•u vào thanh ghi AX MOV AH,DS:[1000h] MOV AL,DS:[1001h] RET Read ENDP Sum PROC ADD AH,AL JZ next MOV DS:[1003h],1 next: MOV DS:[1002h],AH Phạm Hùng Kim Khánh Trang 68
  74. Giáo trình vi xử lý Lập trình hợp ngữ RET Sum ENDP END main 10.2. Truyền tham số qua ô nhớ (biến) Quá trình truyền tham số cũng giống như trên nhưng thay vì thực hiện thông qua thanh ghi, ta sẽ thực hiện thông qua các ô nhớ. VD: Cộng giá trị tại 2 ô nhớ m1 và m2, kết quả chứa trong m3 (byte cao) và m4 (byte thấp). .MODEL SMALL .STACK 100h .DATA m1 db ? m2 db ? m3 db ? m4 db ? .CODE main PROC MOV AX,@data MOV DS,AX MOV m1,10h ; ••a giá tr• vào MOV m2,0FFh ; các ô nh• CALL Sum MOV AH,4Ch INT 21h main ENDP Sum PROC MOV m4,0 MOV AH,m1 ADD AH,m2 JNC next MOV m4,1 next: MOV m3,AH RET Sum ENDP END main 10.3. Truyền tham số qua ô nhớ do thanh ghi chỉ đến Trong cách truyền tham số này, ta dùng các thanh ghi SI, DI, BX để chỉ địa chỉ offset của các tham số còn thanh ghi đoạn mặc định là DS. VD: Cộng giá trị tại 2 ô nhớ m1 và m2, kết quả chứa trong m3 (byte cao) và m4 (byte thấp). .MODEL SMALL .STACK 100h .DATA m1 db ? m2 db ? m3 db ? m4 db ? .CODE main PROC Phạm Hùng Kim Khánh Trang 69
  75. Giáo trình vi xử lý Lập trình hợp ngữ MOV AX,@data MOV DS,AX LEA SI,m1 LEA DI,m2 LEA BX,m3 MOV [SI],10h ; ••a giá tr• vào MOV [DI],0FFh ; các ô nh• CALL Sum MOV AH,4Ch INT 21h main ENDP Sum PROC MOV AL,[SI] ADD AL,[DI] JZ next MOV [BX+1],1 next: MOV [BX],AL RET Sum ENDP END main 10.4. Truyền tham số qua stack Trong phương pháp truyền tham số này, ta dùng stack làm nơi chứa các tham số cần truyền thông qua các tác vụ PUSH và POP. VD: Cộng giá trị tại 2 ô nhớ m1 và m2, kết quả chứa trong m3 (byte cao) và m4 (byte thấp). .MODEL SMALL .STACK 100h .DATA m1 dw ? m2 dw ? m3 dw ? m4 dw ? .CODE main PROC MOV AX,@data MOV DS,AX LEA SI,m1 LEA DI,m2 MOV [SI],1234h ; ••a giá tr• vào MOV [DI],0FEDCh ; các ô nh• PUSH m1 ; ••a vào stack PUSH m2 CALL Sum POP m3 ; L•y k•t qu• ••a vào stack POP m4 MOV AH,4Ch INT 21h main ENDP Sum PROC POP DX ; L•u ••a ch• tr• v• c•a l•nh CALL POP AX ; L•y d• li•u t• stack POP BX Phạm Hùng Kim Khánh Trang 70
  76. Giáo trình vi xử lý Lập trình hợp ngữ ADD AX,BX JNC next PUSH 1 next: PUSH AX PUSH DX ; L•y ••a ch• tr• v• c•a l•nh CALL RET Sum ENDP END main 11. Các ví dụ minh hoạ 11.1. In chuỗi ký tự ra màn hình .MODEL SMALL .STACK 100h .DATA msg DB 'Hello$' .CODE main PROC MOV AX,@DATA ; Kh•i ••ng thanh ghi DS MOV DS,AX MOV AX,02h ; Xoá màn hình INT 10h MOV AH,02h ; Chuy•n to• •• con tr• MOV DX,0C15h ; ••n dòng 12 (0Ch) và c•t 21 (15h) INT 10h LEA DX,msg ; ••a ch• thông •i•p MOV AH,09h ; In thông •i•p ra màn hình INT 21h MOV AH,4Ch ; K•t thúc ch••ng trình INT 21h main ENDP END main 11.2. In chuỗi ký tự ra màn hình tại toạ độ nhập vào .MODEL SMALL .STACK 100h .DATA msg DB 'Hello$' msg1 DB 'Nhap vao toa do:$' Crlf DB 0Dh,0Ah,'$' Td DB 3 DB ? DB 3 DUP(?) .CODE main PROC MOV AX,@DATA MOV DS,AX ; Kh•i ••ng thanh ghi DS MOV AX,02h INT 10h ; Xóa màn hình LEA DX,msg1 MOV AH,09h ; In thông •i•p INT 21h CALL Nhap ; Nh•p dòng Phạm Hùng Kim Khánh Trang 71