1. Trang chủ
  2. » Giáo án - Bài giảng

Giáo trình Vi Xử Lý.. BKHN

190 250 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 190
Dung lượng 1,52 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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 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 2

Hì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 3

10111,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 5

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 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 6

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

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 7

Quan sát kỹ bảng này chúng ta có thể rút ra các nhận xét sau:

1 Nếu ta dùng 8 bit để biểu diễn số thì ta thu được 256 tổ hợp có giá trị từ 0 đến 255 (tương ứng 00 FF H), tức là chỉ biểu diễn được số dương

2 Với tổ hợp trên nếu ta muốn biểu diễn số có dấu theo kiểu dấu và độ lớn (sign and

magnitude) ta phải mất 1 bit để dành cho dấu và 7 bit còn lại để định giá trị Với cách

làm này ta có khả năng biểu diễn cả số âm và số dương nằm trong khoảng -127 -0, +0 +127 (chú ý 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 10

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:

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 11

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

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

Bảng 1.5 Bảng mã ASCII tiêu chuẩn

Trang 12

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ừ 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 13

1 2 cột đầu của bảng mã được dùng cho các ký tự điều khiển.

2 Cột 2 dành riêng cho các ký tự ngăn cách

3 Các ký tự số nằm ở cột 3 Mã của ký tự '0' là 30H, '9' là 39H

Giữa giá trị số và mã ASCII của số đó có khoảng cách là 30H

4 Các chữ cái hoa nằm ở các cột 4, 5, các chữ cái thường ở cột 6, 7

Khoảng cách giữa chữ thường và chữ hoa cùng tên là 20H

4 Quan hệ giữa mã ASCII với số BCD

Trong khi làm toán với các số BCD ta thường kết hợp 2 số BCD thành 1 byte Dạng số

BCD viết theo kiểu này gọi là dạng BCD chuẩn hay còn được gọi là dạng BCD gói (packed BCD)

Khi lưu trữ, khi hiện thị hoặc khi truyền giữa các thiết bị các giá trị số 0 9, thực chất ta làm việc với mã ASCII của các số đó, tức là các số 30H 39H Như vậy ta thấy trong 1 byte mã ASCII biểu diễn các số 0 9 có 4 bit thấp ứng với mã BCD của chính các số đó, 4 bit cao bao giờ cũng ứng với mã BCD của số 3 (tức là 0011B) 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 14

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

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 15

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.

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 16

6.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 17

Bả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 18

68000 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 19

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:

+ 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 21

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

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 23

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 đế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 24

F3 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 26

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ó

 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 27

Cá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 28

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 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 29

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

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 30

sẽ có lợi khi ta cần dịch "bằng tay" một lệnh gợi nhớ khi làm việc với các 'kit' vi xử lý (tuy rằng việc này ít khi xảy ra vì ta thường làm việc với các hệ được trang bị chương trình dịch hợp ngữ)

Một lệnh có thể có độ dài một vài byte tuỳ theo bộ vi xử lý Giả thiết một bộ vi xử lý nào

đó dùng 1 byte để chứa các mã lệnh (opcode) của nó Ta có thể tính được số lệnh lớn nhất mà 1 byte này có thể mã hoá được là 256 lệnh Trong thực tế việc ghi lệnh không phải hoàn toàn đơn giản như vậy Việc mã hoá lệnh cho bộ vi xử lý là rất phức tạp và bị chi phối bởi nhiều yếu tố khác nữa

Đối với bộ vi xử lý 8088 một lệnh có thể có độ dài từ 1 đến 6 byte Ta sẽ chỉ lấy trường hợp lệnh MOV để giải thích cách ghi lệnh nói chung của 8088

Lệnh MOV đích, gốc dùng để 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 31

Bit D dùng để chỉ hướng đi của dữ liệu, D=1 thì dữ liệu đi đến thanh ghi cho bởi 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 32

10 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 33

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

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 36

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.

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 37

Thanh 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 38

11 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 39

AAD ; 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 40

AAS ; 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

Ngày đăng: 23/09/2016, 08:08

HÌNH ẢNH LIÊN QUAN

Bảng 2.1.a. Các bộ vi xử lý 16 bit của Intel - Giáo trình Vi Xử Lý.. BKHN
Bảng 2.1.a. Các bộ vi xử lý 16 bit của Intel (Trang 17)
Bảng 2.1.b. Các bộ vi xử lý 32 bit của Intel - Giáo trình Vi Xử Lý.. BKHN
Bảng 2.1.b. Các bộ vi xử lý 32 bit của Intel (Trang 17)
Hình 3.7.  Một hình thức khác tổng kết các chế độ địa chỉ của 8088. - Giáo trình Vi Xử Lý.. BKHN
Hình 3.7. Một hình thức khác tổng kết các chế độ địa chỉ của 8088 (Trang 37)
Hình 4.2. Môđun chương trình .COM và .EXE  trong bộ nhớ. - Giáo trình Vi Xử Lý.. BKHN
Hình 4.2. Môđun chương trình .COM và .EXE trong bộ nhớ (Trang 103)
Hình 4.3. Cấu trúc IF-THEN-ELSE - Giáo trình Vi Xử Lý.. BKHN
Hình 4.3. Cấu trúc IF-THEN-ELSE (Trang 110)
Hình 4.4. Cấu trúc lệnh CASE. - Giáo trình Vi Xử Lý.. BKHN
Hình 4.4. Cấu trúc lệnh CASE (Trang 112)
Hình 5.4. Lược đồ của máy IBM PC/XT. - Giáo trình Vi Xử Lý.. BKHN
Hình 5.4. Lược đồ của máy IBM PC/XT (Trang 148)
Hình 5.6. Mạch 8284 nối với 8088. - Giáo trình Vi Xử Lý.. BKHN
Hình 5.6. Mạch 8284 nối với 8088 (Trang 150)
Hình 5.8. Các tín hiệu của CPU 8088 trong chu kỳ ghi đơn giản hoá. - Giáo trình Vi Xử Lý.. BKHN
Hình 5.8. Các tín hiệu của CPU 8088 trong chu kỳ ghi đơn giản hoá (Trang 153)
Hình 5.9. Các tín hiệu của CPU 8088 trong chu kỳ đọc đơn giản hoá. - Giáo trình Vi Xử Lý.. BKHN
Hình 5.9. Các tín hiệu của CPU 8088 trong chu kỳ đọc đơn giản hoá (Trang 154)
Hình 5.10. Mạch tạo 0-7 trạng thái chờ (đang để là 1) và biểu đồ thời gian. - Giáo trình Vi Xử Lý.. BKHN
Hình 5.10. Mạch tạo 0-7 trạng thái chờ (đang để là 1) và biểu đồ thời gian (Trang 156)
Hình 5.25. Bộ điều khiển DRAM TMS 4500A - Giáo trình Vi Xử Lý.. BKHN
Hình 5.25. Bộ điều khiển DRAM TMS 4500A (Trang 173)
Hình 5.35. Từ điều khiển cấu hình của 8255A. - Giáo trình Vi Xử Lý.. BKHN
Hình 5.35. Từ điều khiển cấu hình của 8255A (Trang 181)
Hình 5.39. Biểu đồ thời gian các tín hiệu của 8255A ở chế độ 1-vào - Giáo trình Vi Xử Lý.. BKHN
Hình 5.39. Biểu đồ thời gian các tín hiệu của 8255A ở chế độ 1-vào (Trang 185)
Hình 5.40. 8255A ở chế độ &#34;Bus hai chiều&#34;. - Giáo trình Vi Xử Lý.. BKHN
Hình 5.40. 8255A ở chế độ &#34;Bus hai chiều&#34; (Trang 186)

TỪ KHÓA LIÊN QUAN

w