Tài liệu Vi xử lý - Phạm Hùng Kim Khánh
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu 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:
- tai_lieu_vi_xu_ly_pham_hung_kim_khanh.pdf
Nội dung text: Tài liệu Vi xử lý - Phạm Hùng Kim Khánh
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương CHƯƠNG 1: ĐẠI CƯƠNG 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 = 5.103 + 3.102 + 4.10 + 6 + 7.10-1 + 2.10-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
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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) 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ả 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ã hố 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. Phạm Hùng Kim Khánh Trang 2
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương VD: Số thập phân 5 2 9 Số BCD 0101 0010 1001 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 (bảng 1.1). a a b cgd e f f b g e c d 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 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 tố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: Phạm Hùng Kim Khánh Trang 3
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương Bảng 1.2: Vào Ra A B CIN S COUT 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 1010 1 + 1100 1100 Nhớ 0111 0110 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). Để thuận tiện hơn trong việc tính tố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 0111 cĩ MSB = 0 (biểu diễn số dương) Số bù 2 là : 1111 1000 + 1 = 1111 1001. Số này sẽ đại diện cho số – 7. 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: Phạm Hùng Kim Khánh Trang 4
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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 1101 = 149 - 0011 0001 = 49 0011 1100 = 100 Ngồ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 1101 0110 1101 - 0011 0001 → + 1100 1111 1 0011 1100 Số bù 1 Nhớ 1100 1110 + 1 = 1100 1111 (Số bù 2) 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 1101 0100 1101 - 88 - 0101 1000 → + 1010 1000 - 11 1111 0101 Số 88 = 0101 1000 → số bù 1 là 1010 0111 → số bù 2: 1010 1000 Kết quả phép cộng số bù 2 là 1111 0101 cĩ MSB = 1 nên là số âm. Số bù 1 là 0000 1010 → số bù 2: 0000 1011. 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. Phạm Hùng Kim Khánh Trang 5
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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. VD: 30/5 = 6 11110 110 110 101 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 tố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. Phạm Hùng Kim Khánh Trang 6
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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 1010 3Fh → 0011 1111 B9h ← 1011 1001 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 A 3 F 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. 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 B X A 1 X = A B 0 0 0 3 B 2 0 1 0 1 0 0 1 1 1 Phạm Hùng Kim Khánh Trang 7
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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 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 Logic) hay PROM (Programmable Read Only Memory) để 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. Phạm Hùng Kim Khánh Trang 8
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương A B AB AB B A B AB A + AB AB + B Hình 1.1 – Sơ đồ PLA 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 Hình 1.2 – Sơ đồ PAL AB + AB PROM: ma trận AND cố định sẵn và ta chỉ lập trình trên ma trận OR. AB AB A B A B AB A B+ A B AB A B Hình 1.3 – Sơ đồ PROM AB + AB Phạm Hùng Kim Khánh Trang 9
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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 - 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 Phạm Hùng Kim Khánh Trang 10
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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 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ể xố bằng tia cực tím) và EEPROM (ROM cĩ thể xố 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. Phạm Hùng Kim Khánh Trang 11
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 3.4.2. Cấu trúc bên trong của bộ nhớ OE CS EN WE Three – state Memory Array driver Row address decoder Column address decoder Hình 1.6 – Cấu trúc nội một bộ nhớ tiêu biểu 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 bên ngồi WE(Write Enable): cho phép ghi dữ liệu vào trong bộ nhớ Row address decoder, Column address decoder: các bộ giải mã hàng và cột để chọn vị trí của memory cell (flipflop hay tụ điện) Three-state driver: bộ lái ngõ ra 3 trạng thái để đệm ngõ ra 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. Phạm Hùng Kim Khánh Trang 12
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương + 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. 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 tồn bộ các khối như hình 1.7. 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 tốn cho máy tính bao gồm: +, -, *, /, phép tốn logic, - Control (điều khiển): điều khiển, kiểm số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): các thiết bị 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). Phạm Hùng Kim Khánh Trang 13
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương - EU: thực hiện các lệnh số học và logic. Các tố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. 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 tố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ế. Sequencer EU 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
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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 ngồi vào data bus. Sau đĩ, µP đọc dữ liệu từ bus. Phạm Hùng Kim Khánh Trang 15
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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) - 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 Phạm Hùng Kim Khánh Trang 16
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương đị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ỉ cao A0 ÷ A12 Data bus RAM Các bit địa chỉ thấp 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ớ 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 Phạm Hùng Kim Khánh Trang 17
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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 00000h - 0FFFFh 5 G2A Y6 7 0E000h - 0FFFFh A16 1 15 G2B Y7 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 (xâu chuỗi) 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 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ớ. Phạm Hùng Kim Khánh Trang 18
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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. Ngồ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ì hỗn trong giao tiếp µP với bộ nhớ tdbuf: thời gian trì hỗn ở bộ đệm dữ liệu (data buffer) tabuf: thời gian trì hỗ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ì hỗ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ì hỗ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ớ tDH (Data Hold): thời gian giữ dữ liệu cung cấp bởi hệ thống bộ nhớ Phạm Hùng Kim Khánh Trang 19
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương Timing margin Thời gian truy xuất µP đời hỏi Thời gian truy xuất bộ nhớ Thời gian thiết lập µP cần Địa chỉ (từ µP) Địa chỉ (đến bộ nhớ) tabuf CS tdec RD tOE Dữ liệu (từ bộ nhớ) Dữ liệu (đế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
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Đại cương 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. Phạm Hùng Kim Khánh Trang 21
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý CHƯƠNG 2: TỔ CHỨC HỆ THỐNG VI XỬ LÝ 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 2.1: Kiến trúc các µP của Intel 8 bit, 16 bit và 32 bit ĐẶC TÍNH 8080 8086 8088 80186 80188 80286 80386 386SX 486/Pentium Bus địa chỉ (số 8 16 8 16 8 16 32 16 32 bit) Đường dữ liệu 8 16 16 16 16 16 32 32 32/64 nội (số bit) Tốc độ (MHz) 2,2.6, 5,8,10 5,8 8,10, 8,10, 6,8,10, 16,20,25, 16 25-66 6.3 12.5 12.5 12.5,20 33 Thanh ghi đến 1.3 0.3 0.38 0.2 0.3 0.125 0.125 0.125 0.04 thanh ghi (µs/word) Đáp ứng 7.3 6.1 8.6 3.36 6.2 2.52 3.5 2.52 3.5 interrupt (µs) Địa chỉ bộ nhớ 64K 1M 1M 1M 1M 16M 4G 4G 4G Cách định địa 5 24 24 24 24 24 28 28 28 chỉ Coprocessor 0 8087 8087 8087 8087 80287 80287/ 80287/ On chip 80387 80387 Số thanh ghi 6 8 8 8 8 8 8 8 8 đa dụng Số thanh ghi 0 4 4 4 4 4 6 6 6 đoạn Điều khiển 8259- 8259 8259- On On 8259- 8259-A 82335 µPLD interrupt A -A A chip chip A Timer – 8253 8253 8253/ On On 8253/ 8253/5 8253/5 On chip counter /54 54 chip chip 54 4 4 2. µP 8086/8088 2.1. Mơ tả 2.1.1. Định thì chu kỳ bus Mỗi chu kỳ bus bắt đầu bằng việc xuất địa chỉ bộ nhớ hoặc I/O port (chu kỳ xung nhịp T1). Với 8086 thì địa chỉ này cĩ thể là địa chỉ bộ nhớ 20 bit, địa chỉ I/O gián tiếp 16 bit (thanh ghi DX) hay địa chỉ I/O trực tiếp 8 bit. Bus điều khiển cĩ 4 tín hiệu tác động mức thấp là MEMR , MEMW , IOR và IOW . Phạm Hùng Kim Khánh Trang 22
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý Các chuỗi sự kiện xảy ra trong một chu kỳ bus đọc bộ nhớ: T1: µP xuất địa chỉ bộ nhớ 20 bit. Các đường dữ liệu khơng hoạt động và các đường điều khiển bị cấm T2: Đường điều khiển MEMR xuống mức thấp. Đơn vị bộ nhớ ghi nhận chu kỳ bus này là quá trình đọc bộ nhớ và đặt byte hay word cĩ địa chỉ đĩ lên data bus. T3: µP đặt cấu hình để các đường data bus là nhập. Trạng thái này chủ yếu để bộ nhớ cĩ thời gian tìm kiếm byte hay word dữ liệu T4: µP đợi dữ liệu trên data bus. Do đĩ, nĩ thực hiện chốt data bus và giải phĩng các đường điều khiển đọc bộ nhớ. Quá trình này sẽ kết thúc chu kỳ bus. T1 T2 T3 T4 Clk Address bus Địa chỉ ra IOR hay Đọc bộ nhớ hay MEMR I/O Data bus Dữ liệu ra Address Địa chỉ vào bus Ghi bộ IOW hay nhớ hay MEMW I/O Dữ liệu vào Data bus Hình 2.1 – Định thì chu kỳ bus Trong một chu kỳ bus, µP cĩ thể thực hiện đọc I/O, ghi I/O, đọc bộ nhớ hay ghi bộ nhớ. Các đường address bus và control bus dùng để xác định địa chỉ bộ nhớ hay I/O và hướng truyền dữ liệu trên data bus. Chú ý rằng µP điều khiển tất cả các quá trình trên nên bộ nhớ bắt buộc phải cung cấp được dữ liệu vào lúc MEMR lên mức cao trong trạng thái T4. Nếu khơng, µP sẽ đọc dữ liệu ngẫu nhiên khơng mong muốn trên data bus. Để giải quyết vấn đề này, ta cĩ thể dùng thêm các trạng thái chờ (wait state). Phạm Hùng Kim Khánh Trang 23
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý 2.1.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 2.2 – 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 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. Phạm Hùng Kim Khánh Trang 24
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý Các tín hiệu chung cho cả hai chế độ tối đa và tối thiểu: Bảng 2.2: 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 2.3: 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 2.4: 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 25
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý Trạng thái bus: Bảng 2.5: 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 2.6: 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 26
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - 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 xố 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. - 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). Phạm Hùng Kim Khánh Trang 27
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý - 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 2.3 – 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 28
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - 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ữ liệu ra D0 ÷ D15 Chu kỳ RD ghi DT/ R DEN Hình 2.4 – 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 2.7: 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 29
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - 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. 2.2. 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 2.5 – 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 30
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý Kiến trúc nội của µP 8086 ở hình 2.2. 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 ngồ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 2.6 – 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. Ngồ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. 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. Ngồi ra hàng lệnh của 8088 dài 4 byte trong khi của 8086 là 6 byte. Phạm Hùng Kim Khánh Trang 31
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý 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ả. Quá trình nhận lệnh và thực thi lệnh: 1/ BIU xuất nội dung của thanh ghi con trỏ lệnh IP (Instruction Pointer) ra bus địa chỉ để chọn byte hay word đọc vào BIU. 2/ Thanh ghi IP được tăng thêm 1 để chuẩn bị nhận lệnh kế. 3/ Khi lệnh ở trong BIU, nĩ được đưa sang hàng lệnh (queue). Đây là một thanh ghi lưu trữ dạng FIFO (First In First Out – Vào trước ra trước), dùng cơ chế xử lý xen kẽ liên tục các dịng mã lệnh (kỹ thuật đường ống – pipelining). 4/ Giả sử ban đầu hàng lệnh trống, EU sẽ khơng làm gì cả cho đến khi bắt đầu xuất hiện một lệnh trong hàng, EU sẽ lấy lệnh ra khỏi hàng và bắt đầu thực thi lệnh đĩ. 5/ Trong khi EU đang thực thi lệnh, BIU tiến hành nhận lệnh mới. Tuỳ theo thời gian thực thi lệnh mà BIU cĩ thể đưa vào hàng lệnh nhiều lệnh mới trước khi EU thực hiện lệnh xong và tiếp tục lấy lệnh mới. BIU được lập trình để cĩ thể nhận một lệnh mới bất kỳ lúc nào hàng lệnh cĩ chỗ cho 1 byte (8088) hay 2 byte (8086). Lợi ích của phương pháp xử lý theo cơ chế pipeline là EU cĩ thể thực thi các lệnh gần như liên tục thay vì phải đợi BIU nhận thêm lệnh mới. Nh ận Thực thi Nhận Thực thi Nhận Thực thi (a) Nhận (1) Nhận (2) Nhận (3) Đọc Nhận (4) Nhận (4) Nhận Chờ Thực thi Chờ Thực thi Thực thi Thực thi Chờ Nhận (b) (1): lệnh thực thi khơng cần dữ liệu trong hàng (2): lệnh thực thi cần dữ liệu trong hàng (3): lệnh nhảy (4): các lệnh bị bỏ qua do lệnh nhảy Hình 2.7 (a) µP thơng thường dùng chu kỳ nhận và thực thi lệnh tuần tự (b) kiến trúc dạng pipeline của 8086/8088 cho phép thực thi các lệnh mà khơng bị trễ do quá trình nhận lệnh Cĩ 3 điều kiện làm cho EU ở chế độ chờ: - Điều kiện thứ nhất xảy ra khi lệnh cần truy xuất đến một vị trí bộ nhớ khơng ở trong hàng. BIU phải treo quá trình nhận lệnh và xuất ra địa chỉ của ơ nhớ này. Sau khi truy xuất bộ nhớ, EU cĩ thể tiếp tục quá trình thực thi lệnh từ hàng lệnh và BIU cĩ thể tiếp tục đưa các lệnh vào hàng. Phạm Hùng Kim Khánh Trang 32
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý - Điều kiện thứ hai xảy ra khi lệnh được thực thi là lệnh nhảy (jump). Trong trường hợp này, thay vì dùng địa chỉ lệnh kế tiếp, ta phải chuyển đến địa chỉ mới (khơng tuần tự). Tuy nhiên, BIU vẫn luơn đặt các lệnh theo tuần tự và do đĩ sẽ lưu các lệnh khơng sử dụng. Trong khi nhận lệnh kế tiếp tại địa chỉ do lệnh jump chỉ đến, EU phải đợi và tất cả các byte trong hàng phải bỏ. - Điều kiện thứ ba cĩ thể làm BIU treo quá trình nhận lệnh đĩ là khi thực thi các lệnh cĩ thời gian thực thi lớn. Giả sử như lệnh AAM (ASCII Adjust for Multiplication) cần 83 chu kỳ xung nhịp để hồn tất trong khi đĩ với 4 chu kỳ xung nhịp cho quá trình nhận lệnh thì hàng sẽ bị đầy. Như vậy BIU phải đợi cho đến khi lệnh được thực hiện xong và EU nhận mã lệnh từ hàng thì mới cĩ thể tiếp tục quá trình nhận lệnh. 2.3. 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) 2.3.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 tốn số học và logic hay trong quá trình chuyển dữ liệu. Bảng 2.8: Thanh ghi Sử dụng trong AX MUL, IMUL (tốn hạng nguồn kích thước word) DIV, IDIV (tốn hạng nguồn kích thước word) IN (nhập word) OUT (xuất word) CWD Các phép tốn xử lý chuỗi (string) AL MUL, IMUL (tốn hạng nguồn kích thước byte) DIV, IDIV (tố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 tốn ASCII) CBW (đổi sang word) DAA, DAS (số thập phân) Các phép tốn xử lý chuỗi (string) Phạm Hùng Kim Khánh Trang 33
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý AH MUL, IMUL (tốn hạng nguồn kích thước byte) DIV, IDIV (tốn hạng nguồn kích thước byte) CBW (đổi sang word) BX XLAT CX LOOP, LOOPE, LOOPNE Các phép tốn string với tiếp dầu ngữ REP CL RCR, RCL, ROR, ROL (quay với số đếm byte) SHR, SAR, SAL (dịch với số đếm byte) DX MUL, IMUL (tốn hạng nguồn kích thước word) DIV, IDIV (tố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 2.3.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 tố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 tốn chuỗi. 2.3.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 tốn hạng, dữ liệu, bộ nhớ và các phần tử khác ngồi đoạn dữ liệu và stack hiện hành. 2.3.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. Phạm Hùng Kim Khánh Trang 34
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý 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 - OF (Overflow - tràn): OF = 1 xác định tràn số học, xảy ra khi kết quả vượt ra ngồ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 tố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 tố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. 2.4. 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ã hố ASCII 7 hay 8 bit). Ngồ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 2.8 – 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 2.8, 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 35
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - 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 2.9 – Đọc word địa chỉ chẵn và địa chỉ lẻ Ngồ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 2.10 – Bảng bộ nhớ cho 8086/8088 Phạm Hùng Kim Khánh Trang 36
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - 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 2.11 – 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 37
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - 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 2.11 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 2.11. Đị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 2.9: 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 38
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý Khi viết các chương trình hợp ngữ, thường gán cho các địa chỉ logic bằng các nhãn (label) hay các tên (name). Ví dụ: DATA SEGMENT SAMPLEB DB ? DATA ENDS sẽ gán nhãn SAMPLE cho byte ở địa chỉ logic 0 trong đoạn dữ liệu. Các phát biểu này khơng phải là các lệnh µP mà chỉ là các lệnh giả (pseudo instruction) dùng cho các chương trình dịch. Tốn tử DATA SEGMENT báo cho chương trình dịch biết các lệnh theo sau sẽ nằm trong đoạn dữ liệu. Tốn tử DB (Define Byte) gán cho nhãn SAMPLEB 1 byte trong đoạn dữ liệu. Ký hiệu ? xác định rằng khơng cần định nghĩa nội dung của byte đĩ. Do SAMPLEB là dịng đầu tiên nên nĩ sẽ cĩ địa chỉ logic là 0. Phát biểu DATA ENDS kết thúc đoạn dữ liệu (ở đây chỉ dịnh nghĩa 1 byte). Trong trường hợp muốn định nghĩa 1 word, ta dùng tốn tử DW (Define Word). VD: SAMPLEW DW 1000h Phát biểu này định nghĩa nhãn SAMPLEW ứng với vị trí word và nội dung của vị trí này là 1000h. Ngồi ra, ta cĩ thể dùng các tốn tử DD định nghĩa từ kép (double word), DQ định nghĩa từ bộ bốn (8 byte) và DT định nghĩa 10 byte. 3. Cách mã hố lệnh Lệnh của bộ vi xử lý sẽ biểu diễn bằng các ký tự dưới dạng gợi nhớ (mnemonic) để cĩ thể dễ dàng sử dụng. Đối với vi xử lý thì các lệnh được biểu diễn bằng các mã lệnh (opcode) nên sau khi nhận lệnh vi xử lý phải thực hiện giải mã lệnh rồi mới thực thi nĩ. Một lệnh vi xử lý cĩ thể dài 1 byte hay nhiều byte. Nếu ta dùng 1 byte để mã hố thì sẽ mã hố được 256 lệnh khác nhau. Tuy nhiên do một lệnh khơng phải chỉ cĩ một cách thực hiện nên ta khơng thể thực hiện đơn giản như trên. Để tìm hiểu cách mã hố lệnh, ta xét lệnh MOV des,src dùng để chuyển dữ liệu giữa hai thanh ghi hay một ơ nhớ và một thanh ghi. Lệnh MOV mã hố như sau: Byte 1 Byte 2 Byte 3 Byte 4 1 0 0 0 1 0 Opcode D W Mod reg M/R Để mã hĩa lệnh MOV, ta cần dùng ít nhất là 2 byte trong đĩ 6 bit dùng cho mã lệnh. Bit D xác định hướng truyền của dữ liệu, D = 0 xác định dữ liệu sẽ đi từ thanh ghi cho bởi 3 bit Reg, D = 1 xác định dữ liệu sẽ đi đến thanh ghi cho bởi 3 bit Reg. Bit W xác định sẽ truyền 1 byte (W = 0) hay 1 word (W = 1). 3 bit Reg dùng để chọn thanh ghi sử dụng: Phạm Hùng Kim Khánh Trang 39
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý Bảng 2.10: Thanh ghi Mã W = 1 W = 0 000 AX AL 001 CX CL 010 DX DL 011 BX BL 100 SP AH 101 DI CH 110 BP DH 111 SI BH 2 bit mod và 3 bit R/M (Register / Memory) dùng để xác định chế độ địa chỉ cho các tốn hạng của lệnh. Bảng 2.11: MOD 11 00 01 10 R/M W = 1 W = 0 000 [BX]+[SI] [BX]+[SI]+addr8 [BX]+[SI]+addr16 AX AL 001 [BX]+[DI] [BX]+[DI]+addr8 [BX]+[DI]+addr16 CX CL 010 [BP]+[SI] [BP]+[SI] +addr8 [BP]+[SI] +addr16 DX DL 011 [BP]+[DI] [BP]+[DI] +addr8 [BP]+[DI] +addr16 BX BL 100 [SI] [SI] +addr8 [SI] +addr16 SP AH 101 [DI] [DI] +addr8 [DI] +addr16 BP CH 110 addr16 [BP] +addr8 [BP] +addr16 SI DH 111 [BX] [BX] +addr8 [BX] +addr16 DI BH Tổng quát, 8086/8088 cĩ khoảng 300 tác vụ cĩ thể cĩ trong tập lệnh của nĩ. Mỗi lệnh kéo dài từ 1 đến 6 byte. Từ ví dụ trên, ta thấy mã lệnh cĩ các vùng: - Vùng mã lệnh (opcode): chứa mã lệnh của lệnh sẽ thực thi - Vùng thanh ghi (reg): chứa các thanh ghi sẽ thực hiện (bảng 2.10) - Vùng chế độ (mod): (bảng 2.11) 00: tốn hạng bộ nhớ trực tiếp nếu R/M = 110, ngược lại là tốn hạng gián tiếp 01: tốn hạng gián tiếp, độ dời 8 bit 10: tốn hạng gián tiếp, độ dời 16 bit 11: sử dụng 2 thanh ghi, vùng R/M sẽ là vùng Reg - Vùng thanh ghi / bộ nhớ R/M (Reg/Mem): (bảng 2.11) Phạm Hùng Kim Khánh Trang 40
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý 4. Các cách định địa chỉ Bảng 2.12: 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) liệ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 41
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - 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 4.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. 4.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. 4.3. Định địa chỉ trực tiếp Ngồ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 tố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 4.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). Ngồi ra, 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. Phạm Hùng Kim Khánh Trang 42
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Tổ chức hệ thống vi xử lý 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. Ngồ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ố 4.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) 4.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 43
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ CHƯƠNG 3: 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 Subname PROC ; Định nghĩa chương ; trình con Phạm Hùng Kim Khánh Trang 44
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ RET Subname ENDP END main Quy mơ sử dụng bộ nhớ: Bảng 3.1: Loại Mơ tả Tiny Mã lệnh và dữ liệu nằm trong mộ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ằm trong mộ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ớn hơn 64KB 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. 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): Phạm Hùng Kim Khánh Trang 45
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ Tên Lệnh Tố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 tốn hạng chứa các tố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 1111 ; 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 ; 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 Phạm Hùng Kim Khánh Trang 46
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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 Ngồi ra ta cĩ thể dùng các tố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'. 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'. Phạm Hùng Kim Khánh Trang 47
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 4. Các tốn tử trong hợp ngữ Tốn tử số học: Bảng 3.2: Tố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 bt shr n Dịch phải n bit 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 Tốn tử logic: Bao gồm các tốn tử AND, OR, NOT, XOR VD: MOV AH,10 OR 4 AND 2 ; AH = 10 MOV AH, 0F0h AND 7Fh ; AH = 70h Tốn tử quan hệ: Các tố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 3.3: Tố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ớn hơn hay bằng Phạm Hùng Kim Khánh Trang 48
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ Các tốn tử cung cấp thơng tin: ¾ Tốn tử SEG: SEG bt Tố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 tốn hạng bộ nhớ. ¾ Tốn tử OFFSET: OFFSET bt Tố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 tố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 ¾ Tốn tử chỉ số [ ]: (index operator) Tốn tử chỉ số thường dùng với tốn hạng trưc tiếp và gián tiếp. ¾ Tốn tử (:) (segment override operator) Segment:bt Tố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 tốn tử : kết hợp với tốn tử [ ] thì segment: phải đặt ngồi tốn tử [ ]. VD: Cách viết [CS:BX] là sai, ta phải viết CS:[BX] ¾ Tố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. ¾ Tốn tử LENGTH: LENGTH bt Trả về số các đơn vị cấp cho biến bt ¾ Tố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 Phạm Hùng Kim Khánh Trang 49
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ Các tốn tử thuộc tính: ¾ Tốn tử PTR: Loai PTR bt Tố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 tố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 ¾ Tố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. 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ữ Tốn hạng trực tiếp: Tố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 Tố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. Tốn hạng bộ nhớ: ¾ Trực tiếp: Tố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 tốn tử chỉ số [ ] hay tốn tử +, -, :). Thanh ghi đoạn mặc định là thanh ghi DS nhưng ta cĩ thể dùng tốn tử : để chỉ thanh ghi đoạn khác. Phạm Hùng Kim Khánh Trang 50
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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: Tố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ớ. 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) 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 Phạm Hùng Kim Khánh Trang 51
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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 tốn hạng src vào tốn hạng dst. Tốn hạng nguồn src cĩ thể là thanh ghi (reg), bộ nhớ (mem) hay giá trị tức thời (immed); tố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 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 tốn hạng đích Lệnh XCHG dst,src: (Exchange) hốn chuyển nội dung 2 tốn hạng. Tố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. Tốn hạng là reg16 Lệnh POP dst: lấy dữ liệu 16 bit từ stack đưa vào tố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 Phạm Hùng Kim Khánh Trang 52
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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 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 tố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ớ tố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). Phạm Hùng Kim Khánh Trang 53
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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 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 Phạm Hùng Kim Khánh Trang 54
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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 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 Phạm Hùng Kim Khánh Trang 55
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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 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 tố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 tố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 Phạm Hùng Kim Khánh Trang 56
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ Lệnh LOOPZ: Giống lệnh LOOPE Lệnh LOOPNE: LOOPNE label Mơ tả: CX = CX – 1 Nếu (ZF = 0) và (CX <> 0) thì JMP label Lệnh LOOPNZ: Giống lệnh LOOPNE 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 Tốn hạng src cĩ thể là reg, mem hay immed cịn tố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 ngồi phạm vi lớn nhất hay nhỏ nhất mà số cĩ dấu cĩ thể chứa trong tốn hạng dst. Phạm Hùng Kim Khánh Trang 57
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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. 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 Tốn hạng src cĩ thể là reg, mem hay immed cịn tố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
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - 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 tố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 tố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 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 Phạm Hùng Kim Khánh Trang 59
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ - 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 ngồi khoảng (-128,127) đối với dạng 8 bit. - Thương nằm ngồ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 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 Phạm Hùng Kim Khánh Trang 60
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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. 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 tốn AND 2 tốn hạng nhưng chỉ ảnh hưởng đến các cờ và khơng ảnh hưởng đến tốn tử. Phạm Hùng Kim Khánh Trang 61
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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. + 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 Phạm Hùng Kim Khánh Trang 62
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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? 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 Phạm Hùng Kim Khánh Trang 63
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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 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ì thố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ì thố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 3.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 Phạm Hùng Kim Khánh Trang 64
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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ục vụ đĩa cứng/mềm 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 Phạm Hùng Kim Khánh Trang 65
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 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ĩ 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 4Ch: kết thúc chương trình MOV AH,4Ch INT 21h Phạm Hùng Kim Khánh Trang 66
- Simpo PDFTài Merge liệu vi x andử lý Split Unregistered Version - Lập trình hợp ngữ 9.2. Ngắt 10h Xố màn hình: - Gọi AX = 02h - 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ưong 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 MOV BYTE PTR DS:[1000h],10h ; Đưa giá trị vào MOV BYTE PTR DS:[1001h],0FFh ; các ơ nhớ 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 ; Xử lý dữ liệu tại thanh ghi AX Phạm Hùng Kim Khánh Trang 67