giáo trình vi xử lý×giáo trình vi xử lý 8086×giáo trình vi xử lý 8051×giáo trình vi xử lý 89c51×giáo trình vi xử lý 8088×giáo trình vi xử lý picgiáo trình vi xử lý×giáo trình vi xử lý 8086×giáo trình vi xử lý 8051×giáo trình vi xử lý 89c51×giáo trình vi xử lý 8088×giáo trình vi xử lý picgiáo trình vi xử lý×giáo trình vi xử lý 8086×giáo trình vi xử lý 8051×giáo trình vi xử lý 89c51×giáo trình vi xử lý 8088×giáo trình vi xử lý pic
Trang 1Trong 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 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
Trang 2Hình 1.1 Các đơn vị đo độ dài của số hệ hai dẫn xuất từ bit.
Vì con người chỉ quen tính toán với hệ mười, trong khi các bộ phận tính toán của máy
tính chỉ biết làm việc với hệ hai, nên để đảm bảo sự giao tiếp thuận tiện giữa người và máy (khi
đưa số liệu vào và lúc lấy ra kết quả tính toán) thường xuyên phải có việc chuyển đổi qua lại giữa
hai hệ đếm này Chúng ta cùng xem xét nhanh các vấn đề trên thông qua các ví dụ đơn giản dưới
đây
Một số hệ mười viết như sau: 12345,67
sẽ có giá trị số bằng tổng của các tích giữa các hệ số 1, 2, 3, 4, 5, 6, 7 với các trọng số 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,01, 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-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 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:
Trang 310111,11 B = 2 + 2 + 2 + 2 + 2 + 2 = 25,75Ngượ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 1) cho chữ số hệ hai thứ i tuỳ theo quan hệ giữa số dư và luỹ thừa tương ứng:
1, khi số dư lớn hơn hoặc bằng 2i,
0, khi số dư nhỏ hơn so với 2i (và phép trừ không được thực hiện)
Ví dụ: Đổi số 34 sang hệ hai.
Các giá trị 2i cần tính đến (25 = 32 là giá trị 2x sát dưới nhất so với số 34)
Các chữ số hệ hai tính được:
Như vậy 34 =100010 B
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.
1 0
Trang 4
Hình 1.1 Một cách đổi số hệ mười sang hệ hai
Trong trường hợp số hệ mười cần đổi có thêm cả phần lẻ sau dấu phảy thì đầu tiên ta phải đổi riêng rẽ từng phần rồi sau đó cộng các kết quả lại Đối với phần nguyên ta có thể làm theo 2 cách đã nói ở trên Riêng đối với phần sau dấu phảy ta đổi theo quy tắc trình bày sau đây
Quy tắc đổi số thập phân hệ mười ra hệ hai
Lấy số cần đổi nhân với 2, tích nhận được sẽ gồm phần nguyên và phần lẻ nhị phân, lấy phần lẻ nhị phân của tích thu được nhân tiếp với 2 Làm như vậy cho tới khi được tích chẵn bằng
1 Chọn riêng các phần nguyên (phần trước dấu phảy) của các tích thu được và sắp xếp lại sẽ được các chữ số sau dấu phảy của số hệ hai cần tìm
và thu được kết quả là 0,125 = 0,001 B (phần được đóng trong khung)
Kết hợp các ví dụ trên lại, nếu phải đổi số 34,125 ra hệ hai ta thu được kết quả cuối cùng
là 34,125 =100010,001 B
1.2 Số BCD (số hệ mười mã hoá bằng hệ hai)
Giữa hệ mười và hệ hai còn tồn tại một hệ lai: hệ BCD cho các số hệ mười mã 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
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ố
0 0 1
Trang 51.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 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
Trang 6Cá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
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.
Bảng 1.3 chỉ ra cách tạo ra các số hệ hai có dấu và số bù hai trong sự tương quan với số
hệ hai
Bảng 1.3 Biểu diễn các số theo hệ hai, hệ hai có dấu và mã bù hai
Số 8 bit Số hệ mười Số hệ mười theo Số hệ mười tính
hệ hai tương đương mã hệ hai có dấu theo mã bù hai
Trang 7Quan 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ú ý hai 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ã 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ố dương có mã bù hai giống như mã hệ hai thông thường
4 Một số biểu diễn theo hệ hai sẽ có các giá trị khác nhau nếu hiểu đó là mã để biểu diễn số theo kiểu hệ hai có dấu hoặc kiểu số bù hai Nói khác đi, một cụm các số 0 và
1 sẽ được cảm nhận khác nhau khi nó biểu diễn giá trị số theo các mã khác nhau Cho dù có được biểu diễn bằng số hệ hai có dấu hay số bù hai thì các số âm đều có bit b7=1, còn các số dương có bit b7=0
Bây giờ ta nói cụ thể cách tính số bù hai của một số nào đó Về mặt toán học thì số bù hai của một số chính là số đối của nó Như vậy một số dương sẽ có số bù hai là một số âm cùng giá trị tuyệt đối và ngược lại
Quy tắc: Muốn tìm số bù hai (còn gọi là bù số học) của một số A ta làm theo các bước
sau:
+ biểu diễn số A theo mã bù hai của nó
+ tìm số bù một (bù logic) của số đó (bằng cách đảo bit).
+ cộng 1 vào số bù một ở trên để nhận được số bù hai của số A
Ghi chú: Khi có một số âm được biểu diễn theo mã bù hai nếu muốn tính giá trị tuyệt đối của nó ta cũng áp dụng quy tắc này (áp dụng các bước 2,3)
Ví dụ: Tìm số bù hai của 13.
Trang 8Đây là một số âm (bit b7=1) với giá trị tuyệt đối là 1 (tra theo bảng 1.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ó:
Trang 9Độ 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)
Trang 10Ví dụ: 35/5 = 7
Ta hãy quan sát kỹ các bước phải làm khi chia bằng tay:
Trong các bước tính ở trên liên tục cần phải có các dự đoán và kiểm tra để tìm ra được kết quả đúng Công việc này là rất khó khăn đối với các mạch điện tử của khối tính toán số học (vốn là các phần tử để thực hiện phép cộng và dịch trong máy tính) Sau đây là một thuật toán khắc phục được các vấn đề nêu ở trên:
1 Đổi số chia ra số bù hai của nó (để bước ở sau làm tính trừ bằng tính cộng)
2 Lấy số bị chia trừ đi số chia
Nếu kết quả này có bit dấu bằng 0 (có nghĩa là phần này của số bị chia chia được cho
số chia) thì bit tương ứng của thương bằng 1
Nếu kết quả này có bit dấu bằng 1 (có nghĩa là phần này của số bị chia không chia được cho số chia) thì bit tương ứng của thương bằng 0 và ta buộc phải khôi phục lại giá trị ban đầu của số bị chia bằng cách cộng kết này quả 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 = 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 liệt kê ra nhu sau:
Toán hạng Thương Tên toán hạng, thao tác
Trang 11Từ đây ta rút ra 36/5 = 7 và dư 1.
3 Mã ASCII - mã tiêu chuẩn cho trao đổi thông tin
Bảng 1.5 Bảng mã ASCII tiêu chuẩn
Trang 12Trong 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ừ 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): 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:
Trang 131 2 cột đầu của bảng mã được dùng cho các ký tự điều khiển.
2 Cột 2 dành riêng cho các ký tự ngăn cách
3 Các ký tự số nằm ở cột 3 Mã của ký tự '0' là 30H, '9' là 39H
Giữa giá trị số và mã ASCII của số đó có khoảng cách là 30H
4 Các chữ cái hoa nằm ở các cột 4, 5, các chữ cái thường ở cột 6, 7
Khoảng cách giữa chữ thường và chữ hoa cùng tên là 20H
4 Quan hệ giữa mã ASCII với số BCD
Trong khi làm toán với các số BCD ta thường kết hợp 2 số BCD thành 1 byte Dạng số
BCD viết theo kiểu này gọi là dạng BCD chuẩn hay còn được gọi là dạng BCD gói (packed BCD)
Khi lưu trữ, khi hiện thị hoặc khi truyền giữa các thiết bị các giá trị số 0 9, thực chất ta làm việc với mã ASCII của các số đó, tức là các số 30H 39H Như vậy ta thấy trong 1 byte mã ASCII biểu diễn các số 0 9 có 4 bit thấp ứng với mã BCD của chính các số đó, 4 bit cao bao giờ cũng ứng với mã BCD của số 3 (tức là 0011B) Nếu trong byte mã ASCII này ta thay 4 bit cao bằng 0H
thì ta thu được số BCD không gói Nói cách khác số BCD không gói là số dài 1 byte, trong đó 4 bit
cao bằng không, 4 bit thấp là số BCD chuẩn mã 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ã 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 1001B = 59H
Từ đây ta có thể rút ra các bước phải làm để đổi 2 số ở dạng mã ASCII sang dạng số BCD chuẩn:
+ Đổi số đầu tiên từ mã ASCII ra số BCD không gói,
+ Đổi số thứ 2 từ mã ASCII ra số BCD không gói,
+ Lấy 4 bit thấp của số đầu ghép với 4 bit thấp của số sau tạo thành 1 byte biểu diễn số BCD gói
Đây là các công việc hay gặp khi thao tác với các số trong các hệ vi xử lý
CHƯƠNG 2
Trang 14MÁ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
5 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:
5.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 bit 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 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).
5.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 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
Trang 15khiể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.
5.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 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ó 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 vi tính là chúng đều sử dụng các bộ xử lý trung tâm (CPU) được chế tạo bằng công nghệ mạch vi điện tử với mức độ tổ hợp lớn, mạch VLSI (very large 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 thị trường thường được xếp theo các họ phụ thuộc vào các nhà sản xuất và chúng rất đa dạng về chủng loại Nổi bật nhất trong các họ vi xử lý đó là 2 họ của
2 nhà sản xuất hàng đầu 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
6 Sự phát triển của các bộ vi xử lý
6.1 Thế hệ 1 (1971 - 1973)
Năm 1971, trong khi phát triển các vi mạch dùng cho máy tính cầm tay, Intel đã cho ra đời bộ vi xử lý đầu tiên là 4004 (4 bit số liệu, 12 bit đị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 bit (cũng có thể dài hơn),
Công nghệ chế tạo PMOS với đặc điểm mật độ phần tử nhỏ, tốc độ thấp, giá 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
Trang 166.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
6.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 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 hơ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, PC/XT, PC/AT và các máy Macintosh của Apple Phần lớn các bộ vi xử lý trong thế hệ này đều được sản xuất bằng công nghệ HMOS và cho phép đạt được tốc độ từ 0,1-1 µs/lệnh với tần số đồng hồ fclk = 5-10 MHz
Trong thời kỳ này cũng xuất hiện các máy vi tính 8 bit trong một vỏ như 8048/49 và 6805R2 (mạch này còn có thêm cả ADC 12 bit cho 4 kênh đầu vào tương tự) hoặc các bộ vi điều khiển 1 bit trong 1 vỏ như MC 14500B và 4 bit trong 1 vỏ như MC 141000
6.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 bit 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 dòng mã lệnh (pipeline), bộ nhớ
cache (bộ nhớ ẩn), bộ nhớ ảo Các bộ vi xử lý này đều có bộ quản lý bộ nhớ (MMU) và nhiều khi
cả các bộ đồng xử lý toán học ở bên trong Chính nhờ các cải tiến đó mà các bộ vi xử lý thế hệ này
có khả năng cạnh tranh được với các máy tính nhỏ trong rất nhiều lĩnh vực ứng dụng Phần lớn các
bộ vi xử lý thế hệ này đều được sản xuất bằng công nghệ HCMOS
Một số thông số chính của các bộ vi xử lý của Intel và Motorola được cho trong bảng 2.1
và 2.2
Trang 17Bảng 2.1.a Các bộ vi xử lý 16 bit của Intel
82385 đ.khiển
Bên ngoài, do
82385 đ.khiển
I/Dcache 8KB
I/Dcache 8KB
I/Dcache 8KB
Icache 8KB Dcache 8KB
Ghi chú I/DCache: 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ảng 2.2 Các bộ vi xử lý 16/32 bit của Motorola
Trang 1868000 68010 68020 68030 68040 68060
Dcache 256B
Icache 4KB Dcache4KB
Icache 8KB Dcache 8KB
Có bộ quản lý bộ nhở
(MMU) ỏ bên trong
68851 làm
Ghi chú 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ính 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 dự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 Motorola-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ý
Apple-7 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ý
ROM-RAM
Phối ghép vào/ra (I/O)
Thiết bị vào Thiết bị ra
thanh ghi trong
thanh ghi ngoài
Trang 19Hì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:
+ 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 vớ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ớ, sau đó 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 đượ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 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 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 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 để
Trang 20đư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 dựng từ các mạch lôgic đơn giản hoặc từ các vi mạch chuyên dụng lập trình được.
Bus địa chỉ thường có từ 16, 20, 24 đến 32 đường dây song song chuyển tải thông tin của
các bit địa chỉ Khi đọc/ghi bộ nhớ CPU sẽ đưa ra trên bus này địa chỉ của ô 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 (1K = 210 = 1024) Khi đọc/ghi với cổng vào/ra CPU cũng đưa ra trên bus địa chỉ các bit địa chỉ tương ứ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
CHƯƠNG 3
Trang 21BỘ 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
8 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ủa bộ vi xử lý Intel 8088:
E.U (execution unit) B.I.U (Bus interface unit)
BUS ngoài
Bus dữ liệu (8 bit)
Bus trong của CPU8bit dữ liệu20bitđịa chỉ
Bus địa chỉ (20bit)
AXBXCXDXSPBPSIDI
CSDSSSESIP
Logic điều khiển BUS Các thanh ghi tạm thời
Thanh ghi cờ
ALU
Đệm lệnh (hàng đợi lệnh) (6 byte cho 8086)
Khối điều khiển của E U
Σ
Bus dữ liệu ALU (16bit)
Các thanh ghi đoạn và con trỏ lệnh
Trang 22
EU: Execution unit, khối thực hiện lệnh
BIU: Bus interface unit, khối phối ghép bus
ALU: Arithmetic and logic unit, khối số học và lôgic
Hình 3.1 Sơ đồ khối của bộ vi xử lý 8088
8.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 (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
Trang 23Trong 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 đế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 đượ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ự
F2 D2 E2
Trang 24F3 D3 E3
(F: đọc lệnh, D: giải mã lệnh, E: thực hiện lệnh)
Hình 3 2 Dòng lệnh thường và dòng lệnh xen kẽ liên tục
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
Khối BIU đưa ra trên bus địa chỉ 20 bit địa chỉ, như vậy 8088 có khả năng phân biệt ra được 220 = 1.048.576 = 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 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
bit 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 đoạn này có thể nằm cách nhau khi thông tin cần lưu trong chúng đòi hỏi dung lượng đủ 64 Kbyte hoặc cũng có thể nằm trùm nhau do có những đoạn không cần dùng hết độ dài 64 Kbyte và vì thế những đoạn khác có thể bắt đầu nối tiếp ngay sau đó Điều này cũng cho phép ta truy nhập vào bất kỳ đoạn nhớ (64Kbyte) 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 được bằng cách cộng thêm vào địa chỉ cơ sở một giá trị gọi là địa chỉ lệch hay độ lệch (offset), gọi như thế vì nó ứng với khoảng lệch của toạ độ một ô nhớ cụ thể nào đó so với ô đầu đoạn Độ lệch này được xác định bởi các thanh ghi 16 bit khác đóng vai trò thanh ghi lệch (offset register) mà ta sẽ nói đến sau Cụ thể,
để xác định địa chỉ vật lý 20 bit của một ô nhớ nào đó trong một đoạn bất kỳ, CPU 8088 phải dùng đến 2 thanh ghi 16 bit (một thanh để 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:
Trang 25Địachỉvậtlý = Thanhghiđoạn×16+Thanhghilệch
Việc dùng 2 thanh ghi để ghi nhớ thông tin về địa chỉ thực chất tạo ra một loại địa chỉ gọi
là địa chỉ logic và được ký hiệu như sau:
Thanhghiđoạn : Thanhghilệch hay segment : offset.
Địa chỉ kiểu segment : offset là logic vì nó tồn tại dưới dạng giá trị của các thanh ghi cụ
thể bên 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.1)
Ví dụ: Cặp CS:IP sẽ chỉ ra địa chỉ của lệnh sắp thực hiện trong đoạn mã Nếu tại một
thời điểm nào đó ta có CS=F000H và IP=FFF0H thì
CS:IP ~ F000H×16 + FFF0H = F0000H + 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ớ 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
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ị:
Trang 26Trong 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ó
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ủa các cổng trong các lệnh vào/ra dữ liệu trực tiếp (IN/OUT)
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 bit Các thanh ghi này (trừ IP) đều có thể được dùng như các thanh ghi đa năng, nhưng ứng dụng chính của mỗi thanh ghi là
chúng được ngầm định như là thanh ghi lệch cho các đoạn tương ứng Cụ thể:
IP: con trỏ lệnh (instruction pointer), IP luôn trỏ vào lệnh tiếp theo sẽ được thực hiện nằm trong đoạn mã CS Địa chỉ đầy đủ của lệnh tiếp theo này ứng với CS:IP và được xác định theo cách đã nói ở trên
BP: con trỏ cơ sở (base pointer), BP luôn trỏ vào một dữ liệu nằm trong đoạn ngăn xếp
SS Địa chỉ đầy đủ của một phần tử trong đoạn ngăn xếp ứng với SS:BP và được xác định theo cách đã nói ở trên
SP: con trỏ ngăn xếp (stack pointer), SP luôn trỏ vào đỉnh hiện thời của ngăn xếp nằm trong đoạn ngăn xếp SS Địa chỉ đầ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 chỉ cụ thể đầy đủ ứng với DS:SI và được xác định theo cách đã nói ở trên
DI: chỉ số đích (destination index), DI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ
cụ thể đầy đủ ứng với DS:DI và được xác định theo cách đã nói ở trên
Riêng trong các lệnh 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
Trang 27Các cờ của bộ vi xử lý 8085
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)
X : không được định nghĩa
Hình 3.3 Sơ đồ thanh ghi cờ của bộ vi xử lý 8086/88
Các cờ cụ thể
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ó ý nghiã 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 số 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
O 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 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
Trang 28cờ 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 sẽ xẩy ra (cờ 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
Hình 3.4 Sơ đồ thanh ghi AL và các cờ CF, C67
8.2 8086 và 8088
Chế độ Chế độ MIN MAX
[AD14] A14 A15
2 39
3 38
4 37
5 36
6 35
7 34
8 33
9 32
µ P
8088
[8086]
Trang 29Hì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
8088, ta nói qua một chút về sự giống nhau và khác nhau giữa 8088 và 8086 8086 là bộ vi xử lý
16 bit hoàn chỉnh, còn 8088 là bộ vi xử lý với 16 bit dữ liệu bên trong (giống như 8086), nhưng khi ra ngoài bus dữ liệu của nó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 5)
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
9 Cách mã hoá lệnh của bộ vi xử lý 8088
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ý
Trang 30sẽ có lợi khi ta cần dịch "bằng tay" một lệnh gợi nhớ khi làm việc với các 'kit' vi xử lý (tuy rằng việc này ít khi xảy ra vì ta thường làm việc với các hệ được trang bị chương trình dịch hợp ngữ)
Một lệnh có thể có độ dài một vài byte tuỳ theo bộ vi xử lý Giả thiết một bộ vi xử lý nào
đó dùng 1 byte để chứa các mã lệnh (opcode) của nó Ta có thể tính được số lệnh lớn nhất mà 1 byte này có thể mã hoá được là 256 lệnh Trong thực tế việc ghi lệnh không phải hoàn toàn đơn giản như vậy Việc mã hoá lệnh cho bộ vi xử lý là rất phức tạp và bị chi phối bởi nhiều yếu tố khác nữa
Đối với bộ vi xử lý 8088 một lệnh có thể có độ dài từ 1 đến 6 byte Ta sẽ chỉ lấy trường hợp lệnh MOV để giải thích cách ghi lệnh nói chung của 8088
Lệnh MOV đích, gốc dùng để 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 lượt đặt các thanh ghi vào vị trí 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 bit của byte đầu dùng để chứa mã lệnh Đối với các lệnh MOV, để chuyển dữ liệu kiểu:
- thanh ghi ↔ thanh ghi (trừ thanh ghi đoạn) hoặc
- bộ nhớ ↔ thanh ghi (trừ thanh ghi đoạn)thì 6 bit đầu này luôn là 100010 Đối với các thanh ghi đ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
1 0 0 0 1 0
hoặc
Disp: displacement (dịch chuyển)
Hình 3.6 Dạng thức các byte mã lệnh của lệnh 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 mã Thanh ghi đoạn mã
Byte 1 Byte 2 Byte 3
Byte 4
Trang 31Bit 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 3 bit
của REG, D=0 thì dữ liệu đi từ thanh ghi cho bởi 3 bit của REG
2 bit MOD (chế độ) cùng với 3 bit R/M (thanh ghi/bộ nhớ) tạo ra 5 bit dùng để chỉ ra chế
độ địa chỉ cho các toán hạng của lệnh (có thể hiểu chế độ địa chỉ là cách tìm ra địa chỉ của toán
hạng, xem thêm phần sau của chương này để rõ hơn về chế độ địa chỉ)
Bảng 3.1 cho ta thấy cách mã hoá các chế độ địa chỉ (cách tìm ra các toán hạng bằng các bit này
Bảng 3.1 Phối hợp MOD và R/M để tạo ra các chế độ địa chỉ
MOD
R/M 00 01 10 11
000 [BX] + [SI] [BX] + [SI] + d8 [BX] + [SI] + d16 AL AX
001 [BX] + [DI] [BX] + [DI] + d8 [BX] + [DI] + d16 CL CX
010 [BP] + [SI] [BP] + [SI] + d8 [BP] + [SI] + d16 DL DX
011 [BP] + [DI] [BP] + [DI] + d8 [BP] + [DI] + d16 BL BX
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ụ sau đây ta sẽ dùng các kiến thức nêu trên để mã hoá một vài lệnh MOV
- MOV CL,[BX]
Trang 3210 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
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 đến bộ nhớ
Ví dụ
Trang 33MOV 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
Chế độ địa chỉ tức thì
Trong chế độ địa chỉ này toán hạng đích là một thanh ghi hay một ô nhớ, còn toán hạng
nguồn là một hằng số và ta có thể tìm thấy toán hạng này ở ngay sau mã lệnh (chính vì vậy chế độ địa chỉ này có tên là chế độ địa chỉ tức thì) Ta có thể dùng chế độ địa chỉ này để nạp dữ liệu cần
thao tác vào bất kỳ thanh ghi nào (trừ các thanh ghi đoạn và thanh cờ) hoặc vào bất kỳ ô nhớ nào trong đoạn dữ liệu DS
Ví dụ
MOV CL,100 ; chuyển 100 vào CL
MOV AX,0FF0H ; chuyển 0FF0H vào AX để rồi đưaMOV DS,AX ; vào DS (vì không thể chuyển
; trực tiếp vào thanh ghi đoạn).MOV [BX],10 ; Chuyển 10 vào ô nhớ tại địa
; chỉ DS:BX
Trong thí dụ cuối ta đã dùng chế độ địa chỉ gián tiếp qua thanh ghi để chỉ ra ô nhớ (toán hạng đích) sẽ nhận dữ liệu ở chế độ địa chỉ tức thì (toán hạng nguồn) Tại đây [BX] có nghĩa là ô nhớ có địa chỉ DS:BX
Trang 34 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 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)
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à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),
Trang 35- 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
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+10] ;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 chỉ số cơ sở
Kết hợp hai chế độ địa chỉ chỉ số và cơ sở ta có chể độ địa 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
Ví dụ
MOV AX,[BX][SI]+8 ; 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
MOV AX,[BX+SI+8] ; 1 cách viết khác của
Trang 36Mộ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.
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 override prefix) và để đạt được việc loại bỏ này chỉ cần ghi rõ thanh ghi đoạn.
[BP] + Disp
DSSSTương đối chỉ số [DI] + Disp
[SI] + Disp
DSDSTương đối chỉ số cơ sở [BX] + [DI] + Disp
[BX] + [SI] + Disp[BP] + [DI] + Disp[BP] + [SI] + Disp
DSDSSSSS
(Ghi chú: Reg: Thanh ghi; Data: Dữ liệu tức thì; Disp: Dịch chuyển)
Bảng 3.3 Các cặp thanh ghi đoạn và thanh ghi lệch ngầm định
Trang 37Thanh ghi lệch IP SI,DI,BX DI SP,BP
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
Hình 3.7 Một hình thức khác tổng kết các chế độ địa chỉ của 8088
Địa chỉ hiệu dụng
+
+
DS ×
16
SS × 1 6
ES × 1 6
Chế độ cơ sở
hoặc chỉ số
BX BP DI SI
hoặ c hoặ c hoặ c
BX BP
hoặ c
SI DI
hoặ c
hoặc
hoặc
Dịch chuyển
Địa chỉ vật lý
+ +
Chế độ chỉ số cơ sở
+
CS × 1 6
hoặc
Trang 3811 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 làm 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 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 AL Trong 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:yy, hoặc {SP} dùng để chỉ ô nhớ của ngăn xếp có địa chỉ do nội dung của thanh ghi con 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 đi 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
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 sang 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ờ.
Trang 39AAD ; sau khi chỉnh AX=0041 = 41H;
DIV BL ; 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,
AAM - 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
; không nén của 45
OR AX,3030H ; 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 số ở 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ó ở AL sang số BCD không gói
Trang 40AAS ; thu được AL = 04H, mã BCD không
Cập nhật: AF, CF,OF, PF, SF, ZP.
Ví dụ: Các ví dụ sau đâ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ự
ADC AL,74H ; AL ← AL+74+CFADC CL,BL ; CL ← CL+BL+CFADC DL,[SI] ; DL ← DL+{DS:SI}+CFADC AL,Table[BX] ; AL ← AL+{DS:(Table+BX)}+CF
ADD - Add (Cộng 2 toán hạng)
Viết lệnh: ADD Đích,Gốc
Mô tả: Đích ← Đích + Gốc