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
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
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
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
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ó
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).
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)
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>
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
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
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>
<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.
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ỏ
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í
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
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.
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
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.
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
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
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
.
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
DL
AH
BH
CH
DH
000
011
001
010
100
111
101
110
Thanh ghi đoạn
Mã
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ỉ.
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.
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