Tải bản đầy đủ (.pdf) (216 trang)

hệ đếm và việc mã hóa thông tin trong máy tính

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (920.53 KB, 216 trang )

[Type the document title]
MỤC LỤC
CHƯƠNG I : CÁC HỆ ĐẾM VÀ VIỆC MÃ HÓA THÔNG TIN TRONG MÁY TÍNH 3
1. Các hệ đếm dùng trong máy tính 3
1.1. Hệ mười và hệ hai 3
1.2. Số BCD (số hệ mười mã hóa bằng hệ hai) 5
1.3. Hệ mười sáu (Hexa-decimal, hex, H) 6
2. Các phép toán số học đối với số hệ hai 6
2.1. Phép cộng 6
2.2. Phép trừ và số bù hai 7
2.3 Phép nhân 9
2.4 Phép chia 10
3. Mã ASCII - mã tiêu chuẩn cho trao đổi thông tin 12
4. Quan hệ giữa mã ASCII với số BCD 14
CHƯƠNG 2 : MÁY VI TÍNH VÀ HỆ THỐNG VI XỬ LÝ 16
1. Từ máy tính lớn đến máy vi tính 16
1.1.Máy tính lớn 16
1.2. Máy tính con 16
1.3.Máy vi tính 16
2. Sự phát triển của các bộ vi xử lý 17
2.1.Thế hệ 1 (1971-1973) 17
2.2.Thế hệ 2 (1974-1977) 17
2.3.Thế hệ 3 (1978-1982) 17
2.4.Thế hệ 4 (1983-1999) 18
3.Giới thiệu sơ lược cấu trúc và hoạt động của hệ vi xử lý 19
CHƯƠNG 3: BỘ VI XỬ LÝ INTEL 8088 22
1.Giới thiệu cấu trúc bên trong vàhoạt động của bộ vi xử lý 8088 22
1.1.BIU Và EU 22
2.Cách mã hoá lệnh củabộ vi xử lý 8088 30
3.Các chế độ địa chỉ của bộ vi xử lý 8088 32
CHƯƠNG 4 : LẬP TRÌNH BẰNG HỢP NGỮ VỚI 8088 83


1. Giới thiệu chung của chương trình hợp ngữ 84
1.1. Cú pháp của chương trình hợp ngữ 84
1.2. Dữ liệu cho chương trình 86
[Type text]
Trang 1
[Type the document title]
1.3. Biến và hằng 87
1.4. Khung của một chương trình hợp ngữ 89
2. Cách tạo và cho chạy một chương trình hợp ngữ trên máy IBM PC 98
3. Các cấu trúc lập trình cơ bản thực hiện bằng hợp ngữ 103
CHƯƠNG 5 : GHÉP 8088 VỚI BỘ NHỚ VÀ TỔ CHỨCVÀO/RA DỮ LIỆU 140
1. Giới thiệu các tín hiệu của 8088 và các mạch phụ trợ 8284, 8288 140
1.1. Các tín hiệu của 8088 140
1.2. Phân kênh để tách thông tin và việc đệm cho các bus 145
1.3. Mạch tạo xung nhịp 8284 148
1.4. Mạch điều khiển bus 8288 149
3. Phối ghép 8088 với thiết bị ngoại vi 172
3.1. Các kiểu phối ghép vào/ra 173
3.2. Giải mã địa chỉ cho thiết bị vào/ra 173
3.3. Các mạch cổng đơn giản 174
3.4. Mạch phối ghép vào/ra song song lập trình được 8255A 175
CHƯƠNG 6 : VÀO RA DỮ LIỆU BẰNG CÁCH THĂM DÒ 183
1. Giới thiệu chung về các phương pháp điều kiển vào/ra dữ liệu 183
2. Vào/ra dữ liệu bằng phương pháp thăm dò 183
CHƯƠNG 7 : NGẮT VÀ XỬ LÝ NGẮT TRONG HỆ 8088 185
1. Sự cần thiết phải ngắt CPU 185
2. Ngắt trong hệ vi xử lý 8088 186
2.1. Các loại ngắt trong hệ 8088 186
2.2. Đáp ứng của CPU khi có yêu cầu ngắt 187
2.3. Xử lý ưu tiên khi ngắt: 188

2.4. Mạch điều khiển ngắt ưu tiên 8259A 189
CHƯƠNG 8: VÀO /RA DỮ LIỆU BẰNG DMA 205
1. Nguyên tắc của việc trao đổi dữ liệu với thiết bị ngoại vi bằng cách thâm nhập
trực tiếp vào bộ nhớ (DMA) 205
2.DMAC 8237A -5 trong hệ vi xử lý 8088 208
2.1.tín hiệu HOLD và HLDA trong CPU 8088 208
2.2. Mạch DMAC 8237A -5của Inter 208
[Type text]
Trang 2
[Type the document title]
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
[Type text]
Trang 3
[Type the document title]
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.10
4
+2.10
3
+3.10
2
+4.10
1
+5.10
0
+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ố 2
i
tương ứng lần lược như sau:
=1.2
4
+0.2
3
+1.2
2
+1.2
1
+1.2
0
+0.2
-1
+1.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ị 2
i
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 =2
4
+2

2
+2
1
+2
0
+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 2
x
(x là giá trị lớn nhất của số mũ chọn sao
cho 2
x
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 2
x
. 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ố 2
i
bậc thấp hơn
cho tới đạt tới 2
0
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 2
i
0, khi số dư nhỏ hơn hoặc bằng 2

i
(và phép trừ không được thực hiện)
ví dụ đổi số 34 sang hệ hai.
Các giá trị 2
i
cần tính dến (2
5
=32 là giá trị 2
x
sát dưới nhất so với số 34)
2
5
2
4
2
3
2
2
2
1
2
0
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
[Type text]
Trang 4
[Type the document title]
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.
• 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óabằ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.
[Type text]
Trang 5
[Type the document title]
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ừ
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
11 nhớ 1111 1110
099 Số hạng 1 0110 0011
095 Số hạng 2 0101 1111
194 Tổng 1100 0010
[Type text]
Trang 6
[Type the document title]
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
1 Mượn 110 0000
109 số bị trừ 0110 1101
9 số trừ 0011 0001
060 Hiệu 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


0111 1101 125 + 125
+ 125
[Type text]
Trang 7
[Type the document title]
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.
[Type text]

Trang 8
[Type the document title]
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ừ.
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
[Type text]
Trang 9
[Type the document title]
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.
1001 Số bị nhân (9)
0110 Số nhân (6)
0000 Thành phần 1 của tổng tích luỹ
1001 Thành phần 2 của tổng tích luỹ
1001 Thành phần 3 của tổng tích luỹ
0000 Thành phần 4 của tổng tích luỹ
0110110 Tổng tích luỹ (54)
Độ 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.
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 tiếp theo của tổng tích luỹ sẽ tính được bằng cách tương tự,
nhưng phải dịch trái i bit (có thể bỏ qua các thành phần bằng 0).
• Tổng của các tổng thành phần là tích cần tìm.
Để 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:
1001 Số bị nhân (9)
0110 Số nhân (6)
1001 Số bị nhân dịch trái 1 lần
1001 Số bị nhân dịch trái 2 lần
0110110 Tổng tích luỹ (54)
2.4 Phép chia
[Type text]
Trang 10
[Type the document title]
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.
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
[Type text]
Trang 11
[Type the document title]
0 100100 Số bị chia
1 011000 Số chia ở mã bù hai để cộng
1 111100 0 Tổng, kết quả 1 (kq1)
1 111100 kq1
0 101000 Số chia ỡ mã hệ hai để cộng
0 100100 Số bị chia
1 00100 Số bị chia dịch trái 1 lần

1 01100 Số chia ở mã bù hai để cộng
0 10000 1 Tổng, kết quả 2 (kq2)
1 0000 kq2 dịch trái 2 lần
1 0110 Số chia ở mã bù hai để cộng
0 0110 1 Tổng, kết quả 3 (kq3)
0 110 kq3 dịch trái 3 lần
1 011 Số chia ở mã bù hai để cộng
0 001 1 Tổng, kết quả 4 (kq4)
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-
decimal
0 1 2 3 4 5 6 7
0 <NUL>

0
<DLE>

16
<SP>

32
0

48
@

64

P

80
`

96
P
1
12
1 <SOH>

1
<DC1>
1
7
!

33
1

49
A

65
Q

81
a

97

q
1
13
2 <STX>

2
<DC2>

18


34
2

50
B

66
R

82
b

98
r
1
14
3 <ETX>

3

<DC3>

19
#

35
3

51
C

67
S

83
c

99
s
1
15
[Type text]
Trang 12
[Type the document title]
4 <EOT>

4
<DC4>

20

$

36
4

52
D

68
T

84
d

100
t
1
16
5 <ENQ>

5
<NAK>

21
%

37
5

53

E

69
U

85
e

101
u
1
17
6 <ACK>

6
<SYN>

22
&

38
6

54
F

70
V

86

f

102
v
1
18
7 <BEL>

7
<ETB>

23


39
7

55
G

71
W

87
g

103
w
1
19

8 <BS>

8
<CAN>

24
(

40
8

56
H

72
X

88
h

104
x
1
20
9 <HT>

9
<EM>

25

)

41
9

57
I

73
Y

89
i

105
y
1
21
A <LF>

10
<SUB>

26
*

42
:

58

J

74
Z

90
j

106
z
1
22
B <VT>

11
<ESC>

27
+

43
;

59
K

75
[

91

k

107
{
1
23
C <FF>

12
<FS>

28
,

44
<

60
L

76
\

92
l

108
|
1
24

D <CR>

13
<GS>

29
-

45
=

61
M

77
]

93
m

109
}
1
25
E <SO>

14
<RSI>

30

.

46
>

62
N

78
^

94
n

110
~
1
26
F <SI>

15
<US>

31
/

47
?

63

O

79
_

95
o

111
<DEL>
1
27
[Type text]
Trang 13
[Type the document title]
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:
<Bel> (Bell, chuông): 7
<BS> (Back space, xoá lùi): 8
<HT> (Horizont tab, giãn cách ngang): 9
<LF> (Line feed, thêm dòng mới): OAH
<CR> (Carriage return, về đầu dòng): ODH
<SP> (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
[Type text]
Trang 14
[Type the document title]
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ố BCDkhô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.
Mã ASCII của 5 là 0011 0101B = 35H
Mã ASCII của 9 là 0011 1001B = 39H
Mã ASCII không gói của 5 là 0000 0101B = 05H
Mã ASCII không gói của 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ý.
[Type text]
Trang 15
[Type the document title]
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)
[Type text]
Trang 16
[Type the document title]
đượ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.
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ồ f
clk
= 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ý
hoan 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ồ f
clk
= 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
[Type text]
Trang 17
[Type the document title]
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ồ f
clk
=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, 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í thờ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.
[Type text]
Trang 18
[Type the document title]
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ý.
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ệ.
[Type text]
Trang 19
[Type the document title]

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 2
N
= 65536 =64 kilô ô nhớkhác nhau (1K=
2
10
=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).
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
[Type text]
Trang 20
[Type the document title]
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.
[Type text]
Trang 21
[Type the document title]
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ó thể 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ý khá đơ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ỷ thuật của các bộ vi xử lý khá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ộ giả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
[Type text]
Trang 22

[Type the document title]
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à giả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ộ vi 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 cơ chế đã được ứng dụng từ những
năm 60 từ các máy lớn. Nhân đây ta sẽ giớ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ể
thự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 để giả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ý trước. Nếu có sự vào/ra liên
tục của dòng mã lệnh trong bộ đệm này thì có nghĩa là có sự phối hợp hoạt động hiệu quả
giữa hai khối 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ự
[Type text]
Trang 23
[Type the document title]
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 2
20
= 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 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à thanh 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ó thể 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ụ thể nào đó so với ô đầu đoạn.
[Type text]
Trang 24
F1 D1 E1 F2 D2 E2 F3 D3 E3
Không có pipelining
D1F1 E1
D1F1 E1
F1 D1 E1
Có pipelining
(F : Đọc lệnh , D :Giải mả lệnh, E : Thực hiện lệnh)
Hình 3.2 : Dòng lệnh thường và dòng lệnh xen kẽ liên tục
[Type the document title]
Độ 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 để ghi 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á trị 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ỉ 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ó thể được tạo ra từ các giá trị:
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à
khi 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ỉ
[Type text]
Trang 25

×