Tải bản đầy đủ (.doc) (34 trang)

Tài liệu Chương 2: Cấu trúc và hoạt động của vi xử lý pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (285.87 KB, 34 trang )

CHƯƠNG II: CẤU TRÚC VÀ HOẠT ĐỘNG CỦA VI XỬ LÝ.
2.1. SƠ ĐỒ CẤU TRÚC TỔNG QUÁT CỦA VI XỬ LÝ.
Sơ đồ khối của một bộ vi xử lý truyền thống 8 bit được trình bày trên hình 2.1. Sơ đồ
khối này đặc trưng cho hầu hết các bộ vi xử lý 8 bit đã có trên thị trường như 8085,
8088/8086 và Z80… Các bộ vi xử lý các thế hệ sau sẽ có cấu trúc bên trong khác đi
nhưng vẫn giữ được một số nguyên tắc hoạt động cơ bản của sơ đồ này.
Vi xử lý là một mạch số có thể thực hiện nhiều chức năng số khác nhau. Nó sẽ thực
hiện một bài toán, một công việc khi được cung cấp một chương trình. Một chương
trình là một chuỗi các tín hiệu nhị phân nối tiếp nhau, mỗi chuỗi nhị phân sẽ yêu cầu
(cho phép) một chức năng của vi xử lý hoạt động. Quá trình làm việc của vi xử lý bao
gồm hai chu kỳ chính lặp lại một cách liên tục đó là:
15
Acc
ALU
Cờ
BIU
Data Register
MARs
SP
PC
Queue
CU
Các tín hiệu điều khiển
và định thời
External
BUS
Hình 2.1. Sơ đồ khối của một bộ vi xử lý 8 bit truyền thống
Internal BUS
- Chu kỳ lấy các mã lệnh.
- Chu kỳ thực hiện các chức năng mà lệnh yêu cầu.
Tương ứng với hai chu kỳ trên có thể chia vi xử lý ra hai phần chính: Đơn vị thực hiện


lệnh EU (Execution Unit), và đơn vị giao tiếp BUS (Bus Interface).
Đơn vị thực hiện lệnh bao gồm bộ giải mã lệnh, hay còn gọi là đơn vị điều khiển CU
(Control Unit), sẽ đưa ra các tín hiệu cho phép chọn các khối trong VXL được phép
hoạt động tùy theo mã lệnh mà nó nhận được từ BIU. Tức là với các lệnh khác nhau, CU
sẽ chọn ra các khối khác nhau trong CPU hoạt động để thực hiện chức năng của lệnh đó.
Một bộ phận quan trọng khác của EU là đơn vị số học và logic (ALU - Arithmetic
Logic Unit ), ALU là nơi thực hiện tất cả các phép tính số học và logic mà chương trình
yêu cầu. Các toán hạng trong các phép tính mà ALU thực hiện có thể nằm trong các
thanh ghi dữ liệu, trong bộ nhớ hoặc được xác định trong chính mã lệnh.
Các thanh ghi là các ô nhớ có tốc độ truy xuất rất nhanh, nằm ngay bên trong VXL.
Chúng được dùng làm nơi lưu trữ các toán hạng cung cấp cho ALU, lưu trữ các dữ liệu
vào ra VXL, hoặc lưu trữ các địa chỉ cho phép CPU truy cập bộ nhớ hoặc I/O nhanh
chóng hơn.
EU không nối với thế giới bên ngoài, nó nhận lệnh từ bộ nhớ lệnh trong BIU. Khi lệnh
cần thâm nhập bộ nhớ hay ngoại vi EU sẽ yêu cầu BIU thực hiện.
Bộ nhớ lệnh là các ô nhớ chuyên để cất giữ các mã lệnh của chương trình đang thực
hiện. Có loại vi xử lý bộ nhớ lệnh bao gồm nhiều ô được gọi là hàng đợi lệnh (Queue
Instruction) . Hàng đợi này hoạt động theo nguyên tắc FIFO(Fist Input Fist Output – vào
trước ra trước), khi EU lấy đi 1 byte lệnh thì BIU sẽ tự động lấy byte lệnh kế tiếp của
chương trình lấp đầy vào hàng đợi. Với hàng đợi lệnh các chu kỳ giải mã lệnh và lấy
lệnh có thể xảy ra đồng thời, nâng cao tốc độ vi xử lý. Ở một số loại vi xử lý bộ nhớ
lệnh chỉ có 1 byte được gọi là thanh ghi lệnh IR (Instruction Register), với loại CPU
này BIU phải chờ EU thực hiện xong lệnh hiện hành mới được phép lấy vào lệnh mới.
Đơn vị giao tiếp BUS: BIU thực hiện tất cả các thao tác về BUS do EU yêu cầu. Ngoài
ra trong thời gian EU đang thực hiện lệnh, BIU sẽ tự động truy cập tới bộ nhớ lệnh lấy
các mã lệnh của chương trình sắp vào bộ nhớ lệnh, sẵn sàng cung cấp cho EU thực hiện.
Để giao tiếp bên ngoài BIU cung cấp cho bộ nhớ và ngoại vi các tín hiệu địa chỉ, dữ liệu
, điều khiển cần thiết:
- Địa chỉ cung cấp ra bên ngoài thông thường được cung cấp từ một thanh ghi địa chỉ
do CU chọn, một số trường hợp có thể từ các thanh ghi dữ liệu, hoặc từ ngay mã

lệnh mà CU nhận được.
- Dữ liệu được truyền ra ngoài từ một thanh ghi dữ liệu, lấy vào một thanh ghi dữ
liệu, hoặc lấy trực tiếp vào ALU trong các lệnh số học và logic.
- Các tín hiệu điều khiển sẽ được định thời trong bộ điều khiển BUS tùy theo lệnh cụ
thể.
Riêng các trường hợp lấy mã lệnh, địa chỉ được BIU cung cấp từ bộ đếm chương trình
PC (Program Counter), và lấy mã lệnh từ bộ nhớ vào thanh ghi lệnh (hoặc hàng đợi
lệnh).
Khi bắt đầu hoạt động PC = 0,

khi lấy vào 1 byte lệnh PC tăng lên 1. PC sẽ được thiết
lập giá trị mới, khi có các lệnh rẽ nhánh chuyển điều khiển chương trình
Trong một số vi xử lý bộ đếm chương trình còn được gọi là con trỏ lệnh IP (Instruction
Pointer).
16
Để làm việc được VXL phải hoạt động chung với thiết bị khác như là bộ nhớ và ngoại
vi, để tạo thành hệ thống VXL. Khi đó bộ vi xử lý được gọi là đơn vị xử lý trung tâm
CPU (Central Processing Unit ). Phần kế tiếp sẽ miêu tả cấu trúc và hoạt động cụ thể,
của các bộ phận chính trong một CPU.
2.2. CHỨC NĂNG, HOẠT ĐỘNG CỦA CÁC THÀNH PHẦN BÊN TRONG
VI XỬ LÝ.
2.2.1. Các thanh ghi (Registers).
Các thanh ghi là một bộ phận rất quan trọng trong một CPU. Chúng là một số ít các ô
nhớ có tốc độ truy xuất rất nhanh, cách đánh địa chỉ đơn giản để CPU có thể truy xuất
dữ liệu một cách nhanh chóng. Các thanh ghi được cho phép hoạt động từ các bộ chọn
MUX (Multiplex) được điều khiển từ đơn vị điều khiển CU. Chúng được chọn nhờ số ít
các bit nhị phân trong mã lệnh.
CPU có càng nhiều thanh ghi, thì tốc độ thực hiện một chương trình càng cao, do giảm
được thời gian truy xuất các hằng, biến ngoài bộ nhớ. Giảm được số byte lệnh do không
phải cung cấp địa chỉ các dữ liệu toán hạng. Nhưng tất nhiên khi số lượng thanh ghi

quá lớn thì việc truy cập chúng cũng trở nên phức tạp như đối với các ô nhớ.
Để dễ dàng truy xuất, các thanh ghi được chia ra các nhóm với các chức năng riêng biệt
nào đó. Các hãng sản xuất khác nhau đưa ra các tên gọi các thanh ghi khác nhau. Nhưng
thông thường CPU 8 bit nào cũng ghi các thanh ghi với các chức năng sau:
- Bộ đếm chương trình (PC Program Counter ). Hay gọi là con trỏ lệnh (IP Instruction
Pointer).
- Thanh ghi lệnh (IR Instruction Register) Một số CPU là hàng đợi lệnh (Instruction
Queue).
- Thanh ghi địa chỉ bộ nhớ (MAR-Memory Address Register) .
- Thanh ghi con trỏ ngăn xếp (SP-Stack Pointer).
- Thanh ghi chỉ số (Index Register).
- Thanh ghi đa dụng (General Register).
- Thanh ghi chứa (Accumulator Register).
- Thanh ghi cờ (Flag Register).
Các thanh ghi đều được nối chung lên BUS nội trong CPU theo sơ đồ hình 2.2.
• Thanh ghi bộ đếm chương trình (PC).
Ở các CPU 8 bit bộ đếm chương trình thường là 16 bit, nó có nhiệm vụ tạo ra các địa
chỉ cung cấp tới bộ nhớ để CPU có thể đọc vào các byte lệnh của chương trình. Sau khi
đọc xong một byte lệnh, PC luôn trỏ tới địa chỉ của byte lệnh kế tiếp cần lấy vào.
Các CPU có 16 đường địa chỉ, PC sẽ được nối thẳng tới bộ đệm địa chỉ, giá trị của nó
sẽ được cung cấp thẳng ra Bus địa chỉ để đưa tới bộ nhớ chương trình. Tức là chương
trình có thể nằm bất cứ nơi đâu trong vùng nhớ 64KB mà CPU quản lý.
Một số CPU 8 bit quản lý bộ nhớ bằng 20 đường địa chỉ, địa chỉ vật lý 20 bit này được
tính toán từ một địa chỉ đoạn và một địa chỉ offset. Địa chỉ đoạn sẽ được dịch trái 4 bit
rồi cộng với địa chỉ offset để cung cấp địa chỉ 20 bit cho bộ đệm địa chỉ. Trong trường
hợp đọc mã lệnh, địa chỉ đoạn thường được chỉ định trong thanh ghi đoạn lệnh (CS:
Code Segment), và địa chỉ offset sẽ chứa trong thanh ghi con trỏ lệnh.
17
Bit 0 Bit 1 ……… Bit n
Nạp thanh ghi

Chuyển dữ liệu
thanh ghi ra BUS
BUS nội của CPU
0
1
n
Hình 2.2. Nối ghép của thanh ghi tới Bus nội.
Quá trình đổi địa chỉ trong CPU:
CPU được chế tạo để hoạt động theo các chương trình định sẵn. Trong các hệ thống
CPU 8 bit (8 đường dữ liệu), chương trình đơn giản bao gồm các byte (8 bit) xếp lần
lượt trong các vùng nhớ có thể địa chỉ hóa được. Khi hệ thống bắt đầu hoạt động, bộ
đếm chương trình sẽ được khởi động một giá trị qui định trước trỏ tới lệnh đầu tiên mà
hệ thống sẽ thực hiện. Khi không có các cơ chế điều khiển chương trình, thì sau khi đọc
xong một byte lệnh PC sẽ được tự động tăng lên 1, và như vậy chu kỳ đọc lệnh tiếp theo
sẽ lấy lệnh tại địa chỉ kế tiếp trong bộ nhớ.
Có thể có các chương trình được thực hiện từ tuần tự từ đầu đến cuối, lúc đó PC sẽ
tuần tự tăng lên sau mỗi lần lấy vào 1 byte lệnh như một bộ đếm bình thường. Các
chương trình như vậy rất ít xảy ra trong thực tế, do các bài toán thực tế luôn phải có
phương hướng giải quyết khác nhau với các điều kiện khác nhau. Có rất nhiều lệnh gây
ra việc thay đổi địa chỉ không theo qui luật tuần tự. Sự thay đổi tuần tự này không gây
nên một sự rối loạn nào, BUS địa chỉ của CPU dễ dàng đưa ra ngay một địa chỉ bất kỳ,
dù cách xa bước nhảy tuần tự bình thường như thế nào đi nữa. Và các bộ nhớ bán dẫn
với nguyên tắc truy cập ngẫu nhiên cũng sẽ chấp nhận cơ chế này.
Có ba cách để đổi địa chỉ chương trình không theo qui luật tăng tuần tự là:
- Đổi địa chỉ bằng lệnh nhảy và rẽ nhánh.
- Đổi địa bằng chương trình con.
- Đổi địa chỉ bằng ngắt.
Đổi địa chỉ bằng lệnh nhảy và rẽ nhánh: Đổi địa chỉ bằng lệnh nhảy được chia ra hai
loại: Nhảy tuyệt đối (Jump) và nhảy tương đối (Jump Relative)
Khi CPU nhận được mã của lệnh nhảy tuyệt đối thì hai byte tiếp theo sẽ được gửi đến

nạp vào bộ đếm chương trình PC. Tức là PC được thiết lập tức thời một giá trị mới, giá
trị này có thể là một số bất kỳ trong khoảng 0000H .....FFFFH. bất chấp giá trị cũ. Và
byte lệnh tiếp theo được lấy vào sẽ nằm ở địa chỉ mới này.
Khi CPU nhận được lệnh nhảy tương đối, thanh ghi PC sẽ được cộng thêm hoặc trừ
đi một lượng nào đó. Lượng thêm vào hay bớt đi thường là một số nhị phân 7 bit chỉ thị
18
trong mã lệnh, phép trừ sẽ được thực hiện nếu bit cao nhất của byte này bằng 1, và cộng
thêm nếu bit này bằng 0. Tức là điều khiển chương trình sẽ chuyển đến địa chỉ mới nằm
trong khoảng từ -128.....127 byte so với vị trí hiện tại của lệnh nhảy.
Đổi địa chỉ bằng rẽ nhánh được thực hiện bằng các lệnh nhảy có điều kiện. Tức là CPU
thực hiện các lệnh nhảy tuyệt đối hoặc tương đối giống như trên nếu thỏa mãn điều kiện,
nếu điều kiện không thỏa PC sẽ tiếp tục được tăng lên 1 theo qui luật tuần tự. Điều kiện
ở đây là các cờ trạng thái bằng 1 hoặc bằng 0 (Sẽ xét tới trong phần thanh ghi cờ ). Ví dụ
sau một lệnh so sánh hai số, có thể thực hiện lệnh JE (Jump Equal- Nhảy nếu bằng). Lúc
này PC có giá trị mới theo lệnh nhảy nếu hai số so sánh bằng nhau, ngược lại PC sẽ tăng
lên 1.
Đổi địa chỉ bằng chương trình con: Cách đổi địa chỉ này được thực hiện bằng các lệnh
gọi (Call) và quay về (Return). Khi có một đoạn lệnh nào đó cần sử dụng trong nhiều
lần trong một chương trình, Để tránh viết lặp lại đoạn lệnh đó nhiều lần, có thể viết nó
dưới dạng một chương trình con. Khi cần thực hiện đoạn lệnh này thì gọi nó bằng lệnh
gọi (CALL), tương tự như một lệnh nhảy tới đầu chương trình con, thực hiện xong điều
khiển sẽ được chuyển trở về chương trình chính bằng lệnh quay về.
Khi gặp lệnh gọi giá trị của PC sẽ được lưu trữ trong bộ nhớ tại một nơi đặc biệt gọi là
ngăn xếp, rồi được nạp giá trị mới được chỉ thị trong mã lệnh gọi, chương trình sẽ được
chuyển tới địa chỉ mới bất kỳ trong khoảng từ 0000.....FFFFH giống như lệnh nhảy. Khi
có lệnh quay về, giá trị PC sẽ được phục hồi từ đỉnh ngăn xếp, chương trình sẽ quay về
nơi nó đã chuyển đi (quay về lệnh nằm kế lệnh gọi). Các lệnh gọi chương trình con cũng
có hai dạng không điều kiện và có điều kiện giống như các lệnh nhảy.
Đổi địa chỉ bằng ngắt: Đổi địa chỉ bằng ngắt gần giống như việc đổi địa chỉ bằng các
lệnh gọi và quay về. Thanh ghi PC cũng được lưu trữ và nạp giá trị mới khi có phục vụ

ngắt, và được phục hồi khi có lệnh quay về. Khác biệt ở chỗ phục vụ ngắt được gọi
bằng xung phần cứng, mà không phải bằng lệnh gọi như trong chương trình con. Địa chỉ
chương trình phục vụ ngắt có thể là một địa chỉ cố định được qui định trước, hoặc được
lấy từ vùng nhớ gọi là bảng vector ngắt.
Có hai loại ngắt: ngắt không che, và ngắt có thể che được bằng phần mềm: Với ngắt
không che, chương trình ngắt luôn được thực hiện khi có tín hiệu yêu cầu. Còn với ngắt
che, khi có tín hiệu yêu cầu CPU sẽ kiểm tra cờ ngắt, nếu cờ ngắt =1 chương trình ngắt
thực hiện, cờ ngắt bằng 0 chương trình ngắt sẽ bị bỏ qua. Cờ ngắt có thể thiết lập hay
xóa bằng lệnh phần mềm. Các cơ chế ngắt sẽ được mô tả kỹ trong phần hệ thống ngắt
của vi xử lý.
• Thanh ghi lệnh IR (Instruction Pointer).
Thanh ghi lệnh nằm ở ngõ vào của bộ giải mã lệnh. Trong bộ nhớ, các lệnh của 1
chương trình bao gồm hai phần: mã hoạt động (Op Code) và phía sau là các toán hạng
(Operand). Op Code sẽ phân biệt các lệnh: Số học, logic, di chuyển dữ liệu, bit, nhảy,
chương trình con ….Còn các toán hạng sẽ chỉ ra dữ liệu cần xử lý trong lệnh nằm ở đâu
hoặc bằng bao nhiêu. Thanh ghi lệnh sẽ là nơi các mã lệnh đi qua (từ ngoài bộ nhớ vào
bộ giải mã lệnh). Còn các toán hạng sẽ đi tới các khối khác nhau của vi xử lý tùy theo
mã lệnh. Ví dụ một lệnh cộng sẽ có 1 byte Op Code để phân biệt với các lệnh khác, và
các byte tiếp theo sẽ chỉ ra toán hạng của phép cộng. Nó có thể là 1 giá trị sẽ được đưa
thẳng tới ALU, hoặc có thể là 1 địa chỉ để lấy dữ liệu từ bộ nhớ cung cấp cho ALU, khi
đó địa chỉ này sẽ được đưa tới BIU để truy cập dữ liệu, cũng có thể phần toán hạng chỉ
thị dữ liệu cho lệnh nằm trong một thanh ghi dữ liệu ngay bên trong CPU.
19
Trong mã lệnh của vi xử lý 8 bit thường phần Op code có kích thước giống nhau
(1byte). Với 8 bit sẽ phân biệt 256 tổ hợp, có nghĩa là CPU 8 bit có khả năng xử lý dễ
dàng 256 lệnh. Trong thực tế số lệnh của CPU 8 bit ít hơn con số này mà vẫn đủ cho tất
cả các công việc. Có rất nhiều sự trùng lặp trong các mã lệnh, chúng bao gồm nhiều
công việc giống nhau nhưng sử dụng các toán hạng khác. Trong thực tế thường chỉ có
khoảng hơn 20 nhiệm vụ khác nhau cho 1 CPU, còn lại là các kiểu khác nhau của cùng
một nhiệm vụ.

Trong một số CPU 8 bit thanh ghi lệnh được thay thế bằng hàng đợi lệnh, Khi đó tất
cả các byte mã lệnh của chương trình đều qua hàng đợi lệnh (kể cả mã hoạt động và các
toán hạng). Khi bộ giải mã lệnh nhận được mã hoạt động, các toán hạng sẽ được chuyển
từ hàng đợi lệnh tới các nơi khác nhau trong CPU. Với một hàng đợi lệnh, quá trình giải
mã lệnh và quá trình lấy lệnh có thể thực hiện một cách đồng thời, tốc độ hoạt động của
CPU sẽ được tăng lên.
• Thanh ghi địa chỉ bộ nhớ: (MAR: Memory Address Register).
Thanh ghi MAR được để sử dụng để giữ địa chỉ của ô nhớ cần truyền dữ liệu với CPU
trong một chương trình. Dữ liệu này có thể là dữ liệu vào ra thông thường trong các
lệnh đọc ghi, hoặc là các toán hạng trong các lệnh số học và logic. Thay vì phải chỉ thị
địa chỉ cụ thể của ô nhớ cần truy cập trong mã lệnh, chương trình có thể sử dụng MAR
để lưu trữ địa chỉ này. Trong chu kỳ truy xuất, giá trị trong thanh ghi này sẽ đưa ra BUS
địa chỉ để xác định ô nhớ cần truy cập. Như vậy sẽ giảm được độ dài của mã lệnh, tức là
giảm được độ lớn của chương trình, làm tăng tốc độ thực hiện chương trình và giảm
dung lượng lưu trữ cần thiết cho hệ thống.
Trong một số CPU các thanh ghi địa chỉ bộ nhớ nằm ngay ở nhóm các thanh ghi đa
năng. Một số CPU khác các thanh ghi này là chuyên dụng. Các lệnh sử dụng thanh ghi
20
Nạp MAR1 = 1000
Nạp MAR2 = 2000
Nạp dữ liệu tại ô nhớ có địa chỉ MAR1 = 1000 vào Acc
Nạp dữ liệu từ Acc vào ô nhớ có địa chỉ MAR2
Đủ 10
ô nhớ chưa ?
Tăng MAR1
Tăng MAR2
Start
Start
Yes
No

Hình 2.3: Giải thuật di chuyển 10 ô nhớ từ địa chỉ 1000 qua địa chỉ 2000
địa chỉ bộ nhớ bao gồm ít byte lệnh và được thực hiện nhanh chóng hơn các lệnh chỉ ra
trực tiếp địa chỉ của ô nhớ. Đặc biệt trong các lệnh thao tác chuỗi dữ liệu các thanh ghi
này đóng một vai trò rất quan trọng. Nhờ những thanh ghi này mà CPU có thể di
chuyển, so sánh một khối dữ liệu bằng một lệnh đơn giản với độ dài chỉ 1 hoặc 2 byte.
Ví dụ lưu đồ hình 2.3 sử dụng một chương trình chuyển 10 byte từ vùng nhớ 1000H
qua vùng nhớ 2000H. Trong đó vòng lặp kể từ bước thứ ba trở đi là của một lệnh di
chuyển chuỗi.
• Thanh ghi con trỏ ngăn xếp (SP-Stack Pointer).
Tất cả các CPU đều có một vùng nhớ RAM làm nhiệm vụ ngăn xếp. Vùng nhớ này
hoạt động theo nguyên tắc LIFO (Last Input Fist Output- vào trước ra sau), dữ liệu nào
đưa vào trước tiên sẽ được lấy ra sau cùng. Để thực hiện chức năng này CPU sử dụng
thanh ghi con trỏ ngăn xếp. Vào đầu chương trình thanh ghi này sẽ được gán một giá trị
trỏ tới một địa chỉ của vùng nhớ RAM. Ngăn xếp sẽ được truy cập bằng những lệnh đặc
biệt là PUSH (nạp dữ liệu vào) và POP (lấy dữ liệu ra). Khi có dữ liệu nào được nạp
vào ngăn xếp SP tự động giảm đi, ngược lại khi lấy dữ liệu ra khỏi ngăn xếp SP sẽ được
tự động tăng lên.
Ví dụ vào đầu chương trình SP được gán 0100H, giá trị của SP sẽ trỏ đến ô nhớ có địa
chỉ 0100H (hình 2.4a). Khi CPU lệnh nạp thanh chứa Acc vào ngăn xếp(PUSH Acc),
giá trị của Acc sẽ được cất vào ô nhớ có địa chỉ SP-1 =00FFH (hình 2.4b), và giá trị của
SP bây giờ sẽ là 00FFH. Nếu lấy giá trị ra một thanh ghi đa năng, SP sẽ tăng lên 1 trở lại
như cũ (hình 2.4c).

Khi gặp các lệnh gọi chương trình con hoặc yêu cầu ngắt, giá trị của bộ đếm chương
trình sẽ được nạp vào đỉnh của ngăn xếp, SP sẽ tự động giảm đi 2. Khi có lệnh quay về
(Return), thanh ghi PC sẽ được phục hồi từ đỉnh ngăn xếp. Vì vậy chương trình sẽ quay
về chỗ đã gọi nó, nếu trong chương trình con không còn dữ liệu nào nạp vào mà chưa
lấy được ra. Vậy trong chương trình con nếu nạp vào ngăn xếp cái gì, thì trước khi có
lệnh quay về phải lấy hết ra. Nếu không thanh PC phục hồi từ đỉnh ngăn xếp sẽ chuyển
điều khiển của chương trình tới địa chỉ không được quản lý, mà không phải về nơi đã

gọi nó.
• Thanh ghi chỉ số: (Index).
Thanh ghi chỉ số cũng là một thanh ghi địa chỉ, được sử dụng để địa chỉ hóa các ô nhớ
trong chương trình. Với CPU 8 bit thanh ghi chỉ số thường là16 bit. Khi thanh ghi chỉ số
21
Memory
Memory Memory
SP
Acc
Acc
(a)
0FFH
100H
Reg.
SP 100H
Push Acc
Pop Reg.
Hình 2.4: Thao tác với ngăn xếp
(b) (c)
đã được nạp một giá trị nào đó, thì vùng nhớ 256 byte kể từ địa chỉ đó có thể truy cập
tới bằng kiểu chỉ số. Tức là các lệnh yêu cầu thao tác với các dữ liệu trong vùng nhớ
này, chỉ cần chỉ thị trong lệnh khoảng cách từ địa chỉ chứa trong thanh ghi chỉ số tới địa
chỉ cần truy cập, mà không cần phải chỉ thị cụ thể địa chỉ của ô nhớ đó.
Ví dụ khi thanh ghi chỉ số giữ giá trị 1000H, thì lệnh xử lý dữ liệu tại ô nhớ 1010H chỉ
cần cung cấp chỉ số là 10H, mà không phải đưa ra giá trị 1010H như cách địa chỉ hóa
thông thường.
Có thể biểu diễn hoạt động địa chỉ hóa của thanh ghi chỉ số như hình 2.5.
Giá trị của thanh ghi chỉ số sẽ được cộng với khoảng cách từ ô nhớ cần thao tác, để cho
ra địa chỉ cần thiết trong những lệnh có chế độ định vị địa chỉ chỉ số.
• Các thanh ghi đa năng (General Register).

Các thanh ghi này thông thường chiếm một số lượng lớn trong các CPU. Các CPU 8 bit
thông thường cũng có các thanh ghi đa năng 8 bit, các thanh ghi này cũng có thể ghép
chung từng cặp để tạo thành các thanh ghi 16 bit . Tuy không có các chức năng chuyên
dụng như các thanh ghi khác, nhưng chúng có thể thực hiện hầu hết các chức năng mà
các thanh ghi khác đảm nhiệm . Thường thì các thanh ghi đa năng được sử dụng lưu trữ
dữ liệu vào ra CPU, hoặc làm các biến tạm thời trong một chương trình. Ngoài ra khi
sử dụng chung từng cặp chúng có thể là nơi lưu trữ dữ liệu, và làm các biến 16 bit, hoặc
giữ địa chỉ của ô nhớ mà chương trình cần truy cập. Trong các lệnh về chuỗi thì chúng
có thể được sử dụng làm các bộ đếm số lần lặp, địa chỉ trong các lệnh về chuỗi dữ
liệu….
• Thanh ghi chứa: (Accumulator Register).
Thanh ghi chứa thường được các CPU sử dụng làm nơi chứa một toán hạng trong các
lệnh số học và logic, tức là nó thường án ngữ một đầu vào của đơn vị số học và logic
ALU. Đồng thời thanh chứa còn được sử dụng để lưu kết quả cuối cùng của phép tính
mà ALU vừa thực hiện. Với các chức năng này chiều dài các lệnh tính toán sẽ được
giảm ngắn, do không phải chỉ thị cả hai toán hạng và nơi lưu trữ kết quả. Ngoài ra thanh
chứa còn được sử dụng trong các phép quay dịch, và hầu hết các lệnh về di chuyển và
xử lý dữ liệu như một thanh ghi đa năng thông thường. Các CPU trước đây chỉ có một
22
Internal Bus
Index Register
Bộ cộng
Bus địa chỉ
Hình 2.5: Cung cấp địa chỉ bằng thanh ghi chỉ số.
thanh ghi chứa, nên các lệnh logic và số học bắt buộc phải di chuyển dữ liệu tới thanh
ghi chứa. Càng ngày CPU càng có nhiều thanh chứa hơn, nên chương trình được thực
hiện nhanh chóng hơn, do giảm bớt được các lệnh di chuyển dữ liệu đến thanh chứa.
• Thanh ghi cờ (Flag Register).
Thanh ghi cờ còn được gọi là thanh ghi mã trạng thái CCR (Condition Code Register)
bao gồm các bit độc lập. Mỗi bit chỉ có hai trạng thái 0 hoặc 1 được gọi là các cờ. Các

cờ rất ít khi tác động lẫn nhau, chúng chỉ tác động một cách độc lập tùy theo trạng thái
của các phép tính mà ALU thực hiện. Trạng thái các cờ là cơ sở để CPU thực hiện các
quyết định, nếu thỏa điều kiện chương trình thực hiện theo hướng này, còn ngược lại sẽ
theo một hướng khác, tạo ra sự rẽ nhánh cho các chương trình phù hợp với bài toán thực
tế.
Trong CPU 8 bit thường thanh ghi cờ 8 bit, số lượng các bit được sử dụng và các kiểu
cờ hiệu khác nhau tùy thuộc vào từng loại CPU. Các cờ thông thường của một CPU
gồm:
Cờ nhớ (Carry Flag).
Cờ nhớ được sử dụng làm bit dữ trữ khi kết quả các phép tính mà ALU thực hiện vượt
ra ngoài giới hạn lưu trữ cho phép của thanh chứa. Ví dụ khi sử dụng các thanh ghi 8
bit để cộng hai số 8 bit, kết quả có thể là 9 bit và cờ C sẽ giữ bit thứ 9. Tương tự khi
cộng hai số 16 bit cờ C sẽ giữ bit thứ 17 của kết quả.
Cờ nhớ cũng được thiết lập mức 1 khi ALU thực hiện phép trừ, giảm hoặc so sánh có
kết quả âm. Tức là cờ CF =1 khi số bị trừ nhỏ hơn số trừ.
Ngoài ra cờ nhớ còn được sử dụng như bit thứ 9 trong các lệnh quay dịch, ví dụ khi
dịch trái bit ở MSB sẽ bị rớt ra ngoài, cờ C sẽ giữ lấy bit đó.
Cờ dấu S ( Sign Flag).
CPU có hai cách biểu diễn một số: Cách thứ nhất nó dùng tất cả các bit của một thanh
ghi để biểu diễn một số dương. Ví dụ một thanh ghi 8 bit có thể biểu diễn các số thập
phân dương từ 1 tới 255. Cách thứ hai CPU sử dụng bit trọng số cao nhất để làm bit
dấu. Ví dụ như thanh ghi 8 bit thì bit D7 sẽ là bit dấu. Khi D7 ở mức 0 thì các bit
D0...D6 giữ một số nhị phân dương nằm trong khoảng 0 tới 127. Khi D7=1 thì thanh ghi
sẽ giữ số nhị phân âm trong khoảng –128 tới -1
Tổ hợp nhị phân từ 0000 0000......0111 1111 biểu diễn các số từ 0...127 tổ hợp tiếp theo
1000 0000 trong số có dấu được xem như là -128 và tiếp theo 1000 0001 = -127. Khi
tiếp tục đếm lên tới tổ hợp 1111 1111 = -1.
Cờ dấu S sẽ báo khi dấu thay đổi, cờ dấu =0 khi kết quả phép tính trong bộ chứa là số
dương (bit D7=0). Nếu bit D7=1 kết quả là một số âm 7 bit thì SF=1. Dựa vào cờ này
mà các chương trình này sẽ có cách tính thích hợp với các số có dấu.

Cờ tràn V (overflow) .
Cờ tràn VF sẽ được thiết lập mức 1 khi có sự tràn bit 1 từ D6 sang D7, tức là khi dấu
của số 7 bit thay đổi từ (+) sang (-). Cờ VF luôn được thiết lập khi có tràn, nó được
dùng cho các số được biểu diễn theo cách 7 bit hay cách 8 bit. Vì thế cần phải chú ý để
nó không ảnh hưởng gì đến chương trình. Cờ tràn sẽ bị xóa khi D7 trở về mức 0
Cờ ZERO ZF.
Khi ALU thực hiện các phép tính có kết quả trong thanh ghi chứa bằng 0, lúc đó cờ Z
sẽ được thiết lập lên mức 1. Còn ngược lại cờ Z=0. Thông thường cờ Z để thông báo
trạng thái so sánh bằng, kết quả của phép trừ = 0 , các phép logic = 0. Khi thực hiện các
phép cộng, mặc dù kết quả có dư ra bit thứ 9 nhưng nếu thanh chứa có giá trị 0 thì cờ
23
ZF vẫn = 1. Ví dụ cộng FF+01 kết quả là 100 thì số 1 ở cờ CF còn thanh chứa có giá trị
00 do đó cờ ZF =1.
Cờ Z đặc biệt tiện lợi cho các vòng lặp sử dụng bộ đếm xuống. Vòng lặp có thể giảm
một thanh ghi nào đó, cho đến khi nó trở về 0 thì ngưng. Với các công dụng như trên ZF
cùng với CF được sử dụng rất nhiều trong các chương trình.
Cờ nửa nhớ HF (Half Carry Flag ).
Cờ nửa nhớ trong một số CPU còn được gọi là cờ phụ AF (Auxiliary Flag) không giống
như CF, đóng vai trò bit thứ 9 của thanh chứa. Nó giống cờ tràn nhiều hơn, cờ nửa nhớ
sẽ được thiết lập mức 1 khi có sự tràn bit 1 từ D3 qua D4.
Tám bit của bộ chứa bao gồm 2 nibble riêng biệt, các bit 7-4 gọi là nibble trọng số lớn
MS(Most Significant) và 3-0 là nibble trong số nhỏ LS(Least Significant). Mỗi nibble là
mã số thập phân hoặc HEXA đơn. Khi thực hiện các phép tính với số BCD (tức số thập
phân) cần phải ghi nhận số nhớ của 4 bit thấp trong đơn vị 8 bit. Ta gọi số nhớ này là số
nửa nhớ. Một số CPU cờ nữa nhớ được gọi là cờ nhớ phụ AF (Auxiliary Flag ) nó sử
dụng như cờ tràn như trong các phép tính 16 bit.
Cờ chẵn lẻ PF (Parity Flag).
Cờ chẵn lẻ được sử dụng thông báo số các bit 1 trong kết quả của phép tính logic là
chẵn hoặc lẻ tùy theo từng loại CPU. Cờ chẵn lẻ thường được sử dụng trong các chương
trình truyền các dữ liệu nối tiếp, trạng thái của cờ có thể được phát ra để bên thu có thể

kiểm tra xem dữ liệu nhận được đúng hay sai. Chú ý là cờ chẵn lẻ không tác động khi
ALU thực hiện các phép tính số học.
Cờ trừ Subtract.
Cờ trừ thường được viết tắt là N (Negative) để phân biệt với cờ dấu S (Sign). Cờ trừ
được thiết lập khi CPU thực hiện các phép tính trừ như (trừ, so sánh , giảm). Cờ này
thường ít được sử dụng trong các chương trình.
Ngoài các cờ sử dụng cho việc thông báo trạng thái các phép tính như đã mô tả ở trên,
thanh ghi cờ còn có các cờ điều khiển sử dụng cho các mục đích khác như:
Cờ định hướng DF (Direction Flag).
Cờ này được sử dụng cho các lệnh xử lý chuỗi dữ liệu. Ví dụ như di chuyển chuỗi từ
vùng nhớ này sang vùng nhớ khác, so sánh chuỗi…. Khi thực hiện CPU lần lượt xử lý
từng byte 1 trong chuỗi. Để có được các thao tác này CPU sử dụng các thanh ghi địa
chỉ và sau mỗi lần xử lý 1 byte nó tự động tăng hoặc giảm thanh ghi địa chỉ. Việc tăng
hay giảm thanh ghi địa chỉ, tức là chuỗi được thao tác từ dưới lên trên hay từ trên xuống
dưới, sẽ tùy thuộc vào cờ định hướng. Thông thường DF=1 các lệnh xử lý chuỗi sẽ thực
hiện từ địa chỉ cao đến địa chỉ thấp.
Trong một số CPU các lệnh xử lý chuỗi tăng và giảm địa chỉ khác nhau, nghĩa là cùng
là di chuyển chuỗi nhưng có một lệnh thực hiện theo chiều tăng địa chỉ, và một lệnh
thực hiện theo chiều giảm địa chỉ. Các CPU như thế sẽ không có định hướng.
Cờ ngắt IF : (Interrupt Flag).
Cờ ngắt được thiết lập =1 bằng lệnh SI (Set Interrupt ) và xóa bằng lệnh CLI(Clear
Interrupt). Khi cờ ngắt=1 cho phép CPU ghi nhận tín hiệu yêu cầu ngắt có che, và thực
hiện chương trình ngắt. Khi cờ ngắt =0, mặc dù có tín hiệu yêu cầu, chương trình ngắt
sẽ không được thực hiện. Với các yêu cầu ngắt không che NMI (Non-Mask able
Interrupt) cờ ngắt không có ý nghĩa.
Cờ bẫy TF: (Trap Flag).
24
Cờ bẫy được thiết lập =1 và xóa = 0 bằng các lệnh lập xóa cờ bẫy, khi cờ bẫy bằng 1,
CPU hoạt động ở chế độ chạy từng bước để gỡ rối sửa sai chương trình. Cụ thể là khi
CPU thực hiện xong một lệnh nó chuyển qua chương trình con giám sát (Monitor).

Chương trình con giám sát được thực hiện bởi người sử dụng để kiểm tra lại kết quả
của lệnh vừa thực hiện ở các ô nhớ, các thanh ghi, các cờ. Sau đó CPU lại quay về thực
hiện lệnh tiếp theo của chương trình chính. Chương trình con giám sát sẽ được đặt tại
một địa chỉ xác định tùy theo loại CPU.
2.2.2. Đơn vị điều khiển CU: (Control Unit).
Đơn vị điều khiển còn được gọi là bộ giải mã lệnh, nó là nơi cung cấp các tín hiệu điều
khiển, cho phép tất cả các bộ phận khác trong CPU làm việc. Đơn vị điều khiển nhận
các mã lệnh từ hàng đợi lệnh, mã lệnh này sẽ được hệ thống các mạch điện tử giải mã,
tạo ra một dãy các tín hiệu cho phép. Tùy theo từng lệnh cụ thể mà các khối khác nhau
trong CPU sẽ được cho phép hoạt động. Các bộ vi xử lý khác nhau cơ bản ở cấu trúc
của đơn vị điều khiển. Một lệnh của họ vi xử lý này có thể là một lệnh hoàn toàn khác
trong một họ vi xử lý khác. Do cấu trúc các mạch điện tử bên trong của đơn vị điều
khiển khác nhau, mà CPU của các hãng khác nhau sẽ có các tập lệnh khác nhau. Vì thế
một chương trình viết cho hệ thống vi xử lý, sử dụng CPU của hãng nào thì phải tuân
theo tập lệnh , và trình biên dịch của hãng đó, nếu không chương trình sẽ không thể thực
hiện mặc dù cấu trúc bộ nhớ và I/O tương đương nhau.
Đơn vị điều khiển của các CPU truyền thống có thể thực hiện bằng hai phương pháp
chính là: Thực hiện bằng cách nối ghép cứng hệ thống các cổng logic, hoặc sử dụng bộ
nhớ. Đối với loại thứ nhất tập lệnh sẽ không thể thay đổi. Đối với loại sử dụng bộ nhớ,
mã lệnh lấy từ ngoài bộ nhớ sẽ đóng vai trò là địa chỉ của bộ nhớ, còn các đường dữ liệu
của bộ nhớ này sẽ đóng vai trò là các tín hiệu cho phép. Nếu cho phép lập trình lại bộ
nhớ này có thể tạo ra các lệnh mới cho vi xử lý, hoặc có thể thay đổi tập lệnh cho nó.
Nhờ có đơn vị điều khiển mà mã lệnh sẽ được giảm, vì nếu cung cấp các tín hiệu cho
phép ngay trong mã lệnh thì mỗi khối chức năng trong CPU sẽ phải được cho phép hoặc
không cho phép bằng một bit của mã lệnh. Nhưng khi có đơn vị điều khiển, mỗi lệnh
của chương trình đều phải tốn thời gian giải mã. Để khắc phục nhược điểm này người ta
chế tạo ra các CPU không có đơn vị điều khiển, các tín hiệu cho phép các khối chức
năng bên trong CPU hoạt động sẽ được lấy trực tiếp từ mã lệnh. Khi đó để đảm bảo mã
lệnh không quá dài số lệnh thực hiện được của CPU loại này ít hơn loại truyền thống rất
nhiều, tuy nhiên nó vẫn đủ để thực hiện tất cả các công việc, các lệnh phức tạp sẽ được

thực hiện bằng các thuật toán thích hợp từ các lệnh đơn giản. Các CPU loại này được
gọi là các CPU có tập lệnh rút gọn RISC (Reduce Instruction Set Computer). Còn các
CPU có đơn vị điều khiển như đã mô tả ở trên được gọi là các CPU có tập lệnh đầy đủ
CISC (Complex Instruction Set Computer).
2.2.3. Bộ điều khiển BUS.
Bộ điều khiển BUS nhận tín hiệu cho phép hoạt động từ bộ giải mã lệnh. Nó định thời
các tín hiệu địa chỉ, dữ liệu và điều khiển để các CPU liên lạc với thế giới bên ngoài.
Thông thường bộ điều khiển BUS được chia thành 3 phần: Bộ kiểm soát địa chỉ, bộ
kiểm soát dữ liệu và bộ định thời các tín hiệu điều khiển.
Bất cứ một lệnh truy cập bộ nhớ vào/ra nào cũng cần cung cấp đầy đủ ba nhóm tín hiệu
địa chỉ, dữ liệu và điều khiển. Địa chỉ từ một thanh ghi địa chỉ bộ nhớ hay lấy trực tiếp
từ mã lệnh trước tiên được cung cấp lên Bus nội (Internal Bus) đưa tới bộ đệm địa chỉ,
sau đó theo định thời của từng lệnh bộ đệm này sẽ được mở để cung cấp địa chỉ ra Bus
25
địa chỉ bên ngoài xác định bộ nhớ vào ra làm việc với CPU. Chú ý rằng bộ đệm địa chỉ
có một chiều truyền ra. Tương tự như vậy với bộ kiểm soát dữ liệu, chỉ khác là bộ đệm
dữ liệu là hai chiều, hoặc mở cho dữ liệu từ ngoài đi vào Bus nội trong các chu kỳ đọc,
hoặc mở cho dữ liệu từ Bus nội cung cấp ra bên ngoài trong các chu kỳ ghi. Tuỳ theo
lệnh truy cập là đọc hay ghi mà các tín hiệu điều khiển sẽ được định thời cung cấp ra
bên ngoài một cách thích hợp. Ngoài ra BIU còn nhận các tín hiệu điều khiển cung cấp
từ bên ngoài để thực hiện một số chu kỳ truy xuất đặc biệt khác như ngắt, DMA….
2.2.4. Đơn vị số học và logic ALU : (Arithmetic Logic Unit).
Đơn vị số học và logic (ALU) là một bộ phận quan trọng trong CPU để thực hiện các
phép toán số học và logic bao gồm:
Phép toán Dạng lệnh gợi nhớ Ý nghĩa lệnh
Cộng
Trừ
Nhân
Chia
And

Or
Xor
Not
Dịch trái
Dịch phải
Quay trái
Quay phải
Dịch phải số học
ADD M
SUB M
MUL M
DIV M
AND M
OR M
XOR M
NOT
SHL
SHR
RRL
RRR
ASR
Cộng số M với Acc
Trừ Acc đi M
Nhân Acc với M
Chia Acc cho M
And Acc với M
Or Acc với M
Xor Acc với M
Đảo Acc
Dịch trái Acc

Dịch phải Acc
Quay trái Acc
Quay phải Acc
Dịch phải số học Acc
Khi CPU thực hiện các bài toán thực tế, chương trình phải có các hướng giải quyết với
các điều kiện khác nhau bằng các lệnh nhảy. Trước khi thực hiện các lệnh nhảy, chương
trình thường thực hiện các lệnh so sánh để thiết lập các bit của thanh ghi cờ. Các lệnh
so sánh và nhảy cũng được ALU đảm nhiệm. Các lệnh này được viết như trong bảng
sau:
Lệnh Dạng lệnh gợi nhớ Ý nghĩa lệnh
So sánh
Nhảy
CMP M
Jxx L
So sánh Acc với M, lập cờ EQ nếu bằng,
lập cờ GT nếu M>Acc.
Thực hiện lệnh tại nhãn L nếu điều kiện
thoả mãn:
JGT: nhảy nếu lớn hơn
JGE: nhảy nếu lớn hơn hoặc bằng.
JEQ: nhảy nếu bằng
JLE: nhảy nếu nhỏ hơn hoặc bằng
JLT: nhảy nếu nhỏ hơn
JNE: nhảy nếu không bằng.
Ngoài ra còn một số lệnh di chuyển dữ liệu trong hệ thống vi xử lý tác động tới ALU
như:
26
Lệnh Dạng gợi nhớ Ý nghĩa của lệnh
Nạp
Chuyển đổi

Xoá
LDA M
EX M
CLA
Nạp giá trị M vào Acc.
Chuyển đổi giá trị giữ M và Acc.
Xoá Acc

Trong thực tế các loại CPU của các hãng khác nhau, sẽ có các lệnh với cách viết gợi
nhớ khác nhau.
• Cấu trúc ALU.
Trong các bài toán các phép toán cần thực hiện, có thể bao gồm hai toán hạng (như
cộng ) hoặc một toán hạng (not). Phép toán một số còn gọi là phép toán đơn (monadic
operation), phép toán hai số gọi là phép toán hai ngôi (dyadic operation). Để thực hiện
các phép toán trên ALU có cấu trúc như hình vẽ 2.6.
ALU nối với BUS hệ thống bằng hai nhóm đường. Nhóm bên phải chỉ sử dụng để nhập
dữ liệu vào ALU, nhóm này thường được sử dụng để đưa một toán hạng vào ALU trong
các phép toán. Nhóm bên trái được nối với thanh chứa Acc và từ thanh chứa nối ra
BUS hệ thống. Nhóm tín hiệu này có thể là vào hoặc ra. Thanh chứa được sử dụng cho
các công việc:
- Giữ toán hạng thứ hai trong các phép toán hai ngôi.
- Giữ toán hạng duy nhất trong các phép toán đơn .
- Giữ kết quả của các phép toán .
Một số CPU không có thanh chứa mà sử dụng bộ nhớ tạm thời là một thanh ghi ngoài
ALU, các loại này không phổ biến lắm nên ta xem xét Acc như một phần của ALU.
2.3. CẤU TRÚC CỦA CÁC BỘ VI XỬ LÝ CÔNG NGHỆ CAO.
Trong thập kỷ 90 và cho tới ngày nay việc cải tiến về tốc độ và cấu trúc vi xử lý có các
bước tiến vượt bậc. Để nâng cao tốc độ tính toán với nhu cầu đa phương tiện, đa nhiệm
hàng loạt bộ vi xử lý mới ra đời với công nghệ cao, các kỹ thuật mới và có thêm các
khối chức năng chuyên dụng. Sơ đồ khối tổng quát cho các bộ vi xử lý này có thể biểu

diễn trên hình 2.7. Sơ đồ này không chỉ thị cho một bộ vi xử lý cụ thể, tuy nhiên nó bao
gồm các đặc trưng chính của tất cả các bộ vi xử lý hiện đại.
Hầu hết các bộ vi xử lý hiện đại có 32 bit dữ liệu, nhưng một số vi xử lý có số đường
dữ liệu là bội số của 32. Ngoài ra còn có các vi xử lý truy cập dữ liệu bằng nhiều BUS
27
Acc
Flags
Các tín hiệu
chọn hàm
Bus nội
Các hàm số cơ bản
Hình 2.6: Cấu trúc ALU.

×