Tải bản đầy đủ (.docx) (176 trang)

Bài giảng Kỹ thuật Vi xử lý - Văn Thế Minh

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 (940.29 KB, 176 trang )

Kỹ thuật Vi xử lý
MỤC LỤC
[Type text] Trang
1
Kỹ thuật Vi xử lý
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.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ụ
[Type text] Trang
2
Kỹ thuật Vi xử lý
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
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.
[Type text] Trang
3
Kỹ thuật Vi xử lý
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ừ
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
[Type text] Trang
4
Kỹ thuật Vi xử lý

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
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
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
[Type text] Trang
5
Kỹ thuật Vi xử lý
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ừ.
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 = ?
[Type text] Trang
6
Kỹ thuật Vi xử lý
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.

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)
[Type text] Trang
7

Kỹ thuật Vi xử lý
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
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

0 100100 Số bị chia
1 011000 Số chia ở mã bù hai để cộng
1 111100 0 Tổng, kết quả 1 (kq1)
[Type text] Trang
8
Kỹ thuật Vi xử lý
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
112
1
<SOH>
1
<DC1>
17
!

33
1
49
A
65
Q
81
a
97
q
113
2

<STX>
2
<DC2>
18

34
2
50
B
66
R
82

b
98
r
114
3
<ETX>
3
<DC3>
19
#
35
3

51
C
67
S
83
c
99
s
115
4
<EOT>
4

<DC4>
20
$
36
4
52
D
68
T
84
d
100

t
116
5
<ENQ>
5
<NAK>
21
%
37
5
53
E

69
U
85
e
101
u
117
6
<ACK>
6
<SYN>
22

&
38
6
54
F
70
V
86
f
102
v
118

7
<BEL>
7
<ETB>
23

39
7
55
G
71
W

87
g
103
w
119
8
<BS>
8
<CAN>
24
(
40

8
56
H
72
X
88
h
104
x
120
9
<HT>

9
<EM>
25
)
41
9
57
I
73
Y
89
i

105
y
121
A
<LF>
10
<SUB>
26
*
42
:
58

J
74
Z
90
j
106
z
122
B
<VT>
11
<ESC>

27
+
43
;
59
K
75
[
91
k
107
{

123
C
<FF>
12
<FS>
28
,
44
<
60
L
76

\
92
l
108
|
124
D
<CR>
13
<GS>
29
- = M ] m }

[Type text] Trang
9
Kỹ thuật Vi xử lý
45 61 77 93 109 125
E
<SO>
14
<RSI>
30
.
46
>

62
N
78
^
94
n
110
~
126
F
<SI>
15

<US>
31
/
47
?
63
O
79
_
95
o
111

<DEL>
127
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
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).
[Type text] Trang
10
Kỹ thuật Vi xử lý
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.
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
11
Kỹ thuật 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.

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ý
[Type text] Trang
12
Kỹ thuật 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 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
[Type text] Trang
13
Kỹ thuật Vi xử lý
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.

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ệ.
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ó
[Type text] Trang
14
Kỹ thuật Vi xử lý
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 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
15
Kỹ thuật Vi xử lý
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 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ì
[Type text] Trang
16
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

Kỹ thuật Vi xử lý
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ự
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
[Type text] Trang
17
Kỹ thuật Vi xử lý
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. Độ 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ỉ 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.
[Type text] Trang
18
xx x x IDO T S AxZ x P
x C
Các cờ của bộ vi xử lý 8086
X : Không được định nghĩa

. . chữ ci thường ở cột 6,7. Hình 3.3 Sơ đồ thanh ghi cờ của bộ vi xử lý 8086/88
Kỹ thuật Vi xử lý
 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.
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 ).
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ớ phụ 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ó.
[Type text] Trang
19
Chế độ
MIN
VI6
AI5

AI6/S3
AI7/S4
AI8/S5
AI9/S6
SS0
MN/MN
RD
HOLD
WR
IO/M
DT7R
DEN

ARE
ININ
IIST
READY
RESET
Chế độ
MAX
BIH
(RQ/GT0)
(RQ/GH)
(LOCK)
(S2)

(S1)
(S0)
(QS0)
(QS1)
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20

40
39
38
37
36
35
34
33
32
31
30
29

28
27
26
25
24
23
22
21
P
8088
[8086]
GND

A14
A13
A12
A11
A10
A9
A8
AD7
AD6
AD5
AD4
AD3

AD2
AD1
AD0
NMI
INRT
CLK
GND
AD14
AD13
AD12
AD11
AD10

AD00
AD91
AD81
Hình 35 . Sơ đồ chân của CPU 8088[8086]
Kỹ thuật Vi xử lý
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 ( direction 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ờ đã khá 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 C
67
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ệ giữa cờ OF với các cờ CF và C
67
tuân theo phương trình

sau:
OF = CF

C
67
.
Nghĩa là khi thực hiện các phép toán với số bù 2 có dấu, hiện tượng tràn sẽ xảy ra ( cờ OF = 1 )
nếu có nhớ từ MSB ( tất là SF ) sang CF nhưng lại không có nhớ vào chính nó ( SF ) hoặc ngược lại. Điều
này có thể tổng quát hoá cho các trường hợp làm việc với số bù 2 có dấu với độ dài 16/32 bit.
[Type text] Trang
20
Kỹ thuật Vi xử lý

Trước khi kết thúc phần mô tả cấu trúc của bộ vi xử lý để đi vào giới thiêu tập lệnh của 8088 ta
nói qua một chút về sự giống nhau vàkhác nhau giữa 8088 và 8086 là bộ vi xử lý 16 bit hoàn chỉnh, còn
8088 là bộ vi xử lý với 16 bit dữ liệu bên trong ( giống như 8086 ), nhưng khi ra ngoài bus dữ liệu của nó
chỉ còn 8 bit. Cấu trúc bên trong của 8088 và 8086 giống nhau về cơ bản, ngoài trừ hai điểm. Điểm khác
nhau đầu tiên là ở độ dài bộ nhớ đệm lệnh ( hàng đợi lệnh ) độ dài này ở 8088 là 4 byte còn ở 8086 là 6
byte; điều này sẽ có ảnh hưởng ít nhiều đến sự khác biệt về sự tốc độ xử lý của hai bộ CPU. Điểm khác
nhau thứ hai là ở kích thước của bus dữ liệu: ở 8088 là 8 bit còn ở 8086 là 16 bit ( trong khi ALU và các
thanh ghi của hai bộ CPU vẫn có độ dài như nhau. Điều này có ảnh hưởng nhiều đến công năng
( Perfomance ) và giá thành của hệ thống xây dựng trên cơ sở các bộ vi xử lý này. Đối với 8086 do bus dữ
liệu là 16 bit nó có thể đọc/ghi được một từ nằm ở hai ô nhớ thẳng hàng ( một từ trong bộ nhớ được coi là
xếp thẳng hàng khi ở địa chỉ chẵn làbyte thấp, ở địa chỉ lẻ là byte cao ) trong một chu kỳ đọc/ghi: còn ở
8088 do bus dữ liệu chỉ có 8 bit nên đọc/ghi một từ nằm ở hai ô nhớ thẳng hàng ( nằm liên tiếp như trên )

nó phải thực hiện trong hai chu kỳ đọc/ghi. Bù lại nhược điểm về tốc độ, 8088 có giá rẻ vàdùng để tạo ra
các hệ thống với giá phải chăng vì nó dể phối ghép với các thiết bị ngoại vi 8 bit đang thịnh hành lúc đó.
Điều khác nhau nữa tất yếu phải xảy ra là sự khác nhau trong việc bố trí các chân ở hai vi mạch như trên
hình 3.5 ( xem thêm phần giới thiệu cụ thể các tín hiệu tại các chân ở chương V ).
Mặc dù có những điểm khác nhau đã nêu, nhưng vì những điểm giống nhau là rất cơ bản và vì
hai bộ vi xử lý có tập lệnh giống nhau nên về quan điểm lập trình thì chúng là tương đương
2. Cách mã hoá lệnh củabộ vi xử lý 8088
[Type text] Trang
21
1 0 0 0 1 0
Opcode
D W

mod
REG
M/R
Byte 1
Byte 2
Disp
L
Disp
H
Byte 4
Byte 3
Hoặc

Di chuyển trực tiếp
phần thấp
Di chuyển trực tiếp
phần cao
Hình 3.6 Dạng thức Byte mã lệnh của lệnh MOV
Kỹ thuật Vi xử lý
Lệnh củabộ vi xử lý được ghi bằng các ký tự dưới dạng gợi nhớ ( memonic ) để người sử dụng
để nhận biết. Đối với bản thân bộ vi xử lý thì lệnh cho nó được mã hoá dưới dạng các số 0 và 1 (còn gọi là
mã máy ) vì đó là dạng biểu diễn thông tin duy nhất mà máy hiểu được. Vì lệnh do bộ vi xử lý được cho
dưới dạng mã nên sau khi nhận lệnh., bộ vi xử lý phải thực hiện việc giải mã lệnh rồi sau đó mới thực hiện
lênh. Việc hiểu rõ bản chất cách ghi lệnh bằng số hệ 2 cho bộ vi xử lý sẽ có lợi khi ta cần dịch “ bằng tay
“. Một lệnh gợi nhớ khi làm việc với các “ kit “ vi xử lý ( tuy rằng việc này ít khi xảy ra vì ta thường làm

việc với các hệ được trang bị chương trình dịch hợp ngữ ).
Một lệnh có thể có độ dài một vài byte tuỳ theo bộ vi xử lý. Giả thiết một bộ vi xử lý nào đó
dùng 1 byte để chứa các mã lệnh ( opcode ) của nó. Ta có thể tính được số lệnh lớn nhất mà 1 byte này có
thể mã hoá được là 256 lệnh. Trong thực tế việc ghi lệnh không phải hoàn toàn đơn giản như vậy. Việc mã
hoá lệnh cho bộ vi xử lý là rất phức tạp và bị chi phối bởi nhiều yếu tố khác nữa.
Đối với bộ vi xử lý 8088 một lệnh có thể có độ dài từ 1 đến 6 byte. Ta sẽ chỉ lấy trường hợp lệnh
MOV để giải thích cách ghi lệnh nói chung của 8088.
Lệnh MOV đích, gốc dùng để nguyển dữ liệu giữa 2 thanh ghi hoặc giữa 2 ô nhớ và thanh ghi. Chỉ
nguyên với các thanh ghi của 8088, nếu ta lần lượt đặt các thanh ghi vào các vị trí toán hạng đích và toán
hạng gốc ta thấy đã phải cần tới hàng trăm mà lệnh khác nhau để mã hoá tổ hợp các lệnh này.
Hình 3.6 biểu diễn dạng thức các byte dùng để mã hoá lệnh MOV. Từ đây ta thấy rằng để mã hoá
lệnh MOV ta phải cần ít nhất là 2 byte, trong đó 6 bit của byte đầu dùng để chứa mã lệnh. Đối với các

lệnh MOV. Để chuyển dữ liệu kiểu:
 Thanh ghi ↔ thanh ghi ( trừ thanh ghi đoạn ) hoặc
 Bộ nhớ ↔ thanh ghi ( trừ thanh ghi đoạn ) thì 6 bit đầu này luôn là 100010. Đối với các thanh ghi đạon
thì điều này lại khác.
Bit W dùng để chỉ ra rằng 1 byte (W = 0 ) hoặc 1 từ ( W = 1 ) sẽ được chuyển.
Trong các thao tác chuyển dữ liệu, một toán hạng luôn bắt buộc phải là thanh ghi. Bộ vi xử lý dùng
2 hoặc 3 bit để mã hoá các thanh ghi trong CPU như sau:
[Type text] Trang
22
Thanh ghi

W = 1

AX
PX
CX
DX
SP
DI
BP
SI
W = 0
AL
BL
CL

DL
AH
BH
CH
DH
000
011
001
010
100
111
101

110
Thanh ghi đoạn

CS
DS
ES
SS
01
11
00
10
Kỹ thuật Vi xử lý



Bit D dùng để chỉ hướng đi của dữ liệu. D = 1 thì dữ liệu đi đến thanh ghi cho bởi b bit của REG.
2 bit MOD ( chế độ ) cùng với 3 bit R/M ( thanh ghi/bộ nhớ ) tạo ra 5 bit dùng để chỉ ra chế độ địa
chỉ cho các toán hạng của lệnh ( có thể hiểu chế độ địa chỉ là cách tìm ra địa chỉ của toán hạng, xem thêm
phần sau của chương này để rõ hơn về chế độ địa chỉ.
Bảng 3.1 cho ta thấy cách mã hoá các chế độ địa chỉ ( cách tìm ra các toán hạng bằng các bit này ).
MOD
R/M
00 01 10 11
W=0 W=1
000 [BX]+[8] [BX]+[SI]+d8 [BX]+[SI]+d16 AL AX

001 [BX]+[DI] [BX]+[DI]+d8 [BX]+[DI]+d16 CL CX
010 [BP]+[SI] [BP]+[SI]+d8 [BP]+[SI]+d16 DL
DX
011 [BP]+[DI] [BP]+[DI]+d8 [BP]+[DI]+d16 BL
BX
100 [SI] [SI]+d8 [SI]+d16 AH
SP
101 [DI] [DI]+d8 [DI] +d16 CH
BP
110 d16
( a ch tr c ti p)Đị ỉ ự ế
[BP]+d8 [BP]+d16 DH SI

111 [BX] [BX]+d8 [BX]+d16 BH
DI
chế độ bộ nhớ chế độ thanh ghi
Ghi chú : - disp , 8bit ,d16: disp , 16bit
- Các giá trị cho trong các cột 2,3,4 (ứng với MOD =00,01,10) là các địa chỉ hiệu
dụng (EA) sẽ được cộng với DS để tạo ra địa chỉ vật lý (riêng BP phải được cộng
với SP )
Trong các ví dụ sau đây ta sẽ dùng các kiến thức nêu trên để mã hoá một vài lệnh MOV.
[Type text] Trang
23
1111 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1
MOV CL ,[BX]

Opcode
Chuyển tới thanh ghi
Chuyển 1 byte
mã hoá
CL
[ BX]
1111 000 001 0 10 110 00
MOV OF3H [SI] , CL
0 1 11 1 0 10 1
[SI]
CL
dS = F3H

Chuyển từ thanh ghi
1 Byte
Kỹ thuật Vi xử lý

3. Các chế độ địa chỉ của bộ vi xử lý 8088
Chế độ địa chỉ (addressing mode ) là cách để CPU tìm thấy toán hạng cho các lệnh của nó khi hoạt
động. Một bộ vi xử lý có thể có nhiều chế độ địa chỉ. Các chế độ địa chỉ này được xác định ngay từ khi
chế tạo ra bộ bi xử lý và sau này không thể thay đổi được. Bộ vi xử lý 8088 và cả họ 80x86 nói chung đều
có 7 chế độ địa chỉ sau:
1. Chế độ địa chỉ thanh gi ( register addressing mode ).
2. Chế độ địa chỉ tức thì ( immediate addressing mode ).
3. Chế độ địa chỉ trực tiếp ( direct addressing mode ).

4. Chế độ địa chỉ gián tiếp qua thanh ghi ( register indirect addressing mode ).
5. Chế độ địa chỉ tương đối cơ sở ( based indexed relative addressing mode ).
6. Chế độ địa chỉ tương đối chỉ số ( indexed relative addressing mode ).
7. Chế độ địa chỉ tương đối chỉ số cơ sở ( based indexed relative addressing mode ).
Các chế độ địa chỉ này sẽ được giải thích thông qua các chế độ địa chỉcủa lệnh MOV và lệnh
ADD.
*chế độ địa chỉ thanh ghi
Trong chế độ địa chỉ này người ta dùng các thanh ghi bên trong CPU như là các toán hạng để chứa
dữ liệu cần thao tác. Vì vậy khi thực hiện lệnh có thể đạt tốc độ truy nhập cao hon so với các lệnh có truy
nhập đên bộ nhớ.
Ví dụ:
MOV BX, DX ; chuyển nội dung DX vào BX.

MOV DS,AX ; chuyển nội dung AX vào DX
ADD AL,DL ; cộng nội dung AL và DL rồi đưa vào
*Chế độ địa chỉ tức thì
trong chế độ địa chỉ này toán hạng đích là một thanh ghi hay một ô nhớ, còn toán hạng nguồn là
một hằng số và ta có thể tìm thấy toán hạng này ở ngay sau mã lệnh ( chính vì vậy chế độ địa chỉ này có
tên là chế độ địa chỉ tức thì ). Ta có thể dùng chế độ địa chỉ này để nạp dữ liệu cần thao tác vào bất kỳ
thanh ghi nào ( trừ các thanh ghi đoạn và thanh cờ ) hoặc vào bất kỳ ô nhớ nào trong đoạn dữ liệu DS.
Ví dụ:
MOV CL, 100 ; chuyển 100 vào CL.
[Type text] Trang
24
Kỹ thuật Vi xử lý

MOV AX, OFFOH ; chuyển OFFOH vào AX để rồi đưa
MOV DS, AX ; vào DS ( vì không thể chuyển
; trực tiếp vào thanh ghi đoạn )
MOV ( BX ), 10 ; chỉ DS:BX.
Trong ví dụ cuối ta đã dùng chế độ địa chỉ gián tiếp qua thanh ghi để chỉ ra ô nhớ ( toán hạng
đích ) sẽ nhận dữ liệu ở chế độ địa chỉ tức thì ( toán hạng nguồn ). Tại đây ( BX ) có nghĩa là ô nhớ có địa
chỉ DS:BX.
*Chế độ địa chỉ trực tiếp
Trong chế độ địa chỉ này một toán hạng chứa địa chỉ lệnh của ô nhớ dùng chứa dữ liệu còn toán
hạng kia chỉ có thể là thanh ghi mà không được là ô nhớ.
Nếu so sánh với chế độ địa chỉ tức thì ta thấy ở đây ngay sau mã lệnh không phải là toán hạng mà
là địa chỉ lệch của toán hạng. Xét về phương diện địa chỉ thì đó là địa chỉ trực tiếp.

Ví dụ:
MOV AL, ( 1234H ) ; chuuyển nội dung ô nhớ DS:1234
; vào AL.
MOV ( 4320H ), CX ; chuyển nội dung CX vào 2 ô nhớ
; liên tiếp DS:4320 và DS:4321
*Chế độ gián tiếp qua thanh ghi
Trong chế độ địa chỉ này một toán hạng là một thanh ghi được sử dụng để chứa địa chỉ lệch của ô
nhớ chứa dữ liệu, còn toán hạng kia chỉ có thể là thanh ghi mà không được là ô nhớ ( 8088 không cho
phép quy chiếu bộ nhớ 2 lần đối với một lệnh ).
Ví dụ:
MOV AL, ( BX ) ; chuyển nội dung ô nhớ có địa
; chỉ DS:BX vào AL.

MOV ( SI ), CL ; chuyển nội dung CL vào ô nhớ
; có địa chỉ DS:SI.
MOV ( DI ), AX ; chuyển nội dung AX vào 2 ô nhớ
; liên tiếp có địa chỉ DS:DI và
; DS: ( DI + 1 ).
*Chế độ địa chỉ tương đối cơ sở
Trong chế độ địa chỉ này các thanh ghi cơ sở như BX và BP và các hằng số biểu diễn các giá trị
dịch chuyển ( displacement values ) được dùng để tính địa chỉ hiệu dụng của toán hạng trong các vùng
nhớ DS và SS. Sự có mặt của các giá trị dịch chuyển xác định tính tương đối ( so với cơ sở ) của địa chỉ.
Ví dụ:
MOV CX, ( BX ) +10 ; chuyển nội dung 2 ô nhớ liên
; tiếp có địa chỉ DS: ( BX + 10 ) và

; DS: ( BX+10 ) vào CX.
MOV CX, ( BX+10 ) ; một cách viết khác của lệnh trên .
MOV CX, 10 ( BX ) ; một cách viết khác của lệnh đầu.
MOV AL, ( BP ) +5 ; chuyển nội dung ô nhớ SS: ( BP+5 )
; vào AL.
ADD AL, Table ( BX ) ; cộng AL với nội dung ô nhớ do
; BX chỉ ra trong bảng table
; ( bảng này nằm trong DS ), kết
; quả dựa vào AL.
Nhân đây cần làm rõ một số thuật ngữ hay dùng thông qua các ví dụ trên.
[Type text] Trang
25

×