CHƯƠNG I
CẤU TRÚC BÊN TRONG CỦA VI XỬ LÝ 8086
___ oOo ___
Đây là bộ vi xử lý nổi tiếng một thời của hãng 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.
I . CẤU TẠO BÊN TRONG:
Bên trong gồm hai khối chính:
- Khối thực hiện EU (Execution Unit)
- Khối giap tiếp bus (Bus Interface Unit)
1 .Khối thực hiện EU
Ở hình 1.1 ta thấy trong khối 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ớ đưa đến
đầu của bộ giải mã, các thông tin thu được từ đầu ra củc nó sẽ
được đưa đến mạch tạo xung điều khiển, kết quả là thu được các
dãy xung khác nhau (tùy 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à logic (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 cuả
lệnh. Tóm lại khi CPU hoạt động EU sẽ cung cấp thông tin về
điạ 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
2. Khối phối ghép bus (Bus Interface Unit BIU)
Khối BIU có nhiệm vụ đưa ra điạ chỉ, đọc mã lệnh từ bộ
nhớ. Nói cách khác BIU chiu trách nhiệm đưa điạ chỉ ra bus và
trao đổi dữ liệu với bus.
Trong BIU còn có bộ nhớ đệm lệnh với dung lượng 4 byte
dùng để đưa các mã lệnh đọc được nằm sẵn sàng chờ EU xử lý
1
Bus đòa chỉ
Bus dữ liệu
Các thanh
ghi đoạn
Arithmetic logic
unit (ALU)
Bus dữ liệu nội
Các bus hệ
thống
Excution Unit
(EU)
Bus Interface Unit
(BIU)
Hình 1.1:
Sơ đồ khối 8086
Bộ vi xử lý thực hiện các lệnh theo các bước sau:
- Lấy lệnh từ bộ nhớ.
- Đọc toán hạng (nếu lệnh yêu cầu).
- Thực hiện lệnh.
- Ghi kết quả.
3.1). Khối thực hiện:
Nhiệm vụ của khối thực hiện lệnh là thực hiện các lệnh của
chương trình. Nó gồm có khối số học – logic (ALU) cho phép
thực hiện các phép tính số học (+ , - , * , /) và các phép logic
(AND, OR, NOT…). Trong khối thực hiện còn có một số ô nhớ
gọi là thanh ghi dùng để chứa dữ liệu cho các phép tính. Mỗi
thanh ghi giống như một ô nhớ ngoại trừ chúng được đặt tên thay
Đoạn dữ liệu (Data Segment)
Đoạn Stack (Stack Segment)
Đoạn thêm (Extra Segment)
IP
Flag
Con trỏ lệnh (Intruction Pointer)
Cờ
Các thanh ghi dữ liệu:
Có bốn thanh ghi dữ liệu ký hiệu lần lượt là: AX, BX, CX,
DX, được người lập trình sử dụng cho các thao tác với dữ liệu.
Mặc dù vi xử lý có thể thao tác với dữ liệu trong bộ nhớ, nhưng
một lệnh như vậy sẽ được thực hiện nhanh hơn trong thanh ghi
(cần ít chu kỳ đồng hồ hơn). Đó cũng là nguyên nhân tại sao các
bộ vi xử lý hiện đại có xu hướng nhiều thanh ghi.
Các byte cao và byte thấp trong thanh ghi được truy cập độc
lập: Byte cao của thanh ghi AX được gọi là AH và byte thấp
được gọi là AL. Tương tự như vậy cho các byte cao và byte thấp
của các thanh ghi BX, CX, DX lần lượt là BH & BL, CH & CL,
DH & DL. Nhờ điều này mà ta có nhiều thanh ghi hơn khi làm
việc với các số liệu có kích thước byte dài. Trong đa số lệnh các
thanh ghi dữ liệu được chọn tùy ý nhưng các thanh ghi này lại có
chức năng riêng cố đònh trong một số ít lệnh.
Thanh ghi tích lũy AX (Accumulator):
Là thanh ghi được sử dụng nhiều nhất trong các lệnh số học
– logic và truyền dữ liệu bởi vì việc sử dụng thanh ghi này tạo
ra mã máy ngắn nhất.
Trong các thao tác nhân hoặc chia một trong các số hạn
tham gia phải chứa trong AH hoặc AL, các thao tác vào ra cũng
sử dụng thanh ghi AH hoặc AL.
Thanh ghi cơ sở BX (Base):
Segment), có thể truy cập dễ dàng các ô nhớ liên tiếp bằng cách
tăng SI.
Thanh ghi chỉ số đích DI (Destination Index):
Thanh ghi DI có chức năng tương tự như thanh ghi SI và
được dùng kết hợp với thanh ghi đoạn thêm ES (Extra Segment).
Cả hai DI và SI thích hợp trong các thao tác sao chép, di chuyển
hoặc so sánh các khối dữ liệu có dung lượng đến 64kB.
Thanh ghi con trỏ lệnh IP (Intruction Pointer):
8086 không thực hiện lệnh trực tiếp trong bộ nhớ mà lệnh
được lấy ở hàng đợi lệnh có cấu tạo giống như một thanh ghi
dòch (FIFO: First In First Out: vào trước ra trước) chứa các mã
lệnh cung cấp bởi khối BIU. Thanh ghi IP chỉ đến lệnh tiếp theo
chưa được nhập vào hàng đợi lệnh và được dùng kết hợp với
thanh ghi CS. Thanh ghi IP được cập nhật mỗi khi có một lệnh
được thực hiện xong, khác với các thanh ghi khác, IP không bò
tác động trực tiếp bởi các lệnh.
Thanh ghi cờ (Flag Register):
Thanh ghi cờ của 8086 có độ dài 16bit (2byte) byte thấp
chứa các bit trạng thái giống như trong 8085 phản ánh trạng thái
của vi xử lý, byte cao chứa 1 bit trạng thái đó là bit 11 và 3 bit
điều khiển dùng để điều khiển hoạt động của vi xử lý. Sau đây
là cấu tạo của thanh ghi cờ trong 8086:
15 8 7 0
O
D I T S Z A P C
Thanh ghi cờ của 8086
C: carry flag.
P: parity flag.
A: auxiliary flag.
Z: zero flag.
khiển cho lệnh đó. Sau khi lệnh được thi hành vi xử lý sẽ phát
sinh một ngắt do TF được lập DEBUG sử dụng chính phục vụ
ngắt này để lấy quyền điều khiển từ vi xử lý.
+ Cờ ngắt IF:
Cờ ngắt được sử dụng để điều khiển các ngắt phần cứng
bên ngoài, nếu cờ này được thiết lập các ngắt phần cứng có thể
ngắt 8086. Khi xóa IF, các ngắt bên ngoài không còn tác dụng
nửa (bò che). Thực ra vẫn còn một ngắt cứng không che được
NMI (Non Maskable Interrupt).
Trước khi vi xử lý trao quyền điều khiển cho một phục ngắt
nó xóa cả IF và TF, như vậy phục ngắt đó sẽ không bò ngắt. Tất
nhiên một phục vụ ngắt có thể đổi cờ để cho phép ngắt khi nó
đang thi hành.
+ Cờ tràn OF:
Cờ tràn là ‘1’ khi có hiện tượng tràn và ngược lại nó bằng
‘0’. Hiện tượng tràn cho thấy một sự thật là phạm vi biểu diễn
các số trong máy tính là có giới hạn.
Phạm vi biểu diển các số có dấu trong một word từ –32768
đến +32767 và trong một byte từ –126 đến +127.
Đối với các số không dấu từ 0 đến 65535 cho một word và
từ 0 đến 255 cho một byte. Nếu kết quả của một phép tính vượt
ra ngoài phạm vi này thì hiện tượng tràn sẽ xảy ra và kết quả
nhận được bò cắt bớt sẽ không phải là kết quả đúng.
+ Cờ điều khiển DF:
Là một trong ba cờ điều khiển dùng điều khiển các thao tác
của vi xử lý công dụng của DF là dòch hướng cho các thao tác
chuỗi, các thao tác này được thực hiện bởi hai thanh ghi chỉ số
SI & DI, nội dung của hai thanh ghi này sẽ tự động tăng lên khi
DF = 0 và giảm xuống khi DF =1.
3.2). Khối giao tiếp (BIU):
thanh ghi của 8086 (16 bit) nên 8086 chia bộ nhớ thành các đoạn
bộ nhớ (Memory Segment).
Một đoạn bộ nhớ là một khối gồm 2
16
(64K) ô nhớ liên tiếp
nhau, mỗi đoạn được xác đònh bằng một đòa chỉ đoạn bắt đầu từ
đòa chỉ 0, đòa chỉ đoạn là một số 16 bit nên đòa chỉ đoạn lớn nhất
là FFFF. Bên trong mỗi đoạn số ô nhớ được xác đònh bằng đòa
chỉ tương đối (offset), đó là số byte tính từ đầu đoạn, với một
đoạn 64K thì offset cũng là một số 16 bit, byte đầu tiên trong
đoạn có offset bằng 0 và byte cuối cùng bằng FFFF.
Một ô nhớ có thể được xác đònh bằng đòa chỉ đoạn:đòa chỉ
tương đối trong đoạn (segment:offset) và được gọi là đòa chỉ
logic.
Thí dụ: ô nhớ A4FB: 4872 có đòa chỉ đoạn là A4FB và đòa
chỉ offset là 4872. Để tìm đòa chỉ vật lý của ô nhớ trước tiên ta
dòch đòa chỉ đoạn về bên trái 4 bit và sau đó cộng với đòa chỉ
offset, như vậy đòa chỉ vật lý của ô nhớ A4FB:4872 được tính
như sau: A4FB0
4872
A9822
b). Sắp xếp đoạn:
Trong bộ nhớ đoạn 0 bắt đầu từ đòa chỉ 0000:0000 = 00000
và kết thúc ở 0000:FFFF = 0FFFF, đoạn 1 bắt đầu từ đòa chỉ
0001:0000 = 00010 và kết thúc ở đòa chỉ 0001:FFFF = 1000F.
Như vậy, có rất nhiều sự chồng nhau giữa các đoạn. Các đoạn
bắt đầu từ các đòa chỉ cách nhau 16byte và đòa chỉ đầu của mỗi
đoạn luôn kết thúc bằng các số 0. 16byte được gọi là một khúc
(Paragraph), các đòa chỉ chia hết cho 16 ( các đòa chỉ kết thúc
bằng 0) là các biên giới khúc (Paragraph Boundary)