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

Sách Kỹ thuật vi xử lý

Chia sẻ: 986753421 986753421 | Ngày: | Loại File: PDF | Số trang:237

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

Trong cuộc sống hàng ngày chúng ta dùng hệ cơ số mười hoặc nói gọn hơn hệ mười để biểu diễn các giá trị số. Điều này là rất tự nhiên vì từ khi xưa một con người bình thường đã biết dùng 10 ngón tay của mình như là “công cụ tính toán sơ đẳng. Trong hệ thống này chúng ta dùng tổ hợp của các chữ số 0..9 để biểu diễn các giá trị số, đi kèm theo tập hợp đó có thể dùng thêm chữ D đi mà vẫn ngầm hiểu rằng đó là số hệ mười...

Chủ đề:
Lưu

Nội dung Text: Sách Kỹ thuật vi xử lý

  1. 1 CHƯƠNG I CÁC HỆ ĐẾM VÀ VIỆC MÃ HÓA THÔNG TIN TRONG MÁY TÍNH 1. Các hệ đếm dùng trong máy tính 1.1. Hệ mười và hệ hai Trong cuộc sống hàng ngày chúng ta dùng hệ cơ số mười hoặc nói gọn hơn hệ mười để biểu diễn các giá trị số. Điều này là rất tự nhiên vì từ khi xưa một con người bình thường đã biết dùng 10 ngón tay của mình như là “công cụ tính toán sơ đẳng. Trong hệ thống này chúng ta dùng tổ hợp của các chữ số 0..9 để biểu diễn các giá trị số, đi kèm theo tập hợp đó có thể dùng thêm chữ D đi mà vẫn ngầm hiểu rằng đó là số hệ mười Trong thế giới máy tính thì khác, để biểu diễn 1 giá trị số chúng ta dùng hệ cơ số hai hoặc nói gọn hơn hệ hai, trong đó chỉ tồn tại hai chữ số 0 và 1để biểu diễn các giá trị số (ứng với hai trạng thái có điện và không có điện của các mạch điện tử cấu tạo trên máy). 0 và 1 cũng là các giá trị có thể có của một chữ số hệ hai. Hệ hai là hệ dùng trong các máy tính. Một số hệ hai thường được đánh dấu bằng chữ B đi kèm ở cuối để phân biệt với các hệ khác khi ta làm việc cùng một lúc với nhiều hệ đếm khác nhau. Một cụm 4 bit sẽ tạo thành 1 nibble, cụm 8 bit sẽ tạo thành 1 byte, cụm 16 bit thông thường sẽ trạo thành một từ(word), cụm 32 bit sẽ tạo thành một từ kép. Chữ số đầu tiên bên trái trong dãy các số hệ hai gọi là bít có ý nghĩa lớn nhất, còn bit cuối cùng bên phải trong dãy gọi là bit có ý nghĩa bé nhất. Ứng với việc đếm thứ tự 1,2,3…ở hệ 10 thì ở hệ 2 ta có 1,10,11… Nibble byte word Double Word Hình1.1. Các đơn vị đo độ dài của số hệ hai dẫn xuất từ bit Vì con người chỉ quen tính toán với hệ mười, trong khi các bộ phận tính toán của máy tính chỉ biết làm việc với hệ hai, nên để đảm bảo sự giao tiếp thuận tiện giữa người và máy (khi đưa số liệu vào và lúc lấy ra kết quả tính toán) thường xuyên phải có việc chuyển đổi qua lại giữa hai hệ đếm này. Chúng ta cùng xem xét nhanh các vấn đề trên thông qua các ví dụ đơn giản dưới đây. Một số hệ mười viết như sau: 12345,67 Sẽ có giá trị số bằng tổng của các tích giữa các hệ số 1,2,3,4,5,6,7 với các trọng số 10 i như sau: 12345,67=1.104 +2.103 +3.102 +4.101 +5.100 +6.10-1 +7.10-2 Tương tự như vậy, một số hệ hai viết như sau: 10111,01 Sẽ có giá trị số bằng tổng của các tích giữa các hệ số 1,0,1,1,1,01,1 với các trọng số 2i tương ứng lần lược như sau: =1.24 +0.23 +1.22 +1.21 +1.20 +0.2-1 +1.2-2
  2. 2 Các thuật toán thường dùng để chuyển đổi giữa hai hệ trên: . Đổi số hệ hai sang hệ mười Muốn đổi một số từ hệ hai sang hệ mười chỉ cần tính các giá trị 2i tương ứng với các chữ số khác không thứ i của hệ số hai rồi cộng lại như đã nói ở trên: Ví dụ 10111,11B =24 +22 +21 +20 +2-1 +2-2 =25,75 Ngược lại muốn chuyển một số từ hệ mười sang hệ hai ta có thể làm theo hai cách: . Cách một để đổi số hệ mười sang hệ hai Quy tắc: Lấy số hệ mười cần đổi trừ đi 2x (x là giá trị lớn nhất của số mũ chọn sao x cho 2 nhỏ hơn hoặc bằng so với số hệ 10 cần đổi), ghi lại giá trị 1 cho chữ số hệ hai ứng với 2x. Tiếp tục làm như vậy đối với số dư do phép trừ trên tạo ra và các số 2i bậc thấp hơn cho tới đạt tới 20 và ghi lại các gia trị (0 hoặc 1) cho chữ số hệ hai thứ i t ùy theo quan hệ giữa số dư và lũy thừa tương ứng: 1, khi số dư lớn hơn hoặc bằng 2i 0, khi số dư nhỏ hơn hoặc bằng 2i (và phép trừ không được thực hiện) ví dụ đổi số 34 sang hệ hai. Các giá trị 2i cần tính dến (25 =32 là giá trị 2x sát dưới nhất so với số 34) 25 24 23 22 21 20 Các chữ số hệ hai tính được: 1 0 0 0 1 0 Như vậy 34=100010B.  Cách 2 để đổi số hệ mười sang hệ hai Quy tắc: Lấy số cần đổi chia cho 2 và ghi nhớ phần dư, tiếp theo lấy thương của phép chia trước đó chia cho 2 và ghi nhớ phần dư. Làm như vậy cho tới khi được thương bằng 0. Đảo ngược thứ tự dãy các số dư sẽ được các chữ số của số hệ hai cần tìm. Ví dụ : Đổi số 34 sang hệ hai (hình 1.1.). Kết quả được 100010B. 34 2 0 17 2 1 8 2 0 4 2 0 2 2 0 1 2 1 0 Các số dư trong khung sẽ được sắp xếp theo chiều mũi tên HÌnh 1.1. Một cách đổi số hệ mười sang hệ hai.. Trong trường hợp số hệ mười cần đổi có thêm cả phần lẻ sau dấu phẩy thì đầu tiên ta phải đổi riêng rẽ từng phần rồi sau đó cộng các kết quả lại. Đối với phần nguyên ta có thể làm theo 2 cách đã nó i ở trên. Riêng đố i với phần sau dấu phẩy ta đổi theo quy tắc trình bày sau đây.
  3. 3  Quy tắc đổi số thập phân hệ mười ra hệ hai Lấy số cần đổi nhân với 2, tích nhận được sẽ gồm phần nguyên và phần lẻ nhị phân, lấy phần lẻ nhị phân của tích thu được nhân tiếp với 2. Làm như vậy cho tới khi được tích chẵn bằng 1. Chọn riêng các phần nguyên (phần trước dấu phẩy) của các tích thu được và sắp xếp lại sẽ được các chữ số sau dấu phẩy của số hệ hai cần tìm. Ví dụ: Đôỉ số 0.125 ra số hệ hai. Ta thực hiện phép nhân lần lượt theo các bước trên: 0,125 * 2 = 0 ,250 0,250 * 2 = 0 ,500 0,500 * 2 = 1 ,000 và thu được kết quả là 0,125 = 0,001B (phần được đóng trong khung). Kết hợp các ví dụ trên lại, nếu phải đổ i số 34,125 ra hệ hai ta thu được kết quả cuối cùng là 34,125 = 100010,001 B. 1.2. Số BCD (số hệ mười mã hóa bằng hệ hai) Giữa hệ mười và hệ hai còn tồn tại một hệ lai: hệ BCD cho các số hệ mười mã hóa bằng hệ hai (Binary Coded Decimal number), rất thích hợp cho các thiết bị do có thêm phần hiện thị số ở đầu ra dùng các loại đèn hiện số khác nhau. Ở đây ta dùng 4 số hệ hai để mã hóa một số hệ mười có giá trị nằm trong khoảng 0 ..9. Như vậy, ở đây ta không dùng hết các tổ hợp có thể có của 4 bit. Vì tầm quan trọng của các số BCD nên các bộ vi xử lý thường có các lệnh thao tác với chúng. Ví dụ: Số 410 nếu biểu diễn theo kiểu số BCD thì được 0100 0001 0000. Kết quả này cũng gợi ý cho ta cách thức chuyển đổi giữa hai loại số. 1.3. Hệ mười sáu (Hexa-decimal, hex, H) Nếu ta dùng hệ hai để biểu diễn các số có giá trị lớn ta sẽ gặp điều bất tiện là số hệ hai thu được quá dài. Ví dụ để biểu diễn số 255 ta cần đến 8 bit viết như sau: 255 = 1111 1111 B Trong thực tế để viết kết quả biểu diễn các số cho gọn lại người ta tìm cách nhó m 4 số hệ hai (1 nibble) thành một số hệ mười sáu . Khác với hệ BCD vừa nói hệ 16 dùng hết các tổ hợp có thể của 4 bit để biểu diễn các giá trị số. Để làm được điều này người ta sử dụng các chữ số sẵn có của hệ mười 0 .. 9 để biểu diễn các giá trị số ứng với 0 .. 9 và dùng thêm các chữ cái A .. F để biểu diễn các giá trị còn lại ứng với 10 .. 15. để phân biệt một số hệ mười sáu với các số hệ khác ta kèm thêm chữ H ở cuối. Ta cũng dễ nhận thấy rằng số mười chỉ là một bộ phận của hệ mười sáu. 2. Các phép toán số học đối với số hệ hai 2.1. Phép cộng Phép cộng các số hệ hai thực hiện giố ng như khi ta làm với số hệ mười. Quy tắc phép cộng số hệ hai được chỉ ra trong bảng 1.1. Bảng 1.1. Quy tắc phép cộng Bảng 1.2. Quy tắc phép trừ
  4. 4 y=a+b y= a-b a b y C a b y B 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 C: nhớ (Carry) B: mượn (Borrow) Ví dụ: Cộng hệ mười Cộng hệ hai nhớ 11 1111 1110 Số hạng 1 099 0110 0011 Số hạng 2 095 0101 1111 Tổng 194 1100 0010 Các bộ cộng trong các khối t ính toán số học của máy tính sẽ thực hiện các phép cộng theo cách đã nói ở trên. 2.2. Phép trừ và số bù hai a) Phép trừ Phép trừ các số hệ hai thực hiện giống như khi ta làm với số hệ mười. Quy tắc phép trừ số hệ hai được chỉ ra trong bảng 1.2. Ví dụ Trừ hệ mười Trừ hệ hai Mượn 1 110 0000 số bị trừ 109 0110 1101 số trừ 9 0011 0001 Hiệu 060 0011 1100 b) Số bù hai Trong khi làm phéo trừ ta nhận thấy có thể thực hiện phép trừ bằng phép cộng: cộng số bị trừ với số đối của số trừ. Điều này cũng được ứng dụng trong các khố i tính toán số học của máy tính để tận dụng các bộ cộng đã có sẵn. Vấn đề đặt ra đối với số hệ hai là ta phải có cách biểu diễn số âm một cách thích hợp sao cho ta có thể ứng dụng được tính chất nói trên. Có rất nhiều cách mã hóa các số hệ hai đê biểu diến số âm nhưng trong thực tế hay dùng nhất là dùng cách mã hóa kiểu số bù hai. Bảng 1.3 chỉ ra cách tạo ra các số hệ hai có dấu và số bù hai trong sự tương quan với số hệ hai. Bảng 1.3. Biểu diễn các số theo hệ hai, hệ hai có dấu và mã bù hai. Số 8 bit số hệ mười số hệ mười theo số hệ mười t ính hệ hai tương đương mã hệ hai có dấu theo mã bù hai 0000 0000 0 +0 +0 0000 0001 1 +1 +1 0000 0010 2 +2 +2 ... ... ... ...
  5. 5 0111 1101 125 + 125 + 125 0111 1110 126 +126 +126 0111 1111 127 +127 +127 1000 0000 128 -0 - 128 1000 0001 129 -1 - 127 1000 0010 130 -2 - 126 ... ... ... ... 1111 1101 125 -125 -3 1111 1110 126 -126 -2 1111 1111 255 -127 -1 Quan sát kỹ bảng này chúng ta có thể rút ra các nhận xét sau: 1. Nếu ta dùng 8 bit để biểu diễn số thì ta thu được 256 tổ hợp có giá trị từ 0 đến 255 (tương ứng 00 .. FF H), tức là chỉ biểu diễn được số dương. 2. Với tổ hợp trên nếu ta muốn biểu diễn số có dấu theo kiểu dấu và độ lớn (sign and magnitude) ta phải mất 1 bit để dành cho dấu và 7 bit còn lại để định giá trị. Với cách làm này ta có khả năng biểu diễn cả số âm và số dương nằm trong khoảng -127 .. -0, +0 .. +127 (chú ý 2 giá trị 0 khác nhau). 3. Số bù hai được tạo ra theo cách gần giố ng như kiếu dấu và độ lớn nhưng nó dùng cả 8 bit để biểu diễn giá trị của số được mã hóa. Mã bù hai dài 8 bit có khả năng biểu diễn các số âm và dương trong khoảng -128..0..+127. Một số dương có mã bù hai giố ng như hệ mã hai thông thường. 4. Một số biểu diễn theo hệ hai sẽ có các giá trị khác nhau nếu hiểu đó là mã để biểu diễn số theo kiểu hệ hai có dấu hoặc kiểu số bù hai. Nó i khác đi, một cụm các số 0 và 1 sẽ được cảm nhận khác nhau khi nó biểu diễn giá trị số theo các mã khác nhau. Cho dù có được biểu diễn bằng số hệ hai có dấu hay số bù hai thì các số âm đều có bit b7 = 1, còn các số dương có bit b7 = 0. Bây giờ ta nói cụ thể cách tính số bù hai của một số nào đó. Về mặt toán học thì sí bù hai của một số chính là số đối của nó. Như vậy một số dương sẽ có số bù hai là một số âm cùng giá trị tuyệt đối và ngược lại. Quy tắc: Muốn tìm số bù hai (còn gọ i là bù số học) của một số A ta làm theo các bước sau:  biểu diễn số A theo mã bù hai của nó tìm số bù một (bù logic) của số đó (bằng cách đảo bit)   cộng 1 vào số bù một ở trên để nhận được số bù hai của số A. Ghi chú: Khi có một số âm được biểu diễn theo mã bù hai nếu muốn t ính giá trị tuyệt đối của nó ta cũng áp dụng quy tắc này (áp dụng các bước 2.3). Ví dụ: Tìm số bù hai của 13. 13 = 0000 1101 B (mã bù hai của 13) số bù 1 của 13: 1111 0010 B (đảo bit của số trên) cộng thêm 1: 1 số bù hai của 13: 1111 0011 B (t ức là -13) Có thể lấy một ví dụ khác để chứng tỏ kết quả trên là đúng và qua đó cũng thấy được ứng dụng của số bù hai trong khi làm phép trừ.
  6. 6 Ví dụ: 15 - 13 = ? Ta có thể viết lại phép trừ trên thành phép cộng 15 + (-13) và sử dụng kết quả vừa tính được ở trên cho số (-13): 15 ... 0000 1111 (-13) ... 1111 0011 tổng 0000 0010 (nhớ 1) ... Nếu không để ý đến nhớ ta có kết quả là 2. Ví dụ: 12 - 13 = ? 12 ... 0000 1100 (-13) ... 1111 0011 tổng 1111 1111 (t ức -1) ... Đây là một số âm (bit b7=1) với giá trị tuyệt đối là 1 (tra theo bảng 1.2). Mặt khác ta cũng có thể tìm được giá trị tuyệt đối của kết quả bằng cách t ìm số bù hai của nó: Mã bù hai của kết quả trên ... 1111 1111 Số bù 1 của kết quả trên ... 0000 0000 Cộng - để tìm giá trị tuyệt đối ... 0000 0001 2.3 Phép nhân Phép nhân các số hệ hai thực hiện giố ng như khi ta làm với hệ số mười. Quy tắc phép nhân số hệ hai được chỉ ra trong bảng 1.4 Bảng 1.4. Quy tắc phép nhân y=a.b a b y 0 0 0 0 1 0 1 0 0 1 1 1 Trên cơ sở quy tắc vừa nêu và để cho đơn giản ta thực hiện ví dụ một phép nhân 2 số hệ hai với độ dài 4 bit để làm sáng tỏ thuật toán nhân. Số bị nhân (9) 1001 Số nhân (6) 0110 Thành phần 1 của tổng tích luỹ 0000 Thành phần 2 của tổng tích luỹ 1001 Thành phần 3 của tổng tích luỹ 1001 Thành phần 4 của tổng tích luỹ 0000 Tổng tích luỹ (54) 0110110 Độ dài cực đại của kết quả trong trường hợp này là 8 bit. Nếu ta có các toán hạng 8 (hoặc 16) bit thì độ dài cực đại của kết quả là 16 (hoặc 32) bit. Mỗi lần nhân 1 bit khác 0 của số nhân với số bị nhân ta thu được chính số bị nhân. Nếu dịch trái nó một số lần tương ứng với vị trí của bit khác 0 đó trong số nhân, ta tạo ra 1 thành phần của tổng tích luỹ. Tổng của các thành phần như trên là kết quả của phép nhân.
  7. 7 Phân tích kỹ quá trình trên ta thấy phép nhân có thể thực hiện theo thuật toán cộng và dịch (trên cơ sở các bộ cộng và dịch) như sau:  Thành phần đầu tiên của tổng tích luỹ thu được là tích của số LSB trong số nhân với số bị nhân. Nếu LSB = 0 thì thành phần này cũng bằng 0, còn nếu LSB = 1 thì thành phần này chính bằng số bị nhân.  Mỗi thành phần thứ i t iếp theo của tổng tích luỹ sẽ tính được bằng cách tương tự, nhưng phải dịch trái i bit (có thể bỏ qua các thành phần bằng 0).  Tổng của các tổng thành phần là tích cần tìm. Để minh hoạ cho thuật toán trên, ta dùng luôn nó để rút gọn ví dụ đã làm trước đây như sau: Số bị nhân (9) 1001 Số nhân (6) 0110 Số bị nhân dịch trái 1 lần 1001 Số bị nhân dịch trái 2 lần 1001 Tổng tích luỹ (54) 0110110 2.4 Phép chia Phép chia là phép tính ngược của phép nhân. Từ đó suy ra phép chia có thể được thực hiện bằng các phép trừ và phép dịch liên tiếp cho tới khi không thể trừ được nữa (do không còn gì để trừ hoặc số bị trừ nhỏ hơn số chia). Sau đây là thuật toán của phép chia thông qua ví dụ cụ thể. Ví dụ: 35/5 = 7 Ta hãy quan sát kỹ các bước phải làm khi chia bằng tay: 100011 101 000 0111 1000 101 111 101 101 101 0 Trong các bước t ính ở trên liên tục cần phải có các dự đoán và kiểm tra để tìm ra được kết quả đúng. Công việc này là rất khó khăn đối với các mạch điện tử của khối tính toán số học (vốn là các phần tử để thực hiện phép cộng và dịch trong máy tính). Sau đây là một thuật toán khắc phục được các vấn đề nêu ở trên: 1.Đổi số chia ra số bù hai của nó (để bước ở sau làm t ính trừ bằng tính cộng). 2.Lấy số bị chia trừ đi số chia. Nếu kết quả này có bit dấu bằng 0 (có nghĩa là phần này của số bị chia chia được cho số chia) thì bit tương ứng của thương bằng 1. Nếu kết quả này có bit dấu bằng 1 (có nghĩa là phần này của số bị chia không chia được cho số chia) thì bit tương ứng của thương bằng 0 và ta buộc phải khô i phục lại giá trị ban đầu của số bị chia bằng cách cộng kết quả này với số chia ở mã hệ hai.
  8. 8 3.Dịch trái kết quả thu được ở trên và làm lại bước 2 cho đến khi nhận được kết quả cuối cùng là 0 (chia hết) hoặc nhỏ hơn số chia (chia còn dư). Ví dụ: 36/5 = 7, dư 1. Thực hiện phép chia này trong hệ hai. Đầu tiên ta có 5 = 0101B và số bù hai của nó là 1011B. Các bước tính toán tiếp của phép chia theo thuật toán đã nêu ở trên được liệt kê ra như sau: Toáìn hạng Thương Tên toán hạng, thao tác Số bị chia 0 100100 Số chia ở mã bù hai để cộng 1 011000 Tổng, kết quả 1 (kq1) 1 111100 0 1 111100 kq1 Số chia ỡ mã hệ hai để cộng 0 101000 Số bị chia 0 100100 Số bị chia dịch trái 1 lần 1 00100 Số chia ở mã bù hai để cộng 1 01100 Tổng, kết quả 2 (kq2) 0 10000 1 kq2 dịch trái 2 lần 1 0000 Số chia ở mã bù hai để cộng 1 0110 Tổng, kết quả 3 (kq3) 0 0110 1 kq3 dịch trái 3 lần 0 110 Số chia ở mã bù hai để cộng 1 011 Tổng, kết quả 4 (kq4) 0 001 1 Bit dấu Từ đây ta rút ra 36/5 = 7 và dư 1. 3. Mã ASCII - mã tiêu chuẩn cho trao đổi thông tin Bảng 1.5. Bảng mã ASCII tiêu chuẩn Hexa- 0 1 2 3 4 5 6 7 decimal 0 0 @ P ` P 0 16 32 48 64 80 96 112 ! 1 1 A Q a q 1 17 33 49 65 81 97 113
  9. 9 2 “ 2 B R b r 2 18 34 50 66 82 98 114 3 # 3 C S c s 3 19 35 51 67 83 99 115 4 $ 4 D T d t 4 20 36 52 68 84 100 116 5 % 5 E U e u 5 21 37 53 69 85 101 117 6 & 6 F V f v 6 22 38 54 70 86 102 118 7 ‘ 7 G W g w 7 23 39 55 71 87 103 119 8 ( 8 H X h x 8 24 40 56 72 88 104 120 9 ) 9 I Y i y 9 25 41 57 73 89 105 121 A * : J Z j z 10 26 42 58 74 90 106 122 B + ; K [ k { 11 27 43 59 75 91 107 123 C , < L \ l | 12 28 44 60 76 92 108 124 D - = M ] m } 13 29 45 61 77 93 109 125 E . > N ^ n ~ 14 30 46 62 78 94 110 126 F / ? O _ o 15 31 127 47 63 79 95 111 Trong các phần trước ta đã nói đến cách biểu diễn số trong các hệ đếm. Bây giờ ta xem xét việc biểu diễn thông tin nó i chung trong máy tính. Tất cả các thông tin trong máy tính đều được biểu diễn dưới dạng các số 0 và 1. Mỗi tổ hợp của các số 0 và 1 được gán một ký tự chữ cái, chứ số hoặc một ký tự khác theo một cách thức nhất định. Trogn thực tế thông tin được truyền đi, được lưu giữ trong các bộ nhớ hoặc để hiển thị trên màn hình đều ở dưới dạng ký tự và tuân theo 1 loại mã được dùng rất rộng rãi gọi là mã ASCII (American Standard Code for Information Interchange, mã chuẩn của Mỹ dùng cho trao đổi thông tin). Việc dùng các ký tự để mã hoá thông tin theo bảng mã ASCII (bảng 1.5) cho ta khả năng trao đổi thông tin với hầu hết các máy tính khác. Trong bảng mã ASCII tiêu chuẩn, người ta dùng 7 bit để mã hóa các kỹ tự thông dụng, như vậy bảóng mã này sẽ có 128 ký tự ứng với các mã số từ 0..127. Bit thứ 8 có thể cho liên tục bằng 0, 1 hoặc có thể dùng để chứa bit parity (xem ý nghĩa của parity ở chương 3, phần nó i về các cờ) phục vụ cho việc phát hiện lỗ i khi truyền. Bên cạnh bảng ASCII tiêu chuẩn người ta còn dùng bảng ASCII mở rộng cho các ký tự đặc biệt (khác các ký tự tiêu chuẩn) với mã từ 128.. 255. Khi tra các bảng này ta đọc mã của ký tự theo thứ tự cột – hàng. Ví dụ: Mã ASCII của một số ký tự thường dùng trong khi lập trình: (Bell, chuông): 7 (Back space, xoá lùi): 8 (Horizont tab, giãn cách ngang): 9 (Line feed, thêm dòng mới): OAH
  10. 10 (Carriage return, về đầu dòng): ODH (Space, dấu cách): 2OH; ‘$’: 24H; ‘0’: 30H; ‘9’: 39H; ‘A’:41H; ‘a’: 61H... Khi xem xét bảng 1.5 ta có thể rút ra mấy nhận xét sơ bộ như sau: 1. 2 cột đầu của bảng mã được dùng cho các ký tự điều khiển. 2. Cột 2 dành riêng cho các ký tự ngăn cách 3. Các ký tự số nằm ở cột 3. Mã của ký tự ‘0’ là 30H. ‘9’ là 39H. Giữa giá trị số và mã ASCII của số đó có khoảng cách là 30H. 4. Các chữ cái hoa nằm ở các cột 4,5, các chữ cái thường ở cột 6,7. Khoảng cách giữa chữ thường và chữ hoa cùng tên là 20H. 4. Quan hệ giữa mã ASCII với số BCD Trong khi làm toán với các số BCD ta thường kết hợp 2 số BCD thành 1 byte. Dạng số BCD viết theo kiểu này gọ i là dạng BCD chuẩn hay còn được gọi là dạng BCD gói (packed BCD). Khi lưu trữ, khi hiện thị hoặc khi truyền giữa các thiết bị các giá trị số 0 .. 9, thực chất ta làm việc với mã ASCII của các số đó, tức là các số 30H .. 39H. Như vậy ta thấy trong 1 byte mã ASCII biểu diễn các số 0 ..9 có 4 bit thấp ứng với mã BCD của chính các số đó, 4 bit cao bao giờ cũng ứng với mã BCD của số 3 (tức là 0011B). Nếu trong byte mã ASCII này ta thay 4 bit cao bằng OH thì ta thu được số BCD không gói. Nói cách khác số BCD không gói là số dài 1 byte, trong đó 4 bit cao bằng không, 4 bit thấp là số BCD chuẩn mã hóa số cần biểu diễn. Ví dụ sau minh họa quan hệ giữa số BCD gói, BCD không gói và mã ASCII. của Mã ASCII 5 là 0011 0101B = 35H của Mã ASCII 9 là 0011 1001B = 39H của Mã ASCII không gó i 5 là 0000 0101B = 05H của Mã ASCII không gó i 9 là 0000 1001B = 09H Mã ASCII gói (chuẩn) của 59 là 0101 1001B = 59H Từ đây ta có thể rút ra các bước phải làm để đổi 2 số ở dạng mã ASCII sang dạng số BCD chuẩn:  Đổi số đầu tiên từ mã ASCII ra số BCD không gói  Đổi số thứ 2 từ mã ASCII ra số BCD không gói  Lấy 4 bit thấp của số đầu ghép với 4 bit thấp của số sau tạo thành 1 byte biểu diễn số BCD gói. Đây là các công việc hay gặp khi thao tác với các số trong các hệ vi xử lý.
  11. Bài soạn Vi xử lý CHƯƠNG 2 MÁY VI TÍNH VÀ HỆ THỐNG VI XỬ LÝ Bộ vi xử lí có mặt trong các máy vi t ính là sự phát triển tiếp theo của bộ xử lí được dùng như là một bộ phận chủ chốt trong cácmáy tính của các thế hệ trước. Để nắm bắt được tính kế thừa và tính liên tục của sự phát triển này, trước khi giới thiệu về các bộ vi xử lí ta để ra một chút thời gian để giới thiệu về các loại máy tính nó i chung. 1. Từ máy tính lớn đến máy vi tính Như ta đã biết về kiến thức của máy t ính nói chung, một máy t ính (Computer) thông thường bao gồm các khố i chức năng cơ bản như: khố i xử lí trung tâm (CPU, central processing unit), bộ nhớ (M, Memory) và khố i phối ghép với thiết bị ngoại vi (I/O, input/output) . tuỳ theo quy mô phức tạp của các khố i chức năng kể trên mà ngườ i ta phân các máy điệ tử đã và đang sử dụng ra thành các loại sau: 1.1. Máy tính lớn Máy tính lớn (mainframe) là loại máy t ính được thiết kế để giải các bài toán lớn với tốc đọ nhanh. Nó thường làm việc với số liệu từ 64 bit hoặc lớn hơn nữa và được trang bị bộ nhớ rất lớn. Chính vì vậy máy t ính cũng lớn về kích thước vật lý. Chúng thường được dùng để điều khiển các hệ thống thiết bị dùng trong quân sự hoặc các hệ thống máy móc của chương trình nghiên cứu vũ trụ, để xử lý các thông tin trong ngành ngân hàng, ngành khí tượng, các công ty bảo hiểm ... Tiêu biểu cho loại máy t ính này là lo ại má y IBM 8341, honeywell DSP8. loại máy lớn nhất trong các máy lớn được gọ i là supercomputer (như loại máy Y-MP/832 của Cray). 1.2. Máy tính con Máy tính con (minicomputer) là một dạng thu nhỏ về kích thước cũng như về tính năng của máy t ính lớn. Nó ra đời nhằm thoả mãn các nhu cầu sử dụng máy t ính cho các ứng dụng vừa phải mà nếu dùng máy t ính lớn vào đó thì sẻ gây lãng phí. Do vậy máy tính con thường làm việc với các dữ liệu có đọ dài từ 32 bit với tốc độ chậm hơn và khả năng của bộ nhớ hạn chế hơn. Máy tính con thường được dùng cho các tính toán khoa học kỹ thuật, gia công dữ liệu quy mô nhỏ hay để điều khiển quy tr ình công nghệ. Tiêu biểu cho nhó m này là loại máy VAX 6360 của Digital Equipment Corporation và MV/8000II của Data genaral. 1.3.Máy vi tính Máy vi tính (Microcomputer) là loại máy tính rất thông dụng hiện nay. Một máy vi tính có thể là một bộ vi điều khiển (microcontroller)., một máy vi t ính trong một vỏ mách (one- chip- microcomputer), và một hệ vi xử lí có khả năng làm việc với số liệu có độ dài 1 bit, 4 bit, 8 bit, 16 bit. Hiện nay một số máy vi tính có tính năng có thể so sánh được với máy t ính con, làm việc với số liệu có độ dài từ là 32 bit (thậm chí là 64 bit). Ranh giới để phân chia giữa máy vi tính và máy t ính con chính vì thế ngày càng không rỏ nét. Một dặc điểm tiêu biểu để nhận biết máy vi t ính là chúng đều sử dụng các bộ xử lí trung tâm (CPU) được chế tạo bằng công nghệ mạch vi điện tử với mức độ tổ hợp lớn, mạch VLSI (very large of integration) mà người ta quen gọi là các bộ vi xử lý (microcomputer, P) Các bộ vi xử lý hiện có tên thị trường thường được xếp theo các họ phụ thuộc vào các nhà sản xuất và chúng rất đa dạng về chủng loại. Nổi bật nhất trong các họ vi xử lý đố là 2 họ của 2 nhà sản xuất hàng đầu nổ i tiếng trong lĩnh vực này, đó là họ vi xử lý 80x86 của Intel và họ vi xử lý 680xx của Motorola. Trang 1
  12. Bài soạn Vi xử lý Trong các chương sau chúng ta sẽ quan tâm chủ yếu đến các bộ vi xử lý, các mạch phụ trợ và các hệ thống xây dựng trên cơ sở linh kiện của Intel, tuy thế sau đây cúng ta cũng sẽ giới thiệu lướt qua về lịch sử phát triển và các đặc điểm chung nhất của các thế hệ vi xử lý từ trước đến nay. Cuố i cùng chúng ta sẽ đưa ra bảng tổng kết, trong đó nêu ra các thông số chính của các bộ vi xử ký thế hệ gần đây nhất của 2 nhà cung cấp nổ i tiếng la Intel và Motorola. 2. Sự phát triển của các bộ vi xử lý 2.1. Thế hệ 1 (1971-1973) Năm 1971, trong khi phát triển các vi mạch dùng cho máy t ính cầm tay, Intel đã cho ra đời bộ vi xử lý đầu tiên là 4004 ( 4 bit ) của Rockwell International, IPM-16 (16 bit) của National Semiconductor. Đặc điẻm chung của các vi xử lý thế hệ này là:  Độ dài từ thường là 4 bit (cũng có thể dài hơn)  Công nghệ chế tạo PMOS với đặc điểm mật độ phần tử nhỏ, tốc độ thấp, giá thành rẻ và có khả năng đưa ra dòng tải nhỏ.  Tốc độ thực hiện lệnh: 10-16s/lệnh với tần số đồng hồ fclk = 0,1- 0,8 MHz.  Tập lệnh đơn giản phải cần nhiều mạch phụ trợ mới tạo nên một hệ vi xử lý hoaön chỉnh. 2.2. Thế hệ 2 (1974-1977) Các bộ vi xử lý đại diên trong thế hệ này là các vi xử lý 8 bit 6502 của MOS Technology, 6800 và 6809 của Motorola, 8080 và 8085 của Intel và đặc biệt là bộ vi xử lý Z80 của Zilog. Các bộ vi xử lý này có tập lệnh phong phú hơn và thường có khả năng phân biệt địa chỉ bộ nhớ với dung lượng đến 64KB. Có một số bộ vi xử lý còn có khả năng phân biệt được 256 địa chỉ cho các thiết bị ngoại vi (họ Intel và Zilog). Chúng đã được sử dụng rộng rãi trong công nghiệp và nhất là để tạo ra các máy t ính 8 bit nỗ i tiếng một thời như Apple II và Commodore 64. Tất cả các bộ vi xử lý thời kì này đều được sản xuất bằng công nghệ NMOS ( Với mật độ điện tủ trên một đơn vị diện tích cao hơn so với công nghệ PMOS) hoặc CMOS ( tiết kiệm điện năng tiêu thụ) cho phép đạt được tốc độ từ 1-8 s/lệnh với tần số đồng hồ fclk = 1-5 MHz. 2.3. Thế hệ 3 (1978-1982) Các bộ vi xử lý trong thế hệ này có đại diện là các bộ vi xử lý 16 bit 8086/80186/80286 của Intel hoặc 86000/86010 của Motorola. Một điều tiế bộ hơn hẳn so với các bộ vi xử lý 8 bit thế hệ trước là các bộ vi xử lý 16 bit có tập lệnh đa dạng với các lệnh nhân, lệnh chia và các lệnh thao tác với chuổi kí tự. Khả năng phân biệt địa chỉ cho bộ nhớ hoặc cho thiết bị ngoại vi của các vi xử lý thế hệ này cũng lớn hơn ( từ 1MB đế n 16 MB cho bộ nhớ và tới 64 K địa chỉ cho thiết bị ngoại vi đối với họ Intel). Đây là các bộ vi xử lý được dùng trong các máy IBM PC, PC/XT, PC/AT và các máy Macintosh của Apple. Phần lớn các bộ vi xử lý trong thế hệ này đều được sản xuất bằng công nghệ HMOS và cho phép đạt được tốc độ từ 0,1-1s/lệnh với tần số đồng hồ fclk =5-10 MHz. Trong thời kì này cũng xuất hiên các máy vi t ính 8 bit trong một vỏ như 8048/49 và 6805R2 (mạch này còn có thêm cả ADC 12 bit cho 4 kênh đầu vào tương tự) hoặc các bộ vi điều khiển 1 bit trong vỏ như MC 14500B và 4 bit trong 1 vỏ như MC 141000. 2.4. Thế hệ 4 (1983-1999) Các bộ vi xử lý đại diện trong thế hệ này là các vi xử lý 32 bit 80386/80486 và 64 bit Pentium của Intel 60-66MHz, Intel P6 - Pentium Pro 120- 133 MHz, Intel Pentium 150- 166 - 200 MHz với các mỡ rộng cho multimedia, Intel Pentium II 233-450 MHz, Trang 2
  13. Bài soạn Vi xử lý Intel Pentium III 500-550 MHz. Ngày nay các thông số cơ bản của bộ vi xử lí ngày càng được cải thiện : tốc độ ngày càng cao ( các bộ vi xử lí hiện đại của INTEL đã đạt tới tốc độ 800 MHz - 3GHz, độ rộng kênh thông tin dữ liệu ngày càng lớn như : 32, 64 bit . Điều đó đã giúp cho bài toán thiết jkế các bài toán thjiết kếcác hệ vi xử lí chuyên dung với t ính năng rang lain trở nên dễ dàng hơn. Song song với các hệ vi xử lí của hãng INTEL, hãng Motola cũng đưa ra các vi xử lý 32 bit 68020/68030/68040 và các vi xử lí 64 bit 68060/64. Ngày nay tốc độ của các vi xử lí hiện đại của hãng MOTOROLA cũng đạt trên 3GHz. Đặc điểm của các bộ vi xử lý thế hệ này có số lượng transistor rất lớn ( từ vài 3 triệu đến trên 50 triệu transistor .Phần lain các bộ vi xử lí mớ i thực hiện các lênh trong một chu kỳ, và thực tế taut cả chúng đều có đơn vị xử lí dấu phẩy động FPU (Floating-point Unit ) bên trong. Chúng có các thanh ghi chung 16-32 bit. Nhiều loại có phân biệt các tệp thanh nghi 32-bit ( register file ) cho đơn vị nguyên IU ( interger unit ) vaf teepj thanh ghi 32- bit cho FPU. Chúng có Cache memory bên trong với dung lượng lên tới 36 KB. Đa số Cache memory bên trong phân đôi : dùng cho lệnh Icache và dùng cho dữ liệu Dcache. Các bộ vi xử lí công nghệ cao hiện nay( advanced microprocessors) đã thoả mãn các yêu cầu chế tạo các máy t ính lớn ( mainframes ) và các siêu máy t ính ( supercomputers). Các vi xử lí t hời này có bus địa chỉ đều là 32 bit ( phâ n biệt 4 GB bộ nhớ) và có khả năng làm việc với bộ nhớ ảo. Người ta cũng áp dụng các cơ chế hoặc các cấu trúc đã được sử dụng trong các máy t ính lớn vào các bộ vi xử lí : cơ chế xử lý xen kẽ liên tục dòng mã lệnh( pipeline), bộ nhớ cache (bộ nhớ ẩn), bộ nhớ ảo. Các bộ vi xử lý này đều có bộ quản lý bộ nhớ(MMU) và nhiều khi cả các bộ đồng xử lý toán học ở bên trong. Chính nhờ các cải tiến đó mà các bộ vi xử lý thế hệ này có khả năng cạnh tranh được với các máy t ính nhỏ trong rất nhiều lĩnh vực ứng dụng. Phần lớn các bộ vi xử lý thế hệ này đều được sản xuất bằng công nghệ HCMOS. Một số thông số chính của các bộ vi xử lý của Intel và Motorola được cho trong bảng 2.1 và 2.2. Bên cạnh các bộ vi xử lý vạn năng truyền thống thường được dùng đẻ xây dựng các máy tính với tập lệhn đầy đủ ( complex instruction set computer, CISC) đã nó i ở trên, trong thời gian này cũng xuất hiện các bộ vi xử lý cải tiến dùng để xây dựng các máy tính với tập lệnh rút gọn (reduced instruction set computer, RÍC) với nhiều t ính năng có thể so sánh với các máy t ính lớn ở các thế hệ trước. Đó là các bộ vi xử lý Alpha của Digital, PowerPC của tổ hợp hãng Apple- Motorola- IBM... Có lẽ hãy còn sớm, nhưng cũng đã có nhiều biểu hiện để có thể nói được rằng sự ra đời của các vi xử lý loại RISC chính là sự bắt đầu cho một thế hệ khác trong lịch sử phát triển của các thế hệ vi xử lý. 3. Giới thiệu sơ lược cấu trúc và hoạt động của hệ vi xử lý Trên đây bộ vi xử lý là một thành phần rất cơ bản không thiếu được để tạo nên máy vi t ính. Trong thực tế bộ vi xử lý còn phải có thể kết hợp thêm với các bo ịo phận điện tử khác như bộ nhớ và bộ phố i ghép vào/ra để tạo nên một hệ vi xử lý hoàn chỉnh. Cần lưu ý rằng để chỉ một hệ thống có cấu trúc như trên, thuật ngữ “hệ vi xử lý” mang ý nghĩa tổng quát hơn so với thuật ngữ “máy vi t ính”, vì máy vi tính chỉ là một ứng dụng cụ thể cảu hệ vi xử lý. Hình 2.1 giới thiệu sơ đồ khối tổng quát của một hệ vi xử lý. Trang 3
  14. Bài soạn Vi xử lý Trong sơ đồ naydf ta thấy rõ các khối chức năng chính của hệ vi xử lý gồ m: + Khối xử lý trung tâm (central pgocessing unit,CPU) + Bộ nhớ bán dẫn (memory, M + Khối phối ghép với các thiết bị ngoại vi (input/ output,I/O)K + Các bus truyền thông tin. Ba khố i chức năng đầu liên hệ với nhau thông qua qập các đường day để truyền t ín hiệu gọ i chung là Bus hệ thống. Bus hệ thống bao gồm 3 bus thành phần. Ứng với các t ín hiệu địa chỉ, dữ liệu và điều khiển ta có bus địa chỉ, bus dữ liệu và bus điều khiển. CPU đóng vai trò chủ đạo trong hệ vi xử lý. Đây là một mạch vi điện tử có độ tích hợp rất cao. Khi hoạt động, nó đọc mã lệnh được ghi dưới fạng các bit 0 và bit 1 từ bộ nhớ, sau đó nó sẽ giải mã các lệnh này thành các dãy xung điều khiển ứng với các thao tác trong lẹnh để điều khiển các khố i khác thực hiện từng bước các thao tác đó. Để làm được việc này bên trong CPU có thanh ghi dùng để chứa địa chỉ của lệnh sắp thực hiệ n gọi là thanh ghi con trỏ lệnh (instruction pointer,IP) hoặc bộ đếm chương trình (program cuonter,PC), một số thanh ghi đa năng khác cùng bộ tính toán số học và logic (ALU) để thao tác với dữ liệu. Ngoài ra ở đây còn có các hệ thống mạch điện tử rất phức tạp để giải mã lệnh và từ đó tạo ra các xung điều khiển cho toàn hệ. Bộ nhớ bán dẫn hay còn gọ i là bộ nhớ trong là mộ t bộ phận khác rất quan trọng của hệ vi xử lý.Tại đây (trong ROM) ta có thể chứa chương trình điều khiển hoạt động của toàn hệ để khi bật điện thì CPU có thể lấy lệnh từ đây mà khửoi đầu hệ thống. Một phần của chương trình điều khiển hệ thống, các chuiương trình ứng dụng , dữ liệu cùng các kết quả của chương trình thường được để trong RAM. Các dữ liệu và chương trình muốn lưu trữ lâu dài sẽ được để ở bộ nhớ ngoài. Khối phối ghép vào/ra (I/O) tạo ra khả năng gaio tiếp giữa hệ vi xử lý với thế giớ i bên ngoài . Các thiết bị ngoại vi như bàn phím, chuột, màn hình, máy in, chuyển đổ i số tương tự (D/A converter, DAC) và chuyển đổi tương tự / số (A/D converter, ADC)., ổ đĩa từ... đều liên hệ với hệ vi xử lý qua bộ phận này. Bộ phận phố i ghép cụ thể giữa bus hệ thống với thế giới bên ngoài thường được gọ i là cổng. Như vậy tra sẽ có các cổng vào để lấy thông tin từ ngoài vào và các cổng ra để đưa thông tin từ trong ra ngoài. Tùy theo nhu cầu cụ thể của công việc, các mạch cổng này có thể được xây dựng từ các mạch lôgic đơn giản hoặc từ các vi mạch chuyên dụng lập trình được . Bus địa chỉ thường có từ 16, 20,24 đến 32 đường dây song song chuyển tải thông tin của các bit địa chỉ. Khi đọc/ghi bộ nhớ CPU sẽ đưa ra trên bus này địa chỉ của o nhớ liên quan. Khả năng phân biệt địa chỉ (số lượng địa chỉ cho ô nhớ mà CPU có khả năng phân biệt được) phụ thuộc vào số bit của bus địa chỉ. Ví dụ nếu một CPU có số đường dây địa chỉ là N=16 thì nó có khả năng địa chỉ hóa được 2N = 65536 =64 kilô ô nhớkhác nhau (1K= 210 =1024). Khhi đọc/ghi với cổng vào/ra CPU cũng đưa ra trên bú địa chỉ các bit địa chỉ tương uéng của cổng. Trên sơ đồ khố i ta dễ nhận ra tính một chiều của bus địa chỉ qua một chiều của mũi tên. Chỉ có CPU mới có khả năng đưa ra địa chỉ trên bus địa chỉ( sau này ta sẽ thấy còn mạch DMAC, mạch điều khiển trao đổi dữ liệu trực tiếp giữa bộ nhớ - thiết bị ngoại vi cũng có khả năng này). Trang 4
  15. Bài soạn Vi xử lý Bus dữ liệu thường có từ 8,16,20,24,32 đến 64 đường dây tùy theo các bộ vi xử lý cụ thể. Số lượng đường dây này quyết định số bit dữ liệu mà CPU có khả năng xử k ý cùng một lúc. Chiều mũi tên trên sus số liệu chỉ ra rằng đây là bus 2 chiều., nghĩa là dữ liệu có thể truyền đi từ CPU (dữ liệu ra) hoặc truyền đến CPU (dữ liệu vào). Các phần tử có đầu ra nố i thẳng với bus dữ liệu đều phải được trang bị đầu ra 3 tạng thái để có thể ghép vào được và hoạt động binbhf thường với bus này. Bus điều khiển thường gồ m hàng chục đường dây tín hiệu khác nhau. Mỗ i t ín hiệu điều khiển có một chiều nhất định. Vì khi hoạt động CPU đưa t ín hiệu điều khiển tới các khố i khác trong hệ, đồng thời nó cũng nhận tín hiệu điều khiển từ các khố i đó để phố i hợp hoạtm dộng của toàn hệ nên các tín hiệu này trên hình vẽ được thể hiện bởi các đường có mũi tên 2 chiều, điều đó không phải là dể chỉ tính hai chiều của một tín hiệu mà là tính hai chiều của cả một nhó m các tín hiệu. Hoạt đọng của hệ thống vi xử lý trên cũng xó thể nhìn theo một cách khác. Trong khi hoạt động và tại một thời điểm nhất định, về mặt chức năng mỗ i khố i trong hệ thống trên tương đương với các thanh ghi trong ( nằm trong CPU) hoặc các thanh ghi ngoài (nằm rải rác trong bộ nhớ ROM, bộ nhớ RAM và trong khối phố i ghép I/O). Hoạt động của toàn hệ thực chất là sự phố i hợp hoạt động của các thanh ghi trong và cngoài nó i trên để thực hiện sự biến đổi dữ liệu hoặc sự trao đổi dữ liệu theo các yêu cầu đã định trước. Trang 5
  16. Trang : 1 CHƯƠNG 3 BỘ VI XỬ LÝ INTEL 8088 Sau khi đ ã t ìm hiểu qua về cấu trúc của hệ vi xử lý. Trong chương này ta sẽ đi sâu tìm hiểu mọt bộ vi xử lý cụ thể và rất điển hình: bộ vi xử lý củ a Intel. Trước hết cần nó i rỏ lý do tại sao ở đâyta lại chọn đích danh bộ vi zử láy 8088 để tìm hiểu mà không phải là bộ vi xử lý nào khác ( điều mà nhiều người khác phải làm ). Thứ nhất, đây là bộ vi xử lý nổ i tiếng một thời thuộ c họ 80x86 của Intel, nó được sử dụng trong nhiều lĩnh vực khác nhau, nhất là trong các máy IBM PC /XT. Các bộ vi xử lý thuộ c họ này sẽ còn đư ợc sủ dụng rộng rãi trong hàng chục năm nữa, và vi t ính kế thừa của các sản phẩm trong họ 80x86., các chương trình viết cho8088 vẫn có t hể chạy trên các hệ thố ng tiên tiến sau này. Thứ hai, về gó c độ sư phạm thì đây là bộ vi xử lý k há đơn giản và vì việc dạy hiểu nó là tương đố i dể đố i với nhữ ng người mới bắt đầu thâm nhập vào lĩnh vực này. Thứ ba, các họ vi xử lý tuy có khác nhau nhưng xét cho cùng cũng có khá nhiều đ iểm chủ yếu rất giống nhau. Do đó mộ t khi đã nắm được các vấn đề kỷ thuật của8088, ta sẽ có cơ sở để nắm bắt các kỷ t huật của các bộ vi xử lý k hác cù ng trong họ Intel 80x86 ho ặc của các họ khác. 1. Giới thiệu cấu trúc bên trong vàhoạt động của bộ vi xử lý 8088. Trước khi giới thiệu tập lệnh và cách thức lập tr ình cho bộvi xử lý8088 ho ạt độ ng ta cần phải t ìm hiểu k ỹ cấu trúc bên trong của nó. Trên hình 3.1 là sơ đồ khố i cấu trúc bên trong cảu bộ vi xử lý Intel 8088: 1.1.BIU Và EU theo sơ đồ khối trên hình 3.1 ta thấy bên trong CPU 8088 có 2 khối chính: khối phối ghép ( bus interface unit, BIU ) vàkhối thực hiện lệnh ( execution unit, EU ). Việc chia CPU ra thành 2 phần làm việc đồng thời có liên hệ với nhau qua đệm lệnh làm tăng đáng kể t ốc độ xử lý củ a CPU. Các bus bên trong CPU có nhiệ m vụ chuyển tải tín hiệu của các khố i khác. Trong số các bus đó có bus dữ liệu 16 bit của ALU, bus các t ín hiệu đ iều khiển ở EU và bus trong của hệ thống ở BIU. Trước khi đi ra bus ngoài hoặc đivào bus trong của bộ vi xử l, các tín hiệu truyền trên bus thường được cho đi qua các bộ đệm để nâng cao tính tương thích cho nố i ghép hoặc nâng cao phố i ghép. BIU đưa ra đ ịa chỉ, đọ c mã lệnh từ bộ nhớ, đọc / ghi dữ liệu từ vào cổ ng ho ặc bộ nhớ. Nói cách khác BIU chịu trách nhiệm đưa địa chỉ ra bus và trao đổ i dữ liệu với bus. Trong EU ta thấy có mộ t khối điều khiển ( control unit, CU ). Chính tại bên trong khối đ iều khiển này có mạch giải mã lệnh. Mã lệnh đọ c vào t ừ bộ nhớ được đưa đến đầu vào của bộ g iải mã, các thô ng tin thu đ ược từ đầu ra của nó sẽ được đ ưa đến mạch tạo xung điều khiển, kết quả là tu thu được các dãy xung khác nhau ( tuỳ theo mã lệnh ) để đ iều khiển hoạt độ ng của các bộ phận bên trong và bên ngo ài CPU. Trong khố i EU cò n có khối số học và lôgic ( arithmetic anh logic unit. ALU ) dùng để thực hiện các thao tác khác nhau với các toán hạng của lệnh. Tóm lại, khi CPU ho ạt độ ng EU sẽ cung cấp thông tin về địa chỉ cho BIU để khố i này đọc lệnh và dữ liệu, cò n bản thân nó thì đọ c lệnh và g iải mã lệnh. Trong BIU cò n có một bộ nhớ đệm lệnh với dung lượng 4 byte dù ng để chứa các mã lệnh đọ c được nằm sẵn để chờ EU xử lý ( trong tài liệu của Intel bộ đệ m lệnh này cò n được gọ i là hàng đợi lệnh ). Đây là một cấu trúc mới đư ợc cấy vào bộ v i xử lý 8086x88 do việc Intel đưa cơ chế xử lý xen kẻ liên tục, dòng mã lệnh ( instruction pipelining ) vào ứng dụ ng trong các bộ vi xử lý thế hệ mới. Pipeline là mộ t
  17. Trang : 2 cơ chế đã được ứ ng dụ ng từ nhữ ng năm 60 từ các máy lớn. Nhân đây ta sẽ g iới thiệu sơ qua một chút về cơ chế này. Trong các bộ vi xử lý ở các thế hệ trước ( như ở 8085 chẳng hạn ), thô ng thường hoạt động của CPU gồm 3 giai đoạn: đọc mã lệnh ( ôpcde fetch ), giải mã lệnh ( đecode ) và thực hiện lệnh ( execution ). Trong một thời đ iểm nhất đ ịnh, CPU thế hệ này chỉ có thể t hực hiện một trong ba cô ng việc nó i trên và vì vậy tuỳ theo từng giai đo ạn sẽ có nhữ ng bộ phận nhất định của CPU ở trạng thái nhàn rỗi. Chẳng hạn, khi CPU giải mã lệnh ho ặc khi nó đang thực hiện những lệnh không liên quan đến bus ( thao tác nộ i bộ ) thì các bus không được dù ng vào việc gì dẫn đến t ình trạng lãng phí khả năng của chú ng ( hình 3.2 ). Trong khi đó từ bộ vi xử lý 8086/88, Intel sử dụng cơ chế xử lý xen kẻ liên tục dò ng mã lệnh thì CPU đ ược chia thành 2 khố i và có sự phân chia công việc cho từng khố i: việc đọc mã lệnh là do khố i BIU thực hiện, việc giải mã lệnh và thực hiện lệnh là do khố i EU đảm nhiệm. Các khố i chức năng này có khả năng làm việc đồ ng thời và các bus sẽ liên t ục sử dụng: trong khi EU lấy mã lệnh từ bộ đệm 4 byte để g iải mã hoặc thực hiện các thao tác nộ i bộ thì BIU vẫn có thể đọc mã lệnh từ bộ nhớ chính rồi đặt chú ng vào bộ nhớ đệm lệnh đã nó i. Bộ đệm lệnh này làm việc theo kiểu “ vào trước – ra trước “ (first in-first out, FIFO ), nghĩa là byte nào được cất vào đệm trước sẽ được lấy ra xử lý t rước. Nếu có sự vào/ra liên tục của dò ng mã lệnh trong bộ đệm này thì có nghĩa là có sự phối hợp ho ạt động hiệu quả giữa hai khố i EU và BIU theo cơ chế xử lý xen kẻ liên tục dòng mã lệnh để làm tăng tốc độ xử lý tổng thể. Kỹ thuật xử lý xen kẻ liên tục dòng mã lệnh sẽ không cò n tác dụng tăng tốc độ xử lý chung của CPU nữa nếu như trong đệm lệnh có chứa các mã lệnh của các lệnh CALL ( gọi chương trình con ) hoăc JMP ( nhảy ), bởi vì lúc các lệnh này nộ i dung của bộ đệm sẽ bị xoá và thay thế vào đó là nộ i dung mới được nạp bởi các mã lệnh mới do lệnh nhảy hoặc gọ i quyết đ ịnh. Việc này tiêu tốn nhiều thời gian hơn so với trường hợp trong đệm chỉ có mã lệnh của các lệnh tuần tự Khoâ ng coù pipelining F1 D1 E1 F2 D2 E2 F3 D 3 E 3 Coù pipelining F1 D1 E1 F1 D1 E1 F1 D 1 E 1 (F : Ñoï c leänh , D :G iaû i ma û leän h, E : Thöï c hieän leän h) H ình 3.2 : Doøn g leä nh thöôøng va ø doøn g leä nh xen keõ lieân tuïc Trong bộ vi xử lý 8088 ta còn thắy có các thanh ghi 16 bit nằm trong cả hai khố i BIU và EU, ngoài ra cũng có một số thanh ghi 8 ho ặc 16 bit tại EU. Ta sẽ lần lượt giới thiệu các thanh ghi nó i trên cùng chức năng chính của chú ng. *các thanh ghi đoạn Khố i BIU đưa ra trên bus địa chỉ 20 bit đ ịa chỉ, như vậy 8088 có khả năng phân biệt ra được 220 = 1.048.576 = 1M ô nhớ hay 1Mbyte, vì các bộ nhớ nó i chung tổ chức theo byte. Nó i cách khác: khô ng gian đ ịa chỉ củ a 8088 là 1Mbyte. Trong
  18. Trang : 3 không gian 1Mbyte bộ nhớ cần được chia thành các vù ng khác nhau ( điều này rất có lợi khi làm việc ở chế độ nhiều người sử dụng hoặc đa nhiệm ) dành riêng để:  Chứa mã chương trình.  Chứa dữ liệu và kết quả không gian của chương trình.  Tạo ra mộ t vùng nhớ đặc biệt gọ i là ngăn xếp ( stack ) dùng vào việc quản lý các thông số của bộ vi xử lý khi gọ i chương trình con hoặc trở về từ chương trình con. Trong thực tế bộ vi xử lý 8088 có các thanh ghi 16 bit liên quan đến địa chỉ đầu của các vù ng ( các đoạn ) kể trên và chú ng được gọi là các thanh ghi đo ạn ( Segment Registers ). Đó là thanh ghi đoạn mã CS ( Code-Segment ), thanh ghi đo ạn dữ liệu DS ( Data sement ). Thanh ghi đoạn ngăn xếp SS ( Stack segment ) và t hanh ghi đo ạn dữ liệu phụ ES ( Extra segment ). Các thanh ghi đoạn 16 bit này chỉ ra đ ịa chỉ đầu của bố n đoạn trong bộ nhớ, dung lượng lớn nhất của mỗ i đoạn nhớ này là 64 Kbyte và tại một thời điểm nhất định bộ vi xử lý chỉ làm việc đư ợc với bốn đoạn nhớ 64 Kbyte này. Việc thay đổ i giá trị của các thanh ghi đo ạn làm cho các đoạn có thể dịch chuyển linh hoạt trong phạm vi không gian 1 Mbyte, vì vậy các đo ạn này có thể nằm cách nhau khi thông tin cần lưu trong chúng đòi hỏ i dung lượng đủ 64 Kbyte ho ặc cũng có t hể nằm trùm nhau do có những đoạn khô ng cần dù ng hết đoạn dài 64 Kbyte và vì vậy nhữ ng đo ạn khác có thể bắt đầu nố i tiếp ngay sau đó. Điều này cũ ng cho phép ta truy nhập vào bất kỳ đoạn nhớ ( 64 Kbyte ) nào nằm trong to àn bộ khô ng gian 1 Kbyte. Nộ i dung các thanh ghi đoạn sẽ xác định đ ịa chỉ của ô nhớ nằm ở đầu đoạn. Địa chỉ này cò n gọi là địa chỉ cơ sở. Địa chỉ của các ô nhớ khác nằm trong đoạn t ính được bằng cách cộng thêm vào đ ịa chỉ cơ sở một giá tr ị gọ i là đ ịa chỉ lệch hay độ lệch ( Offset ), gọ i như thế vì nó ứng với khoảng lệch của to ạ độ mộ t ô nhớ cụ t hể nào đó so với ô đầu đo ạn. Độ lệch này được xác định bởi các thanh ghi 16 bit khác đóng vai trò thanh ghi lệch ( Offset register ) mà ta sẽ nó i đến sau. Cụ thể, để xác đ ịnh địa ch ỉ vật lý 20 bit của một ô nhớ nào đó trong một đoạn bất kỳ. CPU 8088 phải dùng đến 2 thanh ghi 16 bit ( một thanh ghi để chứa đ ịa chỉ cơ sở, cò n thanh kia chứa độ lệch ) và từ nội dung của cặp thanh ghi đó t ạo ra địa chỉ vật lý theo cô ng thức sau: Địachỉvậtlý=Thanhghiđoanx16+Thanhghilệch Việc dù ng 2 thanh ghi để g hi nhớ thông tin về đ ịa chỉ thực chất để tạo ra mộ t loại đ ịa chỉ gọi là địa chỉ logic và được k ý hiệu như sau: Thanhghiđoạn: Thanhghilệch hay segment: offset Địa chỉ kiểu segment: offset là logic vì nó tồn tại dưới dạng giá t rị của các thanh ghi cụ thể bên trông CPU và ghi cần thiết truy cập ô nhớ nào đó thì nó phả i được đổ i ra đ ịa chỉ vật lý để rồi được đưa lên bus đ ịa chỉ. Việc chuyển đổ i này do mộ t bộ tạo địa chỉ thực hiện (phần tử  trên hình 3.1). Ví dụ: cặp CS:IP sẽ chỉ ra đ ịa chỉ của lệnh sắp thực hiện trong đo ạn mã. Tại mộ t thời điểm nào đó ta có CS = F00H và IP = FFFOH thì CS:IP~FOOOHx16 + FFFOH = FOOOOH + FFFOH = FFFFOH Địa chỉ FFFFOH chính là địa chỉ khởi động của 8088 dấu ~ ở đây là để chỉ sự tương ứng. Địa chỉ các ô nhớ thuộc các đoạn khác cũng có thể tính được theo cách tương tự như vậy. Từ nay khi cần nó i đến đến đ ịa chỉ của mộ t ô nhớ ta có thể sử dụ ng cả đ ịa chỉ logic lẫn đ ịa chỉ vật lý vì bao giờ cũng tồ n tại sự tương ứng giữa hai loại đ ịa chỉ này ( thông qua bộ tạo địa chỉ  ). Trước khi nó i đến các thanh ghi khác ta nó i thêm chút ít về t ính đa trị của các thanh ghi đoạn và thanh ghi lệch trong đ ịa chỉ logic ứng với mộ t địa chỉ vật lý. Điều này cũng nó i lên t ính linh hoạt của cơ chế segment offset trong việc định địa ch ỉ
  19. Trang : 4 của 8086/ 88. Nhìn vào giá tr ị cuố i cù ng của địa chỉ vật lý ta thấy có thể tạo ra địa ch ỉ đó từ nhiều giá trị khác nhau của thanh ghi đo ạn và thanh ghi lệch Ví dụ: Địa chỉ vật lý 12345H có t hể được tạo ra từ các giá t rị: Thanh ghi đoạn Thanh ghi lệch 1000H 2345H 1200H 0345H 1004H 2305H 0300H E345H … … *Các thanh ghi đa năng trong khố i EU có bốn thanh ghi đa năng 16 bit AX, BX, CX, DX. Điều đặc biệt là k hi cần chứa các dữ liệu 8 bit thì mỗ i thanh ghi có thể tách ra thành hai thanh ghi 8 bit cao và thấp để làm việc độc lập, đó là các t ập thanh ghi AH và AL, BH và BL, CH và CL, DH và DL ( trong đó H chỉ phần cao, L chỉ phần thấp ). Mỗ i thanh ghi có thể dùng một cách vạn năng để chứa các tập dữ liệu khác nhau nhưng cũ ng có cô ng việc đặc biệt nhất đ ịnh chỉ thao tác với một vài thanh ghi nào đó và chính vì vậy các thanh ghi thường được gan cho nhữ ng cái tên đặc biệt rất có ý nghĩa. Cụ thể:  AX ( accumulator, acc ): thanh chứa. Các kết qủa của các thao tác thường đ ược chứa ở đây ( kết quả của phép nhân, chia ). Nếu kết quả là 8 bit thì thanh ghi AL được coi là acc.  BX ( base ): thanh ghi cơ sở thường chứa đ ịa chỉ cơ sở của mộ t bảng dùng trong lệnh XLAT.  CX ( count ): bộ đếm. CX thư ờng được dù ng để chứa số lần lặp trong trường hợp các lệnh LOOP ( lặp ), còn CL thường cho ta số lần dịch hoặc quay trong các lệnh dịch ho ặc quay thanh ghi.  DX ( data ): thanh ghi dữ liệu DX cùng BX tham gia các thao tác của phép nhân hoặc chia các số 16 bit. DX thường dùng để chứa đ ịa chỉ củ a các cổ ng trong các lệnh vào/ ra dữ liệu trực tiếp. *Các thanh ghi con trỏ và chỉ số Trong 8088 còn có ba thanh ghi con trỏ và hai thanh ghi chỉ số 16 bit. Các thanh ghi này ( trừ IP ) đều có thể được dù ng như các thanh ghi đa năng, nhưng ứ ng dụng chính của mỗ i thanh ghi là chúng đư ợc ng ầm đ ịnh như là thanh ghi lệch cho các đo ạn tương ứng. Cụ thể:  IP: con trỏ lệnh ( Instruction pointer ). IP luô n trỏ vào lệnh tiếp theo sẽ được thực hiện nằm trong đo ạn mã CS. Địa chỉ đầy đủ của lệnh tiếp theo này ứng với CS:IP và được xác đ ịnh theo cách đã nó i ở trên.  BP: con trỏ cơ sở ( base pointer ). BP luô n trỏ vào mộ t dữ liệu nằm trong đoạn ngăn xếp SS. Địa chỉ đầy đủ của một phần tử trong đo ạn ngăn xếp ứng với SS:BP và được xác định theo cách đã nó i ở trên.  SP: con trỏ ngăn xếp ( stack pointer ). SP luôn trỏ vào đỉnh hiện thời của ngăn xếp nằm trong đoạn ngăn xếp SS. Địa chỉ đ ỉnh ngăn xếp ứ ng với SS:SP và được xác đ ịnh theo cách đã nó i ở trên.  SI: chỉ số gốc hay nguồ n ( source index ). SI chỉ vào dữ liệu trong đoạn dữ liệu DS mà đ ịa chỉ cụ thể đầy đủ ứng với DS:SI và được xác đ ịnh theo cách đã nó i ở trên.  DI: chỉ số đ ích ( destination index ). DI chỉ vào dữ liệu trong đo ạn dữ liệu DS mà đ ịa chỉ cụ thể đầy đủ ứng với DS:DI và được xác đ ịnh theo cách đã nó i ở trên.
  20. Trang : 5 Riêng trong các lệnh thoa tác với dữ liệu kiểu chuổ i thì cặp ES:DI luô n ứ ng với địa chỉ củ a phần tử thuộ c chuỗ i đích cò n cặp DS:SI ứng với đ ịa chỉ của phần tử thuộc chuỗi gố c. *Thanh ghi cờ FR ( flag register ) Đây là thanh ghi khá đặc biệt trong CPU, mỗ i bit của nó được dùng để phản ánh mộ t trạng thái nhất đ ịnh của kết quả phép to án do ALU thực hiện hoặc mộ t trạng thái hoạt độ ng của EU. Dựa vào các cờ này người lập trình có thể có các lệnh thích hợp tiếp theo cho bộ vi xử lý ( các lệnh nhảy có điều kiện ). Thanh ghi cờ gồ m 16 bit nhưng người ta chỉ dùng hết 9 bit của nó để làm các bit cờ ( hình 3.3 ). Caùc côø cuû a boä vi xöû lyù 8086 x C x x x x O D I T S Z x A x P X : Khoâng ñöôïc ñònh nghóa Hình 3.3 Sô ñoà thanh ghi côø cuûa boä vi xöû lyù 8086/88 Các cờ cụ thể  C hoặc CF ( carry flag ): cờ nhớ. CF = 1 khi có nhớ hoặc muợn từ MSSP.  P hoặc PF ( parity flag ): cờ parity. PF phản ánh tính chẵn lẻ ( parity ) của tổng số bit 1 có trong kết quả. Cờ PF =1 khi tổ ng số bit trong kết quả là chẵn ( even parity, parity chẵn ). Ơûđây ta tạm dùng parity dạng nguyên gốc để tránh sự lủ ng củng khi phải d ịch cụm từ “ even parity “ thành tính chẵn lẻ chẵn ho ặc “ odd party “ thành tính chẵn lẻ lẻ.  A hoặc AF ( auxilialyry carry flag ): cờ nhớ p hụ rất có ý nghĩa khi ta làm việc với các số BCD.AF = 1 khi có nhớ ho ặc muợn từ một số BCD thấp ( 4 bit thấp ) sang mộ t số BCD cao ( 4 bit cao ).  Z hoặc ZF ( zero flag ): cờ rỗng. ZF =1 khi k ết quả = 0.  S hoặc SF ( sign flag ): cờ dấu. SF = 1 khi kết quả âm.  O ho ặc OF ( over flow flag ): cò tràn. OF = 1 khi kết quả là một số bù 2 vượt qua ngoài giới hạn biểu diễn dành cho nó. Trên đây là 6 bit cờ trạng thái phản ánh các trạng thái khác nhau của kết sau mộ t thao tác nào đó, trong đó 5 bit cờ đầu thuộc byte thấp của thanh cờ là các cờ giố ng như của bộ vi xử lý 8 bit 8085 của Intel. Chúng được lặp hoặc xo á tuỳ theo các điều kiện cụ thể sau các thao tác của ALU. Ngo ài ra, bộ vi xử lý 8088 cò n có các cờ điều khiển sau đây ( các cờ này được lập hoặc xo á bằng các lệnh riêng ):  T hoặc TF ( trap flag ): cờ bẩy. TF = 1 thì CPU làm việc ở chế độ chạy từng lệnh ( chế độ này dùng khi cần t ìm lỗ i trong một chương trình ).  I hoặc IF ( interrupt enable flag ): cờ cho phép ngắt. IF = 1 thì CPU cho phép các yêu cầu ngắt ( che được ) được tác động.  D ho ặc DF ( d irection flag ): cờ hướng. DF = 1 khi CPU làm việc với chuổ i k ý tự theo thứ tự từ phải sang trái ( vì vậy D chính là cờ lùi ) Ý nghĩa của các cờ đã k há rõ ràng. Riêng cờ tràn cần phải làm rõ hơn để ta hiểu được bản chất và cơ chế làm việc của nó. Cờ tràn thường được dù ng đến khi ta làm việc với số bù 2 có dấu. Để cho việc giải thích được đơn giản, đầu tiên giả thiết ta làm việc với số bù 2 dài 8 bit, kết quả để ở AL ( xem hình 3.4 ). Gọ i C67 là cờ nhớ từ bit 6 ( B6 ) lên bit 7 ( B7 ), trong đó B7 là MSB và cũng chính là bit dấu ( SF ) của AL. Ta có thể chứng minh được rằng quan hệ g iữa cờ OF với các cờ CF và C67 tuân theo phương trình sau: OF = CF  C67.
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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