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

Chương 3 - Bộ Vi xử lý 8088 pptx

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 (545.21 KB, 70 trang )

Chơng 3
Bộ Vi xử lý Intel 8088
Sau khi đã tìm hiểu qua về cấu trúc của hệ vi xử lý, trong chơng ny 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ý no khác (điều m nhiều ngời khác cũng đã
lm). 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ọ ny sẽ còn đợc sử dụng rộng rãi trong hng 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 ny. 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 vo lĩnh vực ny. Thứ ba, các họ vi xử lý của các hãng tuy có
khác nhau nhng xét cho cùng cũng có khá nhiều điểm chủ yếu rất giống nhau. Do đó
một khi đã nắm đợc các vấn đề kỹ thuật của 8088, ta sẽ có cơ sở để nắm bắt đợc các
kỹ thuật của các bộ vi xử lý khác cùng trong họ Intel 80x86 hoặc của các họ khác.
1. Giới thiệu cấu trúc bên trong v hoạt động của bộ vi xử lý 8088
Trớc 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:



27

E.U. (execution unit) B.I.U. (Bus interface unit)

































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.
BUS
ngoi
Bus dữ liệu
(8 bit)
Bus trong
của CPU
8bit dữ liệu
20bitđịa chỉ
Bus địa chỉ (20bit)
AX
BX
CX
DX
SP
BP
SI
DI
CS
DS
SS
ES
IP
Logic
điều khiển
BUS
Các thanh ghi tạm thời
Thanh ghi cờ
ALU

Đệm lệnh (hng đợi lệnh)
(6 byte cho 8086)
Khối
điều khiển
của E U



Các thanh ghi
đa năng
Bus dữ liệu
ALU (16bit)
Các thanh
ghi đoạn v
con trỏ lệnh
Các thanh ghi
con trỏ v chỉ số

28
1.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 thnh 2 phần lm việc đồng thời có liên hệ với nhau qua đệm
lệnh lm 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 ngoi hoặc đi vo 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ừ/vo cổng hoặc bộ

nhớ. Nói cách khác BIU chịu trách nhiệm đa địa chỉ ra bus v trao đổi dữ liệu với
bus.
Trong EU ta thấy có một khối điều khiển (control unit, CU). Chính tại bên
trong khối điều khiển ny có mạch giải mã lệnh. Mã lệnh đọc vo từ bộ nhớ đợc đa
đến đầu vo 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 ngoi 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 ny đọ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 ti liệu của Intel bộ đệm lệnh
ny còn đợc gọi l hng đợi lệnh). Đây l một cấu trúc mới đợc cấy vo 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) vo ứ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ế ny.
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ệ ny 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 nhn 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 vo 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 thnh 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 ny có khả năng lm
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ộ


29
đệ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 vo bộ nhớ đệm lệnh đã nói. Bộ đệm lệnh ny lm
việc theo kiểu "vo trớc - ra trớc" (first in - first out, FIFO), nghĩa l byte no đợc
cất vo đệm trớc sẽ đợc lấy ra xử lý trớc. Nếu có sự vo/ra liên tục của dòng mã
lệnh trong bộ đệm ny 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 để lm 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 ny nội
dung cũ của bộ đệm sẽ bị xoá v thay thế vo đó 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 ny 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ự.


không có pipelining
F1 D1 E1 F2 D2 E2 F3 D3 E3
có pipelining F1 D1 E1
F2 D2 E2
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, ngoi ra cũng có một số thanh ghi 8 hoặc 16 bit tại EU. Ta sẽ lần lợt giới
thiệu các thanh ghi nói trên cùng chức năng chính của chúng.
Các thanh ghi đoạn
Khối BIU đ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 2

20
= 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 ny bộ nhớ cần đợc chia thnh các vùng khác nhau (điều ny
rất có lợi khi lm việc ở chế độ nhiều ngời sử dụng hoặc đa nhiệm) dnh 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 vo 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ữ

30
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 ny 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ớ ny l 64 Kbyte
v tại một thời điểm nhất định bộ vi xử lý chỉ lm việc đợc với 4 đoạn nhớ 64 Kbyte
ny. Việc thay đổi giá trị của các thanh ghi đoạn lm 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 ny có thể
nằm cách nhau khi thông tin cần lu 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 độ di 64
Kbyte v vì thế những đoạn khác có thể bắt đầu nối tiếp ngay sau đó. Điều ny cũng
cho phép ta truy nhập vo bất kỳ đoạn nhớ (64Kbyte) no nằm trong ton 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ỉ ny 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 vo đị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ể no đó so
với ô đầu đoạn. Độ lệch ny đợ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ớ no đó trong một đoạn bất kỳ, CPU 8088 phải dùng đến 2 thanh
ghi 16 bit (một thanh để chứa địa chỉ cơ sở, còn thanh kia chứa độ lệch) v từ nội
dung của cặp thanh ghi đó nó tạo ra địa chỉ vật lý theo công thức sau:

Địachỉvậtlý = Thanhghiđoạ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ớ no đó 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 ny 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 no đó 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

31
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ỉ ny (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
ny 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 vo 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ị:


Thanh ghi đoạn Thanh ghi lệch
1000H 2345H
1200H 0345H
1004H 2305H
0300H E345H

Các thanh ghi đa năng
Trong khối EU có 4 thanh ghi đa năng 16 bit: AX, BX, CX, DX. Điều đặc biệt
l khi cần chứa các dữ liệu 8 bit thì mỗi thanh ghi ny có thể tách ra thnh 2 thanh
ghi 8 bit cao v thấp để lm 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, nhng cũng
có những công việc đặc biệt nhất định chỉ thao tác với một vi thanh ghi no đó v
chính vì vậy các thanh ghi thờng đợc gán cho những cái tên đặc biệt rất có ý nghĩa.
Cụ thể:
AX (accumulator, Acc): thanh chứa. Các kết quả của các thao tác thờng
đợc chứa ở đây (kết quả của phép nhân, chia). Nếu kết quả l 8 bit thì
thanh ghi AL đợc coi l Acc.
BX (base): thanh ghi cơ sở, thờng chứa địa chỉ cơ sở của một bảng dùng
trong lệnh XLAT.
CX (count): bộ đếm. CX thờng đợc dùng để chứa số lần lặp trong trờng
hợp các lệnh LOOP (lặp), còn CL thờng chứa số lần dịch hoặc quay trong các

lệnh dịch hoặc quay thanh ghi.
DX (data): thanh ghi dữ liệu. DX cùng AX tham gia vo 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 vo/ra dữ liệu trực tiếp (IN/OUT).

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

32
Trong 8088 còn có 3 thanh ghi con trỏ v 2 thanh ghi chỉ số 16 bit. Các thanh
ghi ny (trừ IP) đều có thể đợc dùng nh các thanh ghi đa năng, nhng ứ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ỏ vo 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 ny ứ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ỏ vo 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ỏ vo đỉ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ỉ vo 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ỉ vo 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.

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 vo các cờ ny 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 nhng ngời ta chỉ dùng hết 9 bit của nó để lm các bit cờ (hình 3.3).


Các cờ của bộ vi xử lý 8085

O D I T S Z A P CX X X X X X X
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.

33
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' thnh tính
chẵn lẻ chẵn hoặc 'odd parity' thnh tính chẵn lẻ lẻ.
A hoặc AF (auxiliary carry flag): cờ nhớ phụ, rất có ý nghiã khi ta lm 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ờ trn, OF = 1 khi kết quả l một số bù hai vợt

ra ngoi giới hạn biểu diễn dnh 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 no đó, 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. Ngoi ra, bộ vi xử lý 8088 còn có các cờ
điều khiển sau đây (các cờ ny đợc lập hoặc xoá bằng các lệnh riêng):
T hoặc TF (trap flag): cờ bẫy, TF = 1 thì CPU lm việc ở chế độ chạy từng
lệnh (chế độ ny dùng khi cần tìm lỗi trong một chơng trình).
I hoặc IF (interrupt enable flag): cờ cho phép ngắt, IF = 1 thì CPU cho phép
các yêu cầu ngắt (che đợc) đợc tác động.
D hoặc DF (direction flag): cờ hớng, DF = 1 khi CPU lm việc với chuỗi ký
tự theo thứ tự từ phải sang trái (vì vậy D chính l cờ lùi).

ý nghĩa của các cờ đã khá rõ rng. Riêng cờ trn cần phải lm rõ hơn để ta
hiểu đợc bản chất v cơ chế lm việc của nó. Cờ trn thờng đợc dùng đến khi ta
lm việc với số bù hai có dấu. Để cho việc giải thích đợc đơn giản, đầu tiên giả thiết
ta lm việc với số bù hai di 8 bit, kết quả để ở AL (xem hình 3.4). Gọi C
67
l cờ nhớ từ
bit 6 (b6) lên bit 7 (b7), trong đó b7 l MSB v cũng chính l bit dấu (SF) của AL. Ta
có thể chứng minh đợc rằng quan hệ giữa cờ OF với các cờ CF v C
67
tuân theo
phơng trình sau:
OF = CF C
67

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 trn sẽ
xẩy ra (cờ OF=1) nếu có nhớ từ MSB (tức l từ SF) sang CF nhng lại không có nhớ

vo chính nó (SF) hoặc ngợc lại. Điều ny có thể tổng quát hoá cho các trờng hợp
lm việc với số bù hai có dấu với độ di 16/32 bit.


CF
b7 b6
AL
b0

C
67


34





Hình 3.4. Sơ đồ thanh ghi AL v các cờ CF, C
67
.
1.2. 8086 v 8088
Chế độ Chế độ
MIN MAX
GND Vcc
[AD14] A14 A15
[AD13] A13 A16/S3
[AD12] A12 A17/S4
[AD11] A11 A18/S5

[AD10] A10 A19/S6
[AD9] A9
SS0
(
BHE
/S7)
[AD8] A8 MN/
MX

AD7
RD

AD6 HOLD (
RQ
/
GT0
)
AD5 HLDA (
RQ
/
GT1
)
AD4
WR
(
LOC
K
)
AD3 IO/
M

(
S2
)
AD2 DT/
R
(
S1
)
AD1
DEN
(
S0
)
AD0 ALE (QS0)
NMI
IN T A
(QS1)
INTR
TEST

CLK READY
GND RESET
1 40
2 39
3 38
4 37
5 36
6 35
7 34
8 33

9 32
10 31
[8086]
P

8088
11 30
12 29
13 28
14 27
15 26
16 25
17 24
18 23
19 22
20 21


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 vo 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 hon chỉnh, còn 8088 l bộ vi xử lý với 16 bit dữ liệu bên
trong (giống nh 8086), nhng khi ra ngoi bus dữ liệu của nói chỉ còn 8 bit. Cấu trúc

35
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 ở độ di bộ nhớ đệm lệnh (hng đợi lệnh): độ di ny ở 8088 l 4 byte còn ở
8086 l 6 byte; điều ny 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ó độ di nh
nhau). Điều ny có ảnh hởng nhiều đến công năng (perfomance) v giá thnh của hệ
thống xây dựng trên cơ sở các bộ vi xử lý ny. Đố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 hng' (1 từ trong bộ nhớ đợc coi l
xếp thẳng hng 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
hng' (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 hnh 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, nhng 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.
2. 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ý sẽ có lợi khi ta cần dịch "bằng
tay" một lệnh gợi nhớ khi lm việc với các 'kit' vi xử lý (tuy rằng việc ny ít khi xảy ra
vì ta thờng lm 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ó độ di một vi byte tuỳ theo bộ vi xử lý. Giả thiết một bộ vi
xử lý no đó 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 ny có thể mã hoá đợc l 256 lệnh. Trong thực tế việc ghi
lệnh không phải hon ton đơ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ó độ di 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 vo 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 hng
trăm mã lệnh khác nhau để mã hoá tổ hợp các lệnh ny.

36
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 ny luôn l 100010. Đối với các thanh ghi đoạn thì điều ny 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.



Byte 1 Byte 2 Byte 3 Byte 4

1 0 0 0 1 0
Opcode D W mod REG M/R
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:

Disp
L
Disp
H

Địa chỉ trực tiếp Địa chỉ trực tiếp
phần thấp phần cao

Thanh ghi mã Thanh ghi đoạn mã

W=1 W=0
AX AL 000 CS 01
BX BL 011 DS 11
CX CL 001 ES 00
DX DL 010 SS 10
SP AH 100
DI BH 111
BP CH 101
SI DH 110


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

37
ra địa chỉ của toán hạng, xem thêm phần sau của chơng ny để 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 ny.
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
W=0 W=1
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
100 [SI] [SI] + d8 [SI] + d16 AH SP
101 [DI] [DI] + d8 [DI] + d16 CH BP
110 d16
(địa chỉ trc tiếp)
[BP] + d8

[BP] + d16

DH SI
111 [BX] [BX] + d8 [BX] + d16 BH DI

chế độ bộ nhớ chế độ thanh ghi


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 vi
lệnh MOV.

- MOV CL,[BX]

1 0 0 0 1 0 1 0 0 0001111

Opcode mã hoá CL
chuyển tới thanh ghi
chuyển 1 byte [BX]



- MOV 0F3H[SI],CL:


38
1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1

CL
Chuyển từ thanh ghi 1 byte [SI] d8=F3H
3. Các chế độ địa chỉ của bộ vi xử lý 8088
Chế độ địa chỉ (addressing mode) l cách để CPU tìm thấy toán hạng cho các
lệnh của nó khi hoạt động. Một bộ vi xử lý có thể có nhiều chế độ địa chỉ. Các chế độ

địa chỉ ny đợc xác định ngay từ khi chế tạo ra bộ vi xử lý v sau ny 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ỉ ny 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ỉ ny 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ụ

MOV BX,DX ; chuyển nội dung DX vo BX.
MOV DS,AX ; chuyển nội dung AX vo DS.
ADD AL,DL ; cộng nội dung AL v DL rồi đa vo
; AL.
Chế độ địa chỉ tức thì

39
Trong chế độ địa chỉ ny 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 ny ở ngay sau mã
lệnh (chính vì vậy chế độ địa chỉ ny có tên l chế độ địa chỉ tức thì). Ta có thể dùng
chế độ địa chỉ ny để nạp dữ liệu cần thao tác vo bất kỳ thanh ghi no (trừ các
thanh ghi đoạn v thanh cờ) hoặc vo bất kỳ ô nhớ no trong đoạn dữ liệu DS.


Ví dụ

MOV CL,100 ; chuyển 100 vo CL.
MOV AX,0FF0H ; chuyển 0FF0H vo AX để rồi đa
MOV DS,AX ; vo DS (vì không thể chuyển
; trực tiếp vo thanh ghi đoạn).
MOV [BX],10 ; Chuyển 10 vo ô 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.
Chế độ địa chỉ trực tiếp
Trong chế độ địa chỉ ny một toán hạng chứa địa chỉ lệch của ô nhớ dùng
chứa dữ liệu còn toán hạng kia chỉ có thể l thanh ghi m không đợc l ô nhớ.
Nếu so sánh với chế độ địa chỉ tức thì ta thấy ở đây ngay sau mã lệnh không
phải l toán hạng m l địa chỉ lệch của toán hạng. Xét về phơng diện địa chỉ thì đó
l địa chỉ trực tiếp.

Ví dụ

MOV AL,[1234H] ;chuyển nội dung ô nhớ DS:1234
; vo AL.
MOV [4320H],CX ;chuyển nội dung CX vo 2 ô nhớ

; liên tiếp DS:4320 v DS:4321.
Chế độ địa chỉ gián tiếp qua thanh ghi
Trong chế độ địa chỉ ny 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).

Ví dụ

40

MOV AL,[BX] ; chuyển nội dung ô nhớ có địa
; chỉ DS:BX vo AL.
MOV [SI],CL ; chuyển nội dung CL vo ô nhớ
; có địa chỉ DS:SI.
MOV [DI],AX ; chuyển nội dung AX vo 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ỉ ny 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í dụ

MOV CX,[BX]+10 ; chuyển nội dung 2 ô nhớ liên
; tiếp có địa chỉ DS:(BX+10) v
; DS:(BX+11) vo CX.
MOV CX,[BX+10] ;1 cách viết khác của lệnh trên.
MOV CX,10 [BX] ; 1 cách viết khác của lệnh đầu.

MOV AL,[BP]+5 ;chuyển nội dung ô nhớ SS:(BP+5)
; vo AL.
ADD AL,Table[BX]; cộng AL với nội dung ô nhớ do
; BX chỉ ra trong bảng Table
; (bảng ny nằm trong DS), kết
; quả đa vo AL.


Nhân đây cần lm rõ một số thuật ngữ hay dùng thông qua các ví dụ trên:
- 10, 5, Table gọi l các dịch chuyển của các toán hạng tơng ứng. 10 v 5 l
các giá trị cụ thể, Table l tên mảng biểu diễn dịch chuyển của mảng (phần tử đầu
tiên) so với địa chỉ đầu của đoạn dữ liệu DS,
- (BX+10) hoặc (BP+5) gọi l địa chỉ hiệu dụng (effective address, EA, theo
cách gọi của Intel),
- DS:(BX+10) hoặc SS:(BP+5) chính l logic tơng ứng với một địa chỉ vật lý.
- Theo cách định nghĩa ny thì địa chỉ hiệu dụng của một phần tử thứ BX no
đó (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ố

41
Trong chế độ địa chỉ ny 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) vo 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)
;vo 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ỉ ny 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ả thnh 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ỉ ny 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) vo AX.
MOV AX,[BX+SI+8] ; 1 cách viết khác của
; lệnh trên.
MOV CL,[BP+DI+5] ; chuyển nội dung ô nhớ
; SS:(BP+DI+5) vo CL.

Tổng kết các chế độ địa chỉ
Các chế độ địa chỉ đã trình by ở trên có thể tóm tắt lại trong bảng 3.2.
Một hình thức tổng kết khác về các chế độ địa chỉ của 8086/88 đợc biểu diễn
trên hình 3.7.

Phơng pháp bỏ ngầm định thanh ghi đoạn (Segment override)

42
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 ny 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, ngoi các tổ hợp ngầm định đã kể, 8088 còn cho phép ta lm 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 ny 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ỏ ny chỉ cần ghi rõ thanh ghi đoạn.

Bảng 3.2. Tóm tắt các chế độ địa chỉ.
Chế độ địa chỉ Toán hạng Thanh ghi đoạn
ngầm định
Thanh ghi Reg
Tức thì Data
Trực tiếp [offset] DS
Gián tiếp qua thanh ghi

[BX]
[SI]
[DI]
DS
DS
DS
Tơng đối cơ sở

[BX] + Disp
[BP] + Disp

DS
SS
Tơng đối chỉ số

[DI] + Disp
[SI] + Disp
DS
DS
Tơng đối chỉ số cơ sở



[BX] + [DI] + Disp
[BX] + [SI] + Disp
[BP] + [DI] + Disp
[BP] + [SI] + Disp
DS
DS
SS
SS

(
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.
Thanh ghi đoạn CS DS ES SS
Thanh ghi lệch IP SI,DI,BX DI SP,BP

Ví dụ
Trong lệnh chuyển dữ liệu


MOV AL,[BX]

43

thì địa chỉ vật lý của toán hạng để chuyển vo thanh ghi AL tơng ứng với DS:BX, vì
DS l đoạn ngầm định của vùng nhớ chứa toán hạng do BX chỉ ra. Nếu ta muốn thay
đổi, không lấy toán hạng trong đoạn dữ liệu DS nữa, m lại lấy toán hạng trong đoạn
dữ liệu phụ ES để đa vo AL, thì ta phải viết lại lệnh ở trên thnh

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 ny 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.
4. Mô tả tập lệnh của bộ vi xử lý 8088
Có nhiều cách trình by tập lệnh của một bộ vi xử lý: trình by các lệnh theo
các nhóm hoặc theo thứ tự abc. Ta sẽ chọn cách lm thứ 2 để sau ny 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.
Địa chỉ hiệu dụng
Chế độ cơ sở hoặc chỉ số
BP
DI
SI
hoặc
BP

BX
BX
+
+
DSì16
SSì16
ESì16
hoặc
ho
hoặc


c
SI
DI
hoặc
hoặc
hoặc
Dịch chuyển
Địa chỉ vật lý
+
+
Chế độ chỉ số cơ sở

+
CSì16
hoặc

44
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 lm điều ny 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ố ny không có ý nghĩa gì vì nó không phải
l số BCD đúng. Ta sẽ thu đợc số BCD không gói nếu dùng thêm lệnh AAA:


; AL = 0011 0000B = 30H = '0',
; BL = 0011 1001B = 39H = '9',
ADD AL,BL ; thu đợc AL = 0110 1001B = 69H , kết
; quả sai.
AAA ; thu đợc AL = 0000 1001B = 9, kết quả
; đúng.
OR AL,30H ; thu đợc AL = 39H = '9' để truyền kết
; quả trở lại thiết bị đầu cuối.

AAD - ASCII Adjust before Division (Chỉnh trớc khi chia 2 số ở dạng
ASCII)
Lệnh ny đổi 2 số BCD không gói ở AH v AL sang số hệ hai tơng đơng để
tại AL. Việc ny phải thực hiện trớc khi lm phép chia một số BCD không gói (gồm 2
chữ số) để trong AX cho một số BCD không gói khác. Kết quả v số d cũng l các số
BCD không gói.

Không xác định: Tất cả các cờ.

Ví dụ
; AX=0605H l số BCD không gói của 65
; (số bị chia)

; BL=08H l số BCD không gói
; (số chia).

45
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 ny dùng để đổi một số hệ hai, l tích của 2 số BCD không gói, có trong
AL sang số BCD không gói để tại AX.

Cập nhật: PF, SF, ZP.
Không xác định: AF, CF, OF.

Ví dụ
Sau khi nhân 2 số 5 v 9 ở dạng ASCII. Ta đổi kết quả sang dạng BCD không
gói bằng lệnh AAM v sau đó đổi tiếp thnh mã ASCII để truyền tiếp.

; AL = 0011 0101B = 35H = '5',
; BL = 0011 1001B = 39H = '9',
MUL BL ; thu đợc AX = 002DH = 45,
AAM ; thu đợc AX = 0405H, mã BCD
; 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 ny 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.

Cập nhật: AF, CF.
Không xác định: OF, PF, SF, ZP .

Ví dụ
a) ;BL = 0011 0101B = 35H = '5',
;AL = 0011 1001B = 39H = '9',
;ASCII 9 - ASCII 5:

SUB AL,BL ; thu đợc AL = 04H = 4,
AAS ; thu đợc AL = 04H, mã BCD không
; gói của 4.
OR AL,30H ; thu đợc AL = 34H, mã ASCII cho 4

46
; để truyền kết quả trở lại thiết bị
; đầu cuối.

b) ;AL = 0011 0101B = 35 H = '5',
;BL = 0011 1001B = 39 H = '9',
;ASCII 5 - ASCII 9:

SUB Al,BL ; thu đợc AL = FCH =-4, CF=1,
AAS ; thu đợc AL = 04H, mã BCD không
; gói của 4,CF=1(có thể dùng cho các

; phép trừ nhiều chữ số)


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

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

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

Trong đó toán hạng đích v gốc có thể tìm đợc theo các chế độ địa chỉ khác
nhau, nhng phải chứa dữ liệu có cùng độ di v không đợc phép đồng thời l 2 ô
nhớ v cũng không đợc l thanh ghi đoạn. Điều hạn chế ny cũng áp dụng cho các
lệnh khác có ngữ pháp tơng tự.

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 ny 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+CF
ADC CL,BL ; CL CL+BL+CF
ADC DL,[SI] ; DL DL+{DS:SI}+CF
ADC AL,Table[BX] ; AL AL+{DS:(Table+BX)}+CF

ADD - Add (Cộng 2 toán hạng)

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

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


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

47

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

AND - And Corresponding Bits of Two Operands (V 2 toán hạng)

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

Mô tả: Đích Đích Gốc

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

Xoá: CF,OF.
Cập nhật: PF, SF, ZP. PF chỉ có nghĩa khi toán hạng l 8 bit.
Không xác định: AF.

Ví dụ
AND AL,BL ; AL AL BL theo từng bit.
AND BL,0FH ; Che 4 bit cao của BL.


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

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

Nh vậy, nếu l gọi gần:
+ SP SP - 2 v địa chỉ lệnh trở về đợc cất vo ngăn xếp {SP} IP.
+ IP Địa chỉ lệch của chơng trình con.
+ Khi gặp lệnh RET tại cuối ctc thì sẽ có thao tác ngợc lại:
{SP} IP v SP SP + 2.


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

+ SP SP - 2 v địa chỉ lệch của lệnh trở về đợc cất vo ngăn xếp:
{SP} CS.
+ SP SP - 2 v địa chỉ cơ sở của lệnh trở về đợc cất vo ngăn xếp:
{SP} IP.
+ IP Địa chỉ lệch của chơng trình con,
CS Địa chỉ cơ sở của chơng trình con,
+ Khi gặp lệnh RET tại cuối ctc thì sẽ có thao tác ngợc lại:
{SP} IP v SP SP + 2.

{SP} CS v SP SP + 2,

Viết lệnh: Sau đây l ví dụ các dạng khác nhau của các lệnh gọi ctc v
cách tính địa chỉ của ctc:

CALL Multiple: Gọi ctc có tên l Multiple trong cùng đoạn mã với CTC, ctc
ny phải nằm trong giới hạn dịch chuyển -32Kbyte (dịch về phía địa chỉ thấp) hoặc
(32K-1)byte (dịch về phía địa chỉ cao) so với lệnh tiếp theo ngay sau lệnh Call. Sau
khi cất IP cũ (địa chỉ trở về) vo ngăn xếp, IP mới đợc tính: IP IP + Dịchchuyển.

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

Divi Proc Far

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

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

CALL WORD PTR [BX]: Gọi ctc nằm trong cùng đoạn mã, ctc có địa chỉ
dịch chuyển (tính từ lệnh tiếp ngay sau lệnh gọi tới lệnh đầu tiên của ctc) chứa trong
2 ô nhớ do BX v BX+1 chỉ ra trong đoạn DS. Địa chỉ lệch ny sẽ đa vo IP (SI, DI có
thể dùng thay chỗ của BX).

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




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

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

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

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

CLC - Clear the Carry Flag (Xoá cờ nhớ)

Mô tả: CF 0.

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

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

Mô tả: DF 0.

Lệnh ny định hớng thao tác theo chiều tiến () cho các lệnh liên quan đến
chuỗi. Các thanh ghi liên quan l SI v DI sẽ đợc tự động tăng khi lm việc xong với
một phần tử của chuỗi.


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

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

Mô tả: IF 0.

Lệnh ny xoá cờ cho phép ngắt. Các yêu cầu ngắt che đợc sẽ bị che.

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

CMC - Complement the Carry Flag (Đảo cờ nhớ)

Mô tả: CF CF.

Cập nhật: CF.

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

CMP - Compare Byte or Word (So sánh 2 byte hay 2 từ)

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

Mô tả: Đích - Gốc

Trong đó toán hạng đích v gốc có thể tìm đợc theo các chế độ địa chỉ khác
nhau, nhng phải chứa dữ liệu có cùng độ di v không đợc phép đồng thời l 2 ô
nhớ.
Lệnh ny chỉ tạo các cờ, không lu kết quả so sánh, sau khi so sánh các toán
hạng không bị thay đổi. Lệnh ny thờng đợc dùng để tạo cờ cho các lệnh nhảy có

điều kiện (nhảy theo cờ).
Các cờ chính theo quan hệ đích v gốc khi so sánh 2 số không dấu:

CF ZF
Đích = Gốc 0 1
Đích > Gốc 0 0
Đích < Gốc 1 0

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

CMPS/CMPSB/CMPSW - Compare String Bytes or String Words (So
sánh 2 chuỗi byte hay 2 chuỗi từ)

Viết lệnh: CMPS Chuỗiđích,Chuỗigốc
CMPSB
CMPSW

Mô tả: Chuỗiđích - Chuỗigốc

Lệnh ny so sánh từng phần tử (byte hay từ) của 2 xâu có các phần tử cùng
loại. Lệnh chỉ tạo các cờ, không lu kết quả so sánh, sau khi so sánh các toán hạng
không bị thay đổi. Trong lệnh ny ngầm định các thanh ghi với các chức năng:

+ DS:SI l địa chỉ của phần tử so sánh trong chuỗi gốc,
+ ES:DI l địa chỉ của phần tử so sánh trong chuỗi đích.
+ Sau mỗi lần so SI SI 1, DI DI 1 hoặc SI SI 2, DI DI 2 một
cách tự động tuỳ thuộc cờ hớng DF l 0 hay 1 v chuỗi l chuỗi byte hoặc chuỗi từ.


51

×