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

KĨ THUẬT VI XỬ LÍ

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 (6.85 MB, 187 trang )

VĂN THẾ MINH

KĨ THUẬT VI XỬ LÍ
Tài liệu dùng cho sinh viên, kĩ sư chuyên ngành Điện tử,
Tin học, Viễn thông, Đo lường, Tự động..

NHÀ XUẤT BẢN GIÁO DỤC 1997

2


LỜI NÓI ĐẦU
Các bạn đang có trong tay cuốn giáo trình Kỹ thuật vi xử lý dành cho
sinh viên các năm cuối ngành Công nghệ thông tin và Điện tử - Viễn thông,
trường ĐHBK Hà Nội.
Giáo trình này dược hình thành trên cơ sở các kinh nghiệm đúc rút từ
các bài giảng của môn học kỹ thuật vi xử lý cho sinh viên các ngành nói trên
trong những năm học vừa qua, với mục đích cung cấp cho sinh viên các kiến
thức cơ bản như có tính hệ thống liên quan đến môn học này.
Tốt nhất khi học môn kỹ thuật vi xử lý sinh viên các ngành nói trên đã
phải được học qua các môn học khác có liên quan như: Kỹ thuật mạch điện tử,
Kỹ thuật mạch logic, Kiến trúc và tổ chức máy tính. Trong giáo trình Kỹ thuật
vi xử lý, các kiến thức của các môn học nói trên được coi như là những kiến
thức cơ sở cần thiết để tiếp thu các vấn đề của kỹ thuật vi xử lý.
Giáo trình Kỹ thuật vi xử lý thông qua bộ vi xử lý 8086/88 và các mạch
liên quan của Intel sẽ cung cấp cho sinh viên các khái niệm chủ yếu về một hệ
vi xử lý 16 bit: cấu trúc và nguyên tắc hoạt động của một hệ vi xử lý gồm CPU
cùng các mạch phụ trợ, tập lệnh của bộ vi xử lý, cách lập trình bằng hộp ngữ,
các phương thức điều khiển việc vào/ra dữ liệu trong hệ vi xử lý và cuối cùng
là cách thực hiện một số phối ghép cơ bản trong hệ vi xử lý. Trong phần cuối,
giáo trình còn cung cấp cho sinh viên một số kiến thức sơ bộ về những bó vi xử


lý tiên tiến khác của Intel.
Phần phụ lục của giáo trình cung cấp thêm cho sinh viên các thông tin
về c chương trình gỡ rối (tìm lỗi) Debug, các tuỳ chọn của chương trình
MASM và LINK, các dẫn hướng chương trình dịch của MASM 5.0 và khả
năng tra cứu tỷ mỉ các hàm ngắt chính của DOS và BIOS cho máy IBM PC.
Tuy đã rất chú ý và cẩn thận trong quá trình biên soạn nhưng vì trình độ
và thời gian có hạn nên giáo trình này chắc chắn sẽ còn nhiều thiếu sót về mọi
mặt, tác giả chân thành mong bạn đọc gần xa đóng góp nhiều ý kiến để giáo
trình này ngày càng được hoàn thiện hơn. Thư góp ý xin gửi về bộ môn Kỹ
thuật tính, khoa Công nghệ thông tin, trường ĐHBK Hà nội.
Hà Nội ngày 15/9/1997
Tác giả

3

4


tiên bên trái trong dãy các số hệ hai gọi là bit có ý nghĩa lớn nhất (Most
significant bit, MSB), còn bit cuối cùng bên phải trong dãy gọi là bit có ý nghĩa
bé nhất (Least significant bit, LSB). Ứng với việc đếm thứ tự 1, 2, 3...ở hệ
mười thì ở hệ hai ta có 1, 10, 11...

CHƯƠNG 1

CÁC HỆ ĐẾM
VÀ VIỆC MÃ HOÁ THÔNG TIN
TRONG MÁY TÍNH

Hình 1.1. Các đơn vị đo độ dài của số hệ hai dẫn xuất từ bit.


1 . Các hệ đếm dùng trong máy tính
1.1. Hệ mười và bệ 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 (decimal number system, viết tắt là hệ D) để biểu diễn các giá trị
số. Điều này là rất tự nhiên vì từ xa xưa một con người bình thường đã biết
dùng 10 ngón tay của mình (và tất nhiên lúc bí quá có thể dùng thêm cả ngón
chân!) 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 ở cuối để chỉ ra rằng đó là số hệ mười (ta cũng có thể
bỏ 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 một giá trị số chúng ta
dùng hệ cơ số hai hoặc nói gọn hơn hệ hai (Binary number system, viết tắt là
hệ B), trong đó chỉ tồn tại 2 chữ số 0 và 1 để biểu diễn các giá trị số (ứng với 2
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 nên máy). 0
và 1 cũng là các giá trị có thể có của một chữ số hệ hai (Binary digit, viết tắt là
bit). Hệ hai là hệ đếm dùng trong các máy tính. Một số hệ hai gồm các bit
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ẽ tạo
thành 1 từ (word), cụm 32 bit sẽ tạo thành 1 từ kép (double word). Chữ số đầu
5

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ố 10i tương ứng lần lượt như sau:
12345,67=1.104+2.103+3.102+4.101+5.100+6.10-1+7.10-2
Tương tự như vậy , một số hệ hai viết như sau : 10111,01
sẽ có giá trị số bằng tổng của các tích giữa các hệ số 1, 0, 1, 1, 1,0,1, 1 với các
trọng số 2i tương ứng lần lượt như sau:
=1.24 +0.23 + 1.22 + 1.21 + 1.20 +0.2-l + 1.2-2
Các thuật toán thường dùng để chuyển đổi giữa hai hệ trên:
6


• Đổi số hệ hai sang hệ mười

Ví dụ: Đổi số 34 sang hệ hai (hình 1.1). Kết quả được 100010B.

Muốn đổi một số từ hệ hai sang hệ mười chỉ cần tính các các giá trị 2i
tương ứng với các chữ số khác không thứ i của số hệ hai rồi cộng lại như đã
nói ở trên:
Ví dụ
10111,11 B = 24+22+21+20+2-1+2-2 = 25,75
Ngược lại muốn chuyển một số từ hệ mười sang số hệ hai ta có thể làm
theo 2 cách:
• Cách 1 để đổi số hệ mười sang hệ hai
Quy tắc: Lấy số hệ mười cần đổi trừ đi 2x (x là giá trị lớn nhất của số
mũ chọn sao cho 2x nhỏ hơn hoặc bằng so với số hệ mười cần đổi ghi lại giá trị
1 cho chữ số hệ hai ứng với 2x. Tiếp tục làm như vậy đối với số dư do phép trừ
trên tạo ra và các số 2i bậc thấp hơn cho tới khi đạt tới 20 và ghi lại các giá trị
(0 hoặc l) cho chữ số hệ hai thứ i tuỳ theo quan hệ giữa số dư và lũy thừa tương
ứng:
1, khi số dư lớn hơn hoặc bằng 2i


Các số dư trong khung sẽ được sắp xếp thứ 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

0, khi số dư nhỏ hơn so với 2i (và phép trừ không được thực hiện).
Ví dụ: Đổi số 34 sang 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 .

Các giá trị 2i cần tính đến (25 = 32 là giá trị 2x sát dưới nhất so với số 34)
25

24

23

22

21

20


Các chữ số hệ hai tính được:
1

0

0

0

1

Ví dụ. Đổi 0,125 ra số hệ hai.
Ta thực hiện phép nhân lần lượt theo các bước trên:

0

Như vậy 34 =100010 B.
• Cách 2 để đổi số bệ 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à
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.
7

0,125 x 2

=

0 , 250


0,250 x 2

=

0 , 500

0,500 x 2

=

1 , 000

và thu được kết quả là 0,125 = 0,001 B (phần được đóng trong khung).

8


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.

a

b

y

c

a


b

y

c

0

0

0

0

0

0

0

0

1.2. Số BCD (số hệ mười mã hoá bằng hệ hai)

0

1

1


0

0

1

1

1

1

0

1

0

1

0

1

0

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ã hoá bằng hệ hai (Binary Coded Decimal number), rất thích hợp cho
các thiết bị đo 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ã hoá 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.

1

1

1

1

1

1

0

0

C: nhớ (Carry)
Ví dụ
Cộng hệ mười
11
099
095
194

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 2 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ủa 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 bộ để 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

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.

y=a+b

Cộng hệ hai
1111 1110
0110 0011
0101 1111
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
49
Số trừ
0011 0001
060
Hiệu
0011 1100
b) Số bù hai

2.1. Phép cộng

Bảng 1.1. Quy tắc phép cộng

Nhớ
Số hạng 1
Số hạng 2
Tổng

B: Mượn (Borrow)


Bảng 1.2. Quy tắc phép trừ
y=a-b
9

Trong khi làm phép 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ã hoá 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ã hoá kiểu số bù hai.
10


Bảng 1.3 chỉ ra cách tạo ra các số hệ hai có dấu và bố hù 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
hệ hai
0000 0000
0000 0001
0000 0010
...
0111 1101
0111 1110
0111 1111
1000 0000
1000 0001
1000 0010

...
1111 1101
1111 1110
1111 1111

Số hệ mười
tương đương
0
1
2
...
125
126
127
128
129
130
...
253
254
255

Số hệ mười theo
mã hệ hai có dấu
+0
+1
+2
...
+125
+126

+127
-0
-1
-2
...
-125
-126
-127

Số hệ mười tính
theo mã bù hai
+0
+1
+2
...
+125
+126
+127
-128
-127
-126
...
-3
-2
-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 (sum and magnitude) ta phải mất 1 bộ để 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ú ý hai giá trị 0 khác 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 bộ để biểu diễn giá trị của số được mã hoá. 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ố đương có mã bù hai giống như mã hệ hai thông thường.

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ử
đươ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 bít của số trên)
cộng thêm 1 :
số bù hai của 13:
1111 0011 B (tức là -13)
Có thể lấy một ví dụ khác để chứng tỏ kết quả trên là đúng và qua đó
cũng thấy được ứng dụng của số bù hai trong khi làm phép trừ.

Ví dụ: 15 - 13 = ?
Ta có thể viết lại phép trừ.trên thành Phép cộng 15+(-13) và sử dụng
kết quả vừa tính được ở trên cho số (-13):
15
...
0000 1111
(-13)
...
1111 0011
tổng
...
0000 0010 (nhớ 1)
Nếu không để ý đến nhớ ta có kết quả là 2.
Ví dụ: 12 - 13 = ?
12
...
(-13)
...
tổ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ố

11

12

0000 1100

1111 0011
0000 0010

(tức -1)


Đây là một số âm (bit b7=l) với giá trị tuyệt đối là 1 (tra theo bảng l.3).
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ả nói trên ...
0000 0000
cộng 1 để 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 số hệ 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 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 độ đài 4 bộ để làm sáng tỏ thuật toán nhân.
1001
0110
0000
1001
1001
1001
0110110

Số bị nhân (9)
Số nhân (6)
Thành phần 1 của tổng

Thành phần 2 của tổng
Thành phần 3 của tổng
Thành phần 4 của tổng
Tổng tích luỹ (54)

tích
tích
tích
tích

• Thành phần đầu tiên của tổng tích luỹ thu được là tích cửa số LSB trong
số nhân với số bị nhân. Nếu LSB = 0 thì thành phần này cũng bằng 0, còn
nếu LSB = 1 thì thành phần này chính bằng số bị nhân.
• Mỗi thành phần thứ i tiếp theo của tổng tích luỹ sẽ tính được bằng cách
tương tự, nhưng phải dịch trái i bit (có thể bỏ qua các thành phần bằng 0).
• Tổng của các tổng thành phần là tích cần tìm.
Để minh hoạ cho thuật toán trên, ta dùng luôn nó để rút gọn ví dụ đã
làm trước đây như sau:
1001
Số bị nhân (9)
0110
Số nhân (6)
1001
Số bị nhân dịch trái 1 lần
1001
Số bị nhân dịch trái 2 lần
0110110
Tổng tích luỹ (54)
2.4. Phép chia
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 địch liên tiếp cho tới khi không
thể trừ được nữa (đã không còn gì để trừ hoặc sớm 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
000
1000
101
111
101
101
101
0

luỹ
luỹ
luỹ
luỹ

Độ 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 bộ 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:
13


101
0111

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).

14


2 . Lấy số bị chia trừ đi số chia.

3. Mã ASCII mã tiêu chuẩn cho trao đổi thông tin.

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
đưa kết quả cuối, cùng là 0 (chia hết) hoặc nhỏ hơn số chia (chia còn dư) .
Vi dụ: 86/5 = 7, dư 1. Thực hiện phép chia này trong hệ hai.
Đầu tiên ta có 5 = 0101 B và số bù hai của nó là 1011 B.
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 hệ kê ra nhu sau:

Toán hạng
0 100100
1 011000
1 111100
1
0
0
1
1
0

111100
101000
100100
00100
01100
10000

1 0000
1 0110
0 0110
0 110
1 011
0 001

Thương

0

Tên toán hạng, thao tác

Số chia
Số ở mã bù hai để cộng
Tổng, kết quả 1 (kq1)

1

kq1
Số chia ở mã hệ
Số bị chia
Số bị chia dịch
Số bị chia ở mã
Tổng, kết quả 2

1

kq2 dịch trái 2 lần
Số chia ở mã bù 2 để cộng
Tổng, kết quả 3 (kq3)

1

kq3 dịch trái 3 lần
Số chia ở mã bù 2 để cộng
Tổng, kết quả 4 (kq4)

2 để cộng
trái 1 lần
bù 2 để cộng
(kq2)


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. Trong thực tế thông tin được truyền

Bit dấu.
Từ đây ta rút ra 36/ = 7 và dư 1.

15

16


đ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 một loại mã được dùng rất rộng rãi gọi là mã ASCII
(Amenican 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.

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ã hoá số cần biểu diễn.
Ví dụ sau minh hoạ 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 l001B = 39H
Mã BCD không gói của 5 là 0000 0101B = 05H
Mã BCD không gói của 9 là 0000 1001B = 09H
Mã BCD gói (chuẩn) của 59 là 0101 l001B = 59H


Trong bảng mà ASCII tiêu chuẩn, người ta dùng 7 bit để mã hoá 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ừ 1..
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, nhâ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.

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ý.

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> (horizon 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): 20H;
“$”: 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 đành riêng cho các ký tự ngăn cách.
3. Các ký tự số nằm ở cột 3. Mã của ký tự '0' là 30H, '9' là 39H.
Giữa giá trị số và mã ASCII của số đó có khoảng cách là 30H .
4. Các chữ cái hoa nằm ở các cột 4, 5, các chữ cái thường ở cột 6, 7.
Khoảng cách giữa chữ thường và chữ hoa cùng tên là 20H.
4. Quan hệ giữa mã ASCII với số BCD
Trong khi làm toán với các số BCD ta thường kết hợp 2 số BCD thành
1 byte. Dạng số BCD viết theo kiểu này gọi là dạng BCD chuẩn hay còn được
gọi là dạng BCD gói (packed BCD): Khi lưu trữ, khi hiện thị hoặc khi truyền
giữa các thiết bị các giá trị số 0 . . 9, thực chất ta làm việc với mã ASCII của
các số đó, tức là các số 30H..39H. Như vậy ta thấy trong 1 byte mã ASCII biểu
diễn các số 0 .. 9 có 4 bit thấp ứng với mã BCD của chính các số đó, 4 bit cao
bao giờ cũng ứng với mã BCD của số 3 (tức là 0011B). Nếu trong byte mã
ASCII này ta thay 4 bit cao bằng 0H thì ta thu được số BCD không gói. Nói

17

18


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à máy IBM
4381, Honeywell DSP8. Loại máy mạnh nhất trong số 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

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ý trung tâm được dùng như là một bộ phận chủ chốt trong các máy tính
của các thế hệ trước Để nắm bắt được tính liên tục và tính kế thừa 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 sơ qua 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 trú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 tính điện tử đã và đang được
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 độ rất nhanh. Nó thường làm việc với số liệu với độ dài từ 64
bộ hoặc hơn nữa và được trang bị bộ nhớ rất lớn. Chính vì vậy máy tính lớn
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

19

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 to vào đó thì sẽ
gây ra 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ừ là 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 dùng cho các tính toán khoa học kỹ thuật, gia công dữ liệu qui mô
nhỏ hay để điều khiển quá trình công nghệ. Tiêu biểu cho nhóm này là các máy
VAX 6360 của Digital Equipment Corporation và MV/8000II của Data
General.

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ỏ Vi mạch (one chip microcomputer) hoặc một hệ vi xử lý có
khả năng làm việc với dữ 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ó thể có tính năng 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 đặc điểm tiêu
biểu dễ nhận biết của các loại máy vì 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 scale of integration) mà người ta quen gọi là
các bộ vi xử lý (microprocessor, µ p). Các bộ vi xử lý hiện có trên trí; 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 rất 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 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 ta sẽ đưa
ra các bảng tổng kết trong đó nêu ra các thông số chính của các bộ vi xử lý thế
hệ gần đây nhất của 2 nhà cung cấp nổi tiếng là Intel và Motorola.
20


các bộ vi xử lý trong thế hệ này đều được sản xuất bằng công nghệ HMOS và
cho phép đạt được tốc độ từ 0,1-1 µ s/lệnh với tần số đồng hồ fclk : 5-10 MHZ.

2. Sự phát triển của các bộ vi xử lý
2.1. Thế hệ 1 (1971 - 1973) .

Năm 1971 , trong khi phát triển các vi mạch, dùng cho máy tính cầm
tay, Intel đã cho ra đời bộ vi xử lý đầu tiên là 4004 (4 bộ số liệu, 12 bộ địa chỉ):
sau đó Intel và các nhà sản xuất khác cũng lần lượt cho ra đời các bộ vi xử lý
khác: 4040 (4 bit) và 8008 (8 bit) của Intel, PPS-4 (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 ít (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á rẻ và chỉ có khả năng đưa ra dòng tải nhỏ,
• Tốc độ thực hiện lệnh: 10-60 µ s/lệnh với tần số đồng hồ fclk 0,1-0,8
MHz, Tập lệnh đơn giản và phải cần nhiều vi mạch phụ trợ mới tạo nên một
hệ vi xử lý hoàn chỉnh.
2.2. Thế hệ 2 (1974 - 1977)
Các bộ vi xử lý đại diện trong thế hệ này lả các vi xử lý 8 bit 6502 của
MOS Technology. 6800 và 6809 của Motorola, 8080 và 8085 của Intel và đặc
biệt là bộ vi xử lý Z80 của Zilog. Các bộ vi xử lý này có tập lệnh phong phú
hơn và thường có khả năng phân biệt địa chỉ bộ nhớ với dung lượng đến 64kb.
Có một số bộ vi xử lý còn có khả năng phân biệt được 256 địa chỉ cho các thiết
bị ngoại vi (họ Intel và Zilog).
Chúng đã được sử dụng rất 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
độ phần tử trên một đơn vị diện tích cao hơn so với công nghệ PMOS) hoặc
CMOS (tiết kiệm điện năng tiêu thụ) cho phép đạt được tốc độ từ 1-8 µ s/lệnh
với tần số đồng hồ fclk = 1-5 MHz.
2.3. Thế hệ 3 (1978 - 1982)
Các bộ vi xử lý trong thế hệ này có đại điện là các bộ vi xử lý l6 bit
8086/80186/80286 của Intel hoặc 68000/68010 của Motorola. Một điều tiến 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 án (từ 1 MB đế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. PCIXT, PCIAT và các máy Macintosh của Apple. Phần lớn

21

Trong thời kỳ này cũng xuất hiện các máy vi tính 8 bít 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 bộ trong 1 vỏ như MC 14500B và 4
bộ trong 1 vỏ như MC 141000B
2.4. Thế hệ 4 (1983 - ?)
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, các vi xử lý 32 bộ 68020/68030/
68040/68060 của Motorola.
Đặc điểm của các bộ vi xử lý thế hệ này là 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 đòng mã lệnh (pipeline), bộ
nhớ cache (bộ nhớ ẩn), bộ nhớ ảo. Các bộ vi xử lý này đều có bộ quản lý bộ
nhớ (MMU) và nhiều khi cả các bộ đồng xử lý toán học ở bên trong. Chính nhờ
các cải tiến đó mà các bộ vi xử lý thế hệ này có khả năng cạnh tranh được với
các máy tính nhỏ trong rất nhiều lĩnh vực ứng dụng. Phần lớn các bộ vi xử lý
thế hệ này đều được sản xuất bằng công nghệ HCMOS.
Một số thông số chính của các bộ vi xử ly của . Intel và Motorola được
cho trong bảng 2.1 và 2.2.
Bảng 2.1.a. Các bộ vi xử lí 16 bit của Intel

Năm sản xuất
Fclk max (đồng hồ nhịp)

MIPS (triệu lệnh/s)
Số transistor
Bus số liệu
Bus địa chỉ
Khả năng địa chỉ
Số chân
Chế độ bộ nhớ ảo
Có bộ quản lý bộ nhớ ở bên
trong
Đồng xử lý toán học

22

8086
6/1978
10 Mhz
0,33
29.000
16 bit
20 bit
1 MB
40
không
không

8088
1979
10 Mhz
0,33
29.000

8 bit
20 bit
1 MB
40
không
không

80286
2/1982
20 Mhz
1,2
134.000
16 bit
24 bit
16 MB
68



8087

8087

80287


Bảng 2.1.b. Các bộ vi xử lí 32 bit của Intel
Năm sản xuất
Fclk max (đồng hồ
nhịp)

MIPS (triệu lệnh/s)

Số transistor
Bộ nhớ Cache
Bus số liệu
Bus địa chỉ
Khả năng địa chỉ
Số chân
Chế độ bộ nhớ ảo
Có bộ quản lý bộ
nhớ ở bên trong
Đồng xử lý toán
học

386DX
10/1985
40 Mhz

386SX
6/1988
33 Mhz

486DX
4/1989
50 Mhz

386SX
4/1991
25 Mhz


486DX2
3/1992
66 Mhz

Pentium
5/1993
100 Mhz

6
275.000
Bên ngoài, do
82385 đ.khiển

2,5
275.000
Bên ngoài, do
82385 đ.khiển

20
1,2 triệu
I/D cache
8KB

16,5
1,18 triệu
I/D cache
8KB

52
1,2 triệu

I/DCache
8KB

32 bit
32 bit
4 GB
132



16 bit
24 bit
16 MB
100



32 bit
32 bit
4 GB
168



32 bit
32 bit
4 GB
168




32 bit
32 bit
4 GB
168



112
3,1 triệu
ICache 8KB
DCache 8KB
64 bit
32 bit
4 GB
273



80387DX

80387SX

bên trong

80387SX

bên trong

bên trong


Ghi chú: I/D cache: bộ nhớ cache (ẩn) chung cho lệnh và dữ liệu
ICache: bộ nhớ cache cho lệnh. Dcache: bộ nhớ cache cho dữ liệu

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ín với tập lệnh đầ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 đựng các máy tính với tập lệnh rút gọn (reduced instruction set
computer, RISC) 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 các
hãng Apple-Motoro1a -IBM... Có lẽ hãy còn sớm, nhưng cũng đã có khá 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 bộ 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 ta đã thấ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 kết hợp
thêm với các bộ phận điện tử khác như bộ nhớ và các 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 trong những ứng dụng cụ thể của 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ý.

Hình 2.1. Sơ đồ khối của hệ vi xử lý với các thanh ghi trong và ngoài.
Trong sơ đồ này ta thấy rõ các khối chức năng chính của hệ vi xử lý
gồm:

23

24



+ Khối xử lý trung tâm (central processing unit, CPU),.
+ Bộ nhớ bán dẫn(memory, M),
+ Khối phối ghép nối các thiết bị ngoại vi (input/output, I/O),
+ 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 tập các đường dây. để
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 dạng các
bit 0 và bit 1 từ bộ nhớ, đâu đó nó sẽ giải mã các lệnh này thành dãy các 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 dược việc này bên trong CPU có thanh
ghi đù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 counter, PC), một
số thanh ghi đa năng khác cùng bộ tính toán số học và lôgic (ALU) để thao tác
với dữ liệu. Ngoài ra ở đây còn có các hệ thống mạch điện tử rất phức tạp để
giải mã .lệnh và từ đó tạo ra các xung điều khiển cho toàn hệ.
Bộ nhà bán dẫn hay còn gọi là bộ nhớ trong là một bộ phận khác rất quan
trọng của hệ vi xử lý. Tại đây (trong ROM) ta có thể chứa chương trình điều
khiển hoạt động của toàn hệ để khi bật điện thì CPU có thể lấy lệnh từ đây mà
khởi đầu hệ thống. Một phần của chương trình điều khiển hệ thống, các
chươ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 giao 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 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 ta 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 hệ ra ngoài.
Tuỳ 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 đự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 bộ địa chỉ. Khi đọc/ghi bộ nhớ CPU sẽ đưa ra trên bus này
địa chỉ của ô 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ỉ hoá được 2N = 65536=64 Kilô ô nhớ khác nhau (l K = 210 = l024). Khi
đọc/ghi với cổng vuông CPU cũng đưa ra trên bus địa chỉ các bộ địa chỉ tương
25

ứ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
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 tuỳ 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ử lý cùng một lúc. Chiều mũi tên trên bus số liệu chỉ ra rằng
đây là bus 2 chiều, nghĩa là dữ liệu có thể được 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 trạng thái đề có thể ghép vào được và hoạt
động bình 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 các tín hiệu

điều khiển từ các khối đó để phối hợp hoạt động của toàn hệ nên các tín hiệu
này trên trên hình vẽ được thể hiện bởi các đường có mũi tên theo 2 chiều, điều
đó không phải là để chỉ tính 2 chiều của một tín hiệu mà là tính 2 chiều của cả
nhóm tín hiệu.
Hoạt động cửa hệ thống vi xử lý trên cũng có thể được 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à ngoà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.

26


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ý 8088 của
Intel.
Trước hết cần nói rõ lý do tại sao ở đây ta lại chọn đích danh bộ vi xử
lý 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 cũng đã 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à vì tính kế thừa của các sản phẩm trong
họ 80x86, các chương trình viết cho 8088 vẫn có thể chạy được 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ì vậy việc 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ý của các hãng 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ủa 8088, ta sẽ có cơ sở để
nắm bắt được 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 khí 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ủa bộ vi xử lý Intel 8088:

27

28


1.1. BIU và EU
Theo sơ đồ khối trên hình 8.1 ta thấy bên trong CPU 8088 có 2 khối
chính: khối phối ghép bus (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 các 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 đi và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 khả năng 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à ta 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
and 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ì giải mã lệnh và
thực hiện 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ý 8086/88 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 trong 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 (opcode fetch), giải
mã lệnh (decode) và thực hiện lệnh (execution). Trong một thời điểm nhất định,
CPU thế hệ này chỉ có thể thực hiện một trong ba công việc nói trên và vì vậy
tuỳ theo từng giai đoạn sẽ có những bộ phận nhất định của CPU ở trạng thái
nhàn rỗi. Chẳng hạn, khi CPU giải mã lệnh hoặc khi nó đang thực hiện những
lệnh không liên quan đến bus (thao tác nội bộ) thì các bus không được dùng vào
việc gì dẫn dấ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
29


thời và các bus sẽ liên tục đượ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 2 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 gặp các lệnh này nội dung cũ 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ự.

Hình 3. 2. Dòng lệnh thường và dòng lệnh xen kẽ liên tục
Trong bộ vi xử lý 8088 ta còn thấy có các thanh ghi 16 bit nằm trong cả
2 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 dưa ra trên bus địa chỉ 20 bit địa chỉ, như vậy 8088 có khả
năng phân biệt ra được 220 = l.048.576 = 1 M ô nhớ hay 1 Mbyte 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à 1
Mbyte. Trong không gian 1 Mbyte này 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ả trung gian của chương trình và
- 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

30


ghi đoạn dữ liệu DS (Data segment), 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 bộ này chỉ ra địa chỉ đầu của 4 đ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 4 đ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 tương ứng có thể dịch chuyển linh hoạt trong
phạm vi không gian 1 Mbyte, vì vậy các đoan 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 độ dài 64 Kbyte và
vì thế những đoạn khác có thể bắt dầ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 1Mbyte.
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 dượ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 tọa
độ 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 bộ 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
để 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 đó nó tạo ra địa chỉ vật lý theo công thức sau:

Địachỉvậtlý = Thanhghiđoạnx16+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:

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 2 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 tình 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ỉ do 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
1000H
1200H
1004H
0300H
...

2345H
0345H
2305H
E345H
...

• Các thành ghi đa năng
Trong khối EU có 4 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 này có thể tách ra
thành 2 thanh ghi 8 bit cao và thấp để làm việc độc lập, đó là các cặ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ể được dùng một cách vạn năng để chứa các
loại dữ liệu khác nhau, nhưng cũng có những 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 gán cho những cái tên đặc biệt rất có ý nghĩa. Cụ thể:

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 chi cụ thể bên trong CPU và khi cần thiết truy nhậ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.l).
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ã. Nếu tại một thời điểm nào đó ta có CS-F000H và IP=FFF0H thì



AX (Accumulator, Acc): thanh chứa. Các kết quả 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 được coi là Acc.



BX (Base): thanh ghi cơ sở, thường chứa địa chỉ cơ sở của một bảng
dung 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 chứa 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 AX tham gia vào các thao tác
của phép nhân hoặc chia các số 16 bit. DX còn dùng để chứa địa chỉ
cả các cổng trong các lệnh vào/ra dữ liệu trực tiếp (IN/OUT).

CS:IP ~ F000Hx16 + FFF0H = F000CH + FFF0H = FFFF0H
Địa chỉ FFFF0H 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ớ
31

Thanh ghi lệch

32




Các cờ cụ thể

Các thanh ghi con trỏ và chỉ số .

Trong 8088 còn có 3 thanh ghi con trỏ và 2 thanh ghi chỉ số 16 bộ. 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ỉ đầy đủ của đỉ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 chi 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 thao 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.

• C hoặc CF (Carry Flag): cờ nhớ, CF = 1 khi cờ nhớ hoặc mượn từ MSB.
• 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 1 trong kết
quả là chẵn (even parity, parity chẵn). Ở đây ta tạm dùng từ 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 parity’ thành tính chẵn lẻ lẻ.
• A hoặc AF (auxiliary 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 mượn từ một số BCD
thấp (4 bit thấp) sang một ao BCD cao (4 bit cao).
• Z hoặc ZF (zero flag): cờ rỗng ZF = 1 khi kết quả bằng 0.
• S hoặc SF (sign flag) cờ dấu, SF = 1 khi kết quả âm.
• hoặc OF (overflow flag): cờ tràn OF = 1 khi kết quả là một số bù hai
vượt ra ngoài giới hạn biểu diễn dành cho nó.

Trên đây là 6 bit cờ trạng thái phản ảnh các trạng thái khác nhau của
kết quả 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 bộ 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):



• Thanh ghi cờ FR (Flag regtster)
Đây là thanh ghi khá đặc biệt trong CPU, mỗi bộ 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 bộ của nó để làm các
bit cờ (hình 3.3).



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ù hai có dấu. Để cho việc giải thích được đơn giản,

đầu tiên giả thiết làm việc với số bù hai dài 8 bit, kết quả để ở AL (xem hình
3.4). Gọi C67 là cờ nhớ từ bit 6 (b6) lên bit 7 (b7), trong đó b7 là MSB và cũng
chính là bit dấu (SF) của AL. Ta có thể chứng minh được rằng quan hệ giữa cờ
OF với các cờ CF và C67 tuân theo phương trình sau:
OF = CF ⊕ C67
Nghĩa là khi thực hiện các phép toán với số bù hai có dấu hiện tượng
tràn đẽ xẩy ra (OF=1) nếu có nhớ từ MSB (tức là từ 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ù hai có dấu với độ dài 16/32 bit.

33

34


CF

b7

b6

AL

b0

giữa 8088 và 8086. 8086 là bộ vi xử lý 16 bộ hoàn chỉnh, còn 8088 là bộ vi xử
lí với 16 bộ dữ liệu bên trong (giống như 8086), nhưng khi ra ngoài bus dữ liệu
của nói 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ừ 2 đ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ề tốc độ xử lý của 2 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 2 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 ở 2 ô nhớ ‘thẳng hàng’ (1 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 1 chu kỳ đọc/ghi: còn ở 8088 do bus dữ liệu chỉ có 8 bit nên để
đọc/ghi 1 từ nằm ở 2 ô nhớ ‘thẳng hàng’ (nằm liên tiếp như trên), nó phải thực
hiện trong 2 chu kỳ đọc/ghi. Bù lại nhược điểm về tốc độ, 8088 có giá rẻ và
được 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 ở 2 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. 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ì 2 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.

C67
1.2. 8086 và 8088

GND
[AD14]
[AD13]
[AD12]
[AD11]
[AD10]
[AD9]
[AD8]


A14
A13
A12
A11
A10
A9
A8
AD7
AD6
AD5
AD4
AD3
AD2
AD1
AD0
NMI
INTR
CLK
GND

1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18
19
20

µP
8088
[8086]

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

25
24
23
22
21

Chế độ
MIN
Vcc
A15
A16/S3
A17/S4
A18/S5
A19/S6
SS0
MN/MX
RD
HOLD
HLDA
WR
IO/M
DT/R
DEN
ALE
INTA
TEST
READY
RESET

Chế độ

MAX

(BHE/S7)

2. Cách mã hoá lệnh của bộ vi xử lý 8088

(RQ/GT0)
(RQ/GT1)
(LOCK)
(S2)
(S1)
(S0)
(QS0)
(QS1)

Lệnh của bộ vi xử lý được ghi bằng các ký tự dưới dạng gợi nhớ
(mnemonic) để người sử dụng dễ 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 cho 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 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ệ hai 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 từ trong hợp lệnh MOV để giải thích cách ghi lệnh nói chung của 8088.

Hình 3.5. Sơ đồ chân của CPU 8088 [8086].
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 808H, ta nói qua một chút về sự giống nhau và khác nhau

35

Lệnh MOV đích, gốc dùng để chuyển dữ liệu giữa 2 thanh ghi hoặc
giữa ô nhớ và thanh ghi. Chỉ nguyên với các thanh ghi của 8088, nếu ta lần
36


lượt đặt các thanh ghi vào vị từ các 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
bộ 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 đoạn thì điều này lại
khác.
Bit W dùng để chỉ ra rằng một byte (W=0) hoặc một từ (W=1) sẽ được
chuyển.

2 bit MOD (chế độ) cùng với 3 bit là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ể biể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

Bảng 3.1 cho ra 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.
Bảng 3.1. Phối hợp MOD và R/M đế tạo ra các chế độ địa chỉ.

Hình 3.6. Dạng thức các byte mã lệnh của MOV
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:
Thanh ghi
W=1
W=0
AX
AL
BX
BL
CX
CL
DX
DL
SP
AH
DI
BH
BP
CH
SI
DH


000

011
001
010
100
111
101
110

Thanh ghi đoạn



CS
DS
ES
SS

01
11
00
10

Ghi chú: - d8: disp. 8 bit, d16: disp.16 bit
- 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ụ bầu đây ta sẽ dùng các kiến thức nêu trên đề mã hoá
một vài lệnh MOV.

Bit D dùng để chỉ hướng đi của dữ liệu, D=l thì dữ liệu đi đến thanh ghi

cho bởi 3 bit của REG. D=0 thì dữ liệu đi từ thanh ghi cho bởi 3 bộ của REG.

37

38


• 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
MOV AX,0FF0H
MOV DS,AX

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ộ vi 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 ghi (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 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.

MOV [BX],10
DS:BX

; chuyển 100 vào CL
; chuyển 0FF0H vào AX để rồi đưa
; vào DS (vì không thể chuyển
; trực tiếp vào thanh ghi đoạn).
;Chuyển 10 vào ô nhớ tại địa chỉ

Trong thí dụ cuối ta đã đùng chế độ địa chỉ gián tiếp qua thanh ghi để
chỉ ra ô nhớ (toán hạng đích) bẽ 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ệch 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,[ 123H]

• 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 hơn so với các lệnh có truy nhập dẫ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 DS .
ADD AL, DL
; cộng nội dung AL và DL rồi đưa
; vào AL.
39

MOV [4320H],CX


;
;
;
;

chuyển nội dung ô nhớ DS:1234
vào AL
chuyển nội dung CX vào 2 ô nhớ
liên tiếp DS:4320 và DS:4321.

Chế độ địa 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 đủ 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).
40


Ví dụ
MOV AL,[BX]
MOV [Si],CL
MOV [DI],AX




;
;
;
;
;
;
;

chuyển nội dung ô nhớ có địa
chỉ DS : BX vào AL
chuyển nội dung CL vào ô nhớ
có địa chỉ DS : SI
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 chỉ số


Trong chế độ địa chỉ này các thanh ghi chỉ số như SI và DI 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ỉ của toán hạng trong vùng nhớ DS.
Ví dụ
MOV AX,[SI]+10 ;chuyển nội dung 2 ô nhớ liên
; tiếp có địa chỉ DS : (SI+10) và
; DS: (SI+11) vào AX.
MOV AX,[SI+IO] ; 1 cách viết khác của lệnh trên
MOV CL,[DI]+5 ; chuyển nội dung ô nhớ DS:(DI+5)
; vào CL.

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 (disptacement 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ị đị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]+l0
; chuyển nội dung 2 ô nhớ liên
; tiếp có địa chi DS:(BX+IO ) và
; DS : ( BX + 1 1 ) vào CX
MOV CX,[BX+10]
; cách viết khác của lệnh trên.
MOV CX,10 [BX]
; 1 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ả đư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:
- 10.5 Table gọi là các dịch chuyển của các toán hạng tương ứng. 10 và
5 là các giá trị cụ thể. Table là tên mảng biểu diễn dịch chuyển của mảng (phần
tử đầu tiên) so với địa chỉ đầu của đoạn dữ liệu DS,
- (BX+10) hoặc (BP+5) gọi là địa chỉ hiệu dụng (effective address, EA,
theo cách gọi của Intel).
- DS:(BX+10) hoặc SS:(BP+5) chính là logic tương ửng với một địa chỉ
vật lý.
- Theo cách định nghĩa này thì địa chỉ hiệu dụng của một phần tử thứ
BX nào đó (kể từ 0) trong mảng Table[Bx] thuộc đoạn DS là EA=Table+BX
và của phần tử đầu tiên là EA-Table.

41



Chế độ địa chỉ tương đối chỉ số cơ sở

Kết hợp hai chế độ địa chỉ chỉ số và cơ sở ta có chế độ dù chỉ chỉ số cơ
sở. Trong chế độ địa chỉ này ta dùng có thanh ghi cơ sở lẫn thanh ghi chỉ số để
tính địa chỉ của toán hạng. Nếu ta dùng thêm cả thành phần biểu diễn sự dịch
chuyển của địa chỉ thì ta có chế độ địa chỉ phức hợp nhất: chế độ địa chỉ tương
đối chỉ số cơ sở. Ta có thể thấy chế độ địa chỉ này rất phù hợp cho việc địa chỉ
hoá các mảng 2 chiều.
Vi dụ

MOV AX, [ BX] [SI]+8 ;
;
;
;
MOV AX, [BX+SI+8]
;
;
MOV CL, [BP+DI+5]
;
;


chuyển nội dung 2 ô nhớ
liên tiếp có địa chỉ
DS: (BX+SI+8) và
DS: (BX+SI+9) vào AX.
1 cách viết khác của
lệnh trên.
chuyển nội dung ô nhớ
SS: (BP+DI+5) vào CL

Tổng kết các chế độ địa chỉ
Các chế độ địa chỉ đã trình bày ở trên có thể tóm tắt lại trong bảng 3.2.

Một hình thức tổng kết khác về các chế độ địa chỉ của 8086/88 được
biểu diễn trên hình 3.7.
42





Phương pháp bỏ ngầm định thanh ghi đoạn (Segment override)
Như trong các phần trước đã nói các thanh ghi đoạn và thanh ghi lệch
được ngầm định đi kèm với nhau từng cặp dùng để địa chỉ hoá các toán hạng
trong các vùng khác nhau của bộ nhớ. Bảng 3.3 chỉ ra các khả năng cặp đôi
ngầm định của các thanh ghi đoạn và thanh ghi lệch thường dùng.Vì tính ngầm
định này nên trong các lệnh ta chỉ còn viết ra các thanh thanh ghi lệch là đủ cơ
sở để tính ra được địa chỉ của toán hạng.
Tuy nhiên, ngoài các tổ hợp ngầm định đã kể: 8088 còn cho phép ta
làm việc với các tổ hợp khác của các thanh ghi đoạn và thanh ghi lệch. Muốn
loại bỏ các tổ hợp ngầm định nói trên, trong khi viết lệnh ta phải ghi rõ thanh
ghi đoạn sẽ dùng để tính địa chỉ và kèm thêm dấu 2 chấm trước thanh ghi lệch.
Cụm ký hiệu này gọi là cụm tiếp đầu để loại bỏ thanh ghi đoạn ngầm định
(segment overide prefix) và để đạt được việc loại bỏ này chỉ cần ghi rõ thanh
ghi đoạn.

MOV AL,[BX]
thì địa chỉ vật lý của toán hạng để chuyển vào thanh ghi AL tương ứng với
DS:BX. vì DS là đoạn ngầm định của vùng nhớ chứa toán hạng do BX chỉ ra.
Nếu ta muốn thay đổi không lấy toán hạng trong đoạn dữ liệu DS nữa: mà lại
lấy toán hạng trong đoạn dữ liệu phụ ES để đưa vào AL thì ta phải viết lại lệnh
ở trên thành.
MOV AL,ES:[BX]
trong đó ta đã dùng cụm tiếp đầu ES: để loại bỏ thanh ghi đoạn ngầm định DS
và để chỉ rõ là thanh ghi đoạn mới dùng trong lệnh này bây giờ là ES.
Chế độ cơ sở hoặc chỉ số

Chế độ chỉ số cơ sở

Hình 3.7. Một hình thức khác tổng kết các chế độ địa chỉ của 8088.

4. Mô tả tập lệnh của bộ vi xử lý 8088.
Có nhiều cách trình bày tập lệnh của một bộ vi xử lý: trình bày các lệnh
theo các nhóm hoặc theo thứ tự abc. Ta sẽ chọn cách lam thứ 2 để sau này dễ
tìm kiếm các lệnh khi cần tra cứu cụ thể. Trong khi nói tới các lệnh ở dạng gợi
43

44


nhớ ta cũng mô tả ngắn gọn luôn từng lệnh và tác động (nếu có) của lệnh tới
các cờ. Để cho các diễn giải dễ đọc ta qui định ký hiệu AL được hiểu là thanh
ghi AL hoặc là nội dung của tưởng khi ghi lệnh, dấu [x] nên được hiểu như là
một ký hiệu của Intel để ghi lệnh, không nên hiểu là nội dung của x, còn |xx:yy|
dùng để chỉ nội dung ô nhớ tại địa chỉ xx:y hoặc {SP} dùng để chỉ ô nhớ của
ngăn xếp có địa chỉ do nội dung của thanh ghi đơn trỏ ngăn xếp SP chỉ ra.
AAA - ASCII Adjust after Addition (Chỉnh sau khi cộng 2 số ở dạng
ASCII)
Dữ liệu truyền từ các thiết bị đầu cuối đến máy tính thường ở dưới dạng
mã ASCII. Khi đã truyền di các số ở dạng ASCII rồi, đôi khi ta muốn cộng
luôn các số đó. Bộ vi xử lý 8088 cho phép ta làm điều này với điều kiện phải
chỉnh lại kết quả có trong AL bằng lệnh AAA để thu được kết quả là số BCD
không gói.
Cập nhật: AF, CF.
Không xác định: OF, PF: SF, ZF.
Ví dụ: Ta có hai số dưới dạng mã ASCII là 30H và 39H ứng với '0' và
'9'. Nếu cộng 2 số ở dạng mã lại ta được số 69H , số này không có ý nghĩa gì vì
nó không phải là số BCD đúng. Ta sẽ thu được số BCD không gói nếu dùng
thêm lệnh AAA:
; AL = 0011
0000B = 30H = ‘0’

; BL = 0011
1001B = 39H = ‘9’
ADD AL, BL ; thu được AL = 0110 1001B = 69H, kết
; quả sai
AAA
; thu được AL = 0000 1001b = 9, kết
; quả đúng
OR AL,30H ; thu được AL =39 H= ‘9’ để truyền kết
; quả trở lại thiết bị cuối
AAD - ASCII Adjust before Division (Chỉnh trước khi chia 2 số ở dạng
ASCII)
Lệnh này đổi 2 số BCD không gói ở AH và AL đang số hệ hai tương
đương để tại AL. Việc này phải thực hiện trước khi làm phép chia một số BCD
không gói (gồm 2 chữ số) để trong AX cho một số BCD không gói khác. Kết
quả và số dư cũng là các số BCD không gói.
Không xác định: Tất cả các cờ.
Ví dụ
; AX=0605H là số BCD không gói của 65
; số bị chia
45

ADD
DIV BL

;
;
;
;
;
;


BL=08H là số BCD không gói
(số chia).
sau khi chỉnh AX=0041=41H
sau khi chia được thương AL=08
là số BCD không gói,
số dư ở AH=01 là số BCD không gói

AAA - ASCII Adjust after Multiplication (Chỉnh sau khi nhân 2 số ở dạng
ASCII).
Lệnh này dùng để đổi một số hệ hai, là tích của 2 số BCD không gói, có
trong AL sang số BCD không gói để tại AX.
Cập nhật: PF, SF, ZP.
Không xác định: AF, CF, OF.
Ví dụ
Sau khi nhân 2 số 5 và 9 ở dạng ASCII. Ta đổi kết quả đang dạng BCD
không gói bằng lệnh AAM và sau đó đổi tiếp thành mã ASCII để truyền tiếp

MUL BL
AAM
OR AX,3030H

;
;
;
;
;
;
;
;


AL = 0011 0101B = 35H = '5'
BL = 0011 1001B 39H = '9'
thu được AX = 002DH = 45
thu được AX=0405H, mã BCD
không nén của 45.
thu được AX=3435H, mã ASCII
cho 45 đề truyền kết quả
trở lại thiết bị đầu cuối.

AAS-ASCII Adjust after Subtraction (Chỉnh sau khi trừ 2 đố ở dạng ASCII)
Lệnh này dùng để đổi một số hệ hai, là hiệu của 2 số BCD không gói,
có ở A1 sang số BCD không gói
Cập nhật: AF, CF
Không xác định: OF, PF, SF, ZP .
Ví dụ
a)
; BL =0011 0101 B=35H=’5’
; AL 0011 l001B = 39H = '9' ,
; ASCII 9 - ASCII 5 :
SUB AL,BL
; thu được AL = 04 H = 4
AAS
; thu được AL = 04H, mã BCD không
; gói của 4.
46


OR AL,30H


b)

SUB AL,BL
AAS

; thu được AL = 34H, mã ASCII cho 4
; để truyền kết quả trở lại thiết bị
; đầu cuối

Cập nhật: AF, CF, OF, PF, SF, ZP.
AND - And Corresponding Bits of Two Operands (và 2 toán hạng)

; AL = 0011 0101B = 35H=’5’
; BL = 0011 1001B = 39 H =’9’
; ASCII 5 - ASCII 9:
; thu được AL = FCH
; thu được AL = 04H,
; gói của 4, CF=l(có
; phép trừ nhiều chữ

=-4, CF=l,
mã BCD không
thể dùng cho các
số)

ADC - Add With Carry (Cộng có nhớ)

Không xác định: AF.
Ví dụ .
AND AL, BL

AND BL, OFH

Cập nhật: AF, CF,OF, PF, SF, ZP.

; AL ← AL+74+CF

ADC CL,BL
; CL ← CL+BL+CF
ADC DL,[ SI]
; DL ← DL+{ DS:SI} +CF
ADC AL,Table[BX] ; AL ← AL+ {DS:(Table+BX } + CF
ADD - Add (Cộng 2 toán hạng)
Đích ← Đích + Gốc

; AL ← AL ^ BL theo từng bit .
; Che 4 bit cao của BL .

CALL - Call a Procedure (Gọi chương trình con)

Ví dụ: Các ví dụ đâu đây có thể đại diện cho các chế độ địa chỉ có thể
có trong lệnh cộng này cũng như một số các lệnh khác với ngữ pháp tương tự.

Mô tả:

Đích ← Đích ^ Gốc

Cập nhật: PF, SF, ZP, PF chỉ có nghĩa khi toán hạng là 8 bit.

Trong đó toán hạng đích và gốc có thể tìm được theo các chế độ địa chỉ
khác nhau nhưng phải chứa dữ liệu có cùng độ dài và không được phép đồng

thời là 2 ô nhớ và cũng không được là thanh ghi đoạn. Điều hạn chế này cũng
áp dụng cho các lệnh khác có ngữ pháp tương tự.

ADD Đích, Gốc.

Mô tả:

Xoá: CF,OF

Mô tả: Đích ← Đích + Gốc + CF

Viết lệnh:

AND Đích,Gốc.

Trong đó toán hạng đích và gốc có thể tìm được theo các chế độ địa chỉ
khác nhau nhưng phải chứa dữ liệu cùng độ dài và không dược phép đồng thời
là 2 ô nhớ và cũng không được là thanh ghi đoạn. Phép AND thường dùng để
che được lại một vài bit nào đó của một toán hạng bằng cách nhân logic toán
hạng đó với toán hạng tức thì có các bit 0/1 ở các chỗ cần che đi/giữ nguyên
tương ứng (toán hạng tức thì lúc này còn được gọi là mặt nạ).

Viết lệnh: ADC Đích,Gốc.

ADC AL,74H

Viết lệnh:

Mô tả:
Lệnh này dùng để chuyển hoạt động của bộ vi xử lý từ chương trình

chính (CTC) sang chương trình con (ctc). Nếu ctc ở trong cùng một đoạn mã
với CTC thì ta có gọi gần (near call). Nếu CTC và ác nằm ở hai đoạn mã khác
nhau thì ta có gọi xa (far call). Gọi gần và gọi xa khác nhau về cách tạo ra địa
chỉ trớ về (return address). Địa chỉ trở về là địa chỉ của lệnh tiếp ngay sau lệnh
Call. Khi gọi gần thì chỉ cần cất IP của địa chỉ trở về (vì CS không đổi), khi gọi
xa thì phải cất cả CS và IP của địa chỉ trở về. Địa chỉ trở về được tự động cất
tại ngăn xếp khi bắt đầu thực hiện lệnh gọi và được tự động lấy ra khi gặp lệnh
RET (trở về CTC từ ctc) tại cuối ctc.
Như vậy, nếu là gọi gần:
+ SP← SP-2 và địa chỉ lệnh trở về được cất vào ngăn xếp là {SP}← IP.

Trong đó toán hạng đích và gốc có thể tìm được theo các chế độ địa chỉ
khác nhau, nhưng phải chứa dữ liệu có cùng độ dài và không được phép đồng
thời là 2 ô nhớ và cùng không được là thanh ghi đoạn có thể tham khảo các ví
dụ của lệnh ADC.
47

+ IP ← Địa chỉ lệch của chương trình con.
+ Khi gặp lệnh RET tại cuối ác thì sẽ có thao tác ngược lại:
{SP} → IP và SP ← SP + 2.
48


Lệnh này mở rộng bit dấu của AL sang 8 bit của AH. AH lúc này được
gọi là phần mở rộng dấu của AL. Ta dùng CBW để mở rộng dấu cho số có dấu
nằm trong AL trước khi muốn chia nó cho một số có dấu 8 bit khác bằng lệnh
IDIV (lệnh chia các số có dấu), hoặc trước khi muốn nhân nó với một số có
dấu 16 bit khác bằng lệnh IMUL (lệnh nhân các số có dấu).

Còn nếu là gọi xa:

+ SP ← SP - 2 và địa chỉ lệch của lệnh trở về được cất vào ngăn xếp:
{SP} ← CS.
+ SP ← SP - 2 và địa chỉ cơ sở của lệnh trở về được cất cào ngăn xếp:

Lệnh này không tác động đến các cờ.

{SP} ← IP.

Ví dụ: Nếu AL = 80H thì sau lệnh chuyển ta có AX = FF80H.

+IP ← Địa chỉ lệch của chương trình con.
CLC - Clear the Carry Flag (Xoá cờ nhớ)

CS ← Địa chỉ cơ sở của chương trình con.
+ Khi gặp lệnh RET tại cuối ctc thì sẽ có thao tác ngược lại:

Mô tả: CF ←0

{ISP} → IP và SP ← SP + 2.

Không tác đến các cờ khác.

{SP} → CS và SP ← SP + 2

CLD Clear the Direction Flag (Xoá cờ hướng)

Viết lệnh : Sau đây là ví dụ các dạng khác nhau của các lệnh gọi ctc và
cách tính địa chỉ của ctc:
CALL Multiple: gọi ctc có tên là Multiple trong cùng đoạn mã với
CTC, ctc này phải nằm trong giới hạn dịch chuyển -32 Kbyte (dịch về phía địa

chỉ thấp) hoặc (32K-1) byte (dịch về phía địa chỉ cao) so với lệnh tiếp theo
ngay sau lệnh Call. Sau khi cất IP cũ (địa chỉ trở về) vào ngăn xếp, IP mới
được tính: IP ← IP + Dịch chuyển.

Mô tả: DF ← 0.
Lệnh này định hướng thao tác theo chiều tiến (→) cho các lệnh liên
quan đến chuỗi. Các thanh ghi liên quan là SI và DI sẽ dược tự động tăng khi
làm việc xong với một phần tử của chuỗi.

CALL Divi: Gọi ctc có tên Divi ở đoạn mã khác. Trong chương trình
hợp ngữ Divi phải được khai báo là một ctc ở xa:

Không tác động đến các cờ khác.

Divi Proc Far

CLI Clear the Interrupt Flag (Xoá cờ cho phép ngắt)

Địa chỉ của ctc là địa chỉ CS:IP của Divi.

Mô tả: IP←0.

CALL BX: Gọi trực tiếp một tác trong cùng đoạn, lệnh đầu tiên của ctc
dịch chuyển so với đầu đoạn bằng nội dung của thanh ghi BX, do đó IP ← BX
(SI, DI có thể dùng thay chỗ của BX).

Lệnh này xoá cờ cho phép ngắt. Các yêu cầu ngắt che được sẽ bị che.
Không tác động đến các cờ khác.

CALL WORD PTR [BX]: Gọi ctc nằm trong cùng đoạn mã, ctc có địa

chỉ dịch chuyến (tính từ lệnh tiếp ngày sau lệnh gọi tới lệnh đầu tiên của ctc)
chứa trong 2 ô nhớ do BX và BX+1 chỉ ra trong đoạn DS. Địa chỉ lệch này sẽ
đưa vào IP (SI, DI có thể dùng thay chỗ của BX).

CMC - Complement the Carry Flag (Đảo cờ nhớ)
Mô tả: CF ← CF

CALL DWORD PTR [BX]: Gọi ác không nằm trong cùng một đoạn
mã ctc có địa chỉ CS:IP, giá trị gán cho IP và CS chứa trong 4 ô nhớ do BX và
BX+1 (cho IP) và BX+2 và BX+3 (cho CS) chỉ ra trong đoạn DS (SI, DI có thể
dùng thay chỗ của BX).

Cập nhật: CF
Không tác động đến các cờ khác.

CBW - Convert a Byte to a Word (Chuyển byte thành từ)
49

50


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×