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

Tài liệu Giáo trình: Lập trình hợp ngữ 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 (786.89 KB, 172 trang )

GV. Vương Quốc Dũng
1
------
Giáo trình
Lập trình hợp
ngữ


1
GV. Vương Quốc Dũng
Ch¬ng 1. MÔ HÌNH LẬP TRÌNH CỦA 8086
1.1. Giới thiệu chung về máy tính và sơ đồ cấu trúc của IBM-PC
1.1.1. Giới thiệu chung về máy tính:
* Máy tính ngày nay là máy tính số, thực chất là thiết bị điện tử thực hiện:
Nhận thông tin vào đã dược số hóa.
Xử lý thông tin theo dãy các lệnh nhớ sẵn bên trong.
Đưa thông tin ra.
Dãy các lệnh nhớ sẵn bên trong chính là các chương trình.
Máy tính gồm 2 phần:
Phần cứng (Hardware): Gồm các linh kiện vật lý.
Phần mềm (Software): Gồm các chương trình và dữ liệu.
* Các loại máy tính:
Máy tính điện tử đầu tiên ra đời vào năm 1946, rất cồng kềnh, nó chiếm khoảng
1500 m
2
. Hiện nay người ta chia máy tính ra làm 2 nhóm lớn:
+ Máy vi tính (MicroComputer):
Ra đời những năm 70 và phát triển rầm rộ vào những năm 80.
Đặc điểm: Máy tính được chế tạo ra cho 1 người sử dụng, còn gọi là máy tính cá
nhân (Personal Computer - PC).
Máy vi tính chia làm 4 loại:


. Desktop: Máy để bàn.
. WorkStation: Máy trạm làm việc. Đầu tiên khái niệm này xuất hiện với
máy mạng, xong ngày nay đây là loại máy PC có cấu hình mạnh.
Hai loại trên có đặc điểm chung là đặt cố định.
. NoteBook: Cỡ bỏ vừa cặp sách.
. Parmitop: Cỡ bé cầm tay.
+ Máy tính lớn:
Ra đời sớm hơn máy vi tính, hiện nay vẫn tồn tại và phát triển, xong không
nhiều vì đắt tiền và đã có mạng máy tính. Mạng máy tính thay cho máy tính lớn
hiệu quả hơn.
Đặc điểm: Hỗ trợ cho nhiều người sử dụng. Có 2 loại:
. MainFram.
. SuperComputer.
Những máy này sản xuất ra làm 2 mục đích:
. Làm máy chủ trong mạng máy tính lớn.
. Giải các bài toán phức tạp yêu cầu tốc độ nhanh.
1.1.2. Biểu diễn thông tin
1.1.2.1. Các số nhị phân (số hệ hai)
Trong máy tính để biểu diễn một giá trị số, chúng ta dùng hệ cơ số 2 hoặc nói ngắn gọn
hơn là hệ hai (Binary number system, viết tắt là hệ B). Trong đó chỉ tồn tại 2 chữ số 0 và 1
2
GV. Vương Quốc Dũng
để biểu diễn các giá trị số (ứng với 2 trạng thái: không có điện và có điện). 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).
Bit
Bit là thuật ngữ được viết tắt của cụm từ binary digit. Mỗi một bit còn cho ta biết được
trạng thái của một tín hiệu điện trên một đường dây tại một thời điểm: điện áp ở mức cao
(có điện) là 1, điện áp ở mức thấp (không có điện) 0.
1.1.2.2. Biểu diển dữ liệu
Hệ đếm

Hệ đếm thập phân
Trong cuộc sống hằng ngày chúng ta dùng hệ cơ số mười hoặc nói ngắn gọn là 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 để đếm. 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 hoặc d ở cuối để chỉ ra rằng đó là hệ 10 (một chữ số
không có ký hiệu chữ đi kèm ở sau thì ta ngầm hiểu đó là số hệ 10)
Hệ đếm nhị phân
Số nhị phân hay còn gọi là số hệ hai là hệ đếm dùng trong máy tính. Một số hệ hai gồm
các bit được đánh dấu bằng chữ B hoặc 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 các hệ đếm khác nhau. Một cụm 4 bit sẽ tạo thành 1 nibble, một
cụm 8 bit tạo thành 1 byte, một cụm 16 bit tạo thành 1 word (một từ), một cụm 32 bit tạo
thành 1 double word (từ kép). Chữ số dầ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 (bit 0) trong dãy
gọi là à bit có ý nghĩa bé nhất (Least significant bit – LSB). Ứng với thứ tự đếm 1, 2, 3 …
ở hệ 10 thì ở hệ hai ta có 1, 10, 11, …
nibble
Byte
Word
Double Word
Hình 1.1. Các đơn vị đo độ dài của số hệ hai dẫn xuất từ bit
Hệ đếm thập lục phân
3
15 0
3 0
7 0
31 0
GV. Vương Quốc Dũng
Nếu ta dùng số 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 8 bit viết như sau:

255 = 11111111b
Trong thực tế để viết kết quả 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. Hệ 16 dùng tất cả 4 bit để biểu diễn các giá trị cho
một chữ số, một chữ số có giá trị từ 0..15. Để làm được điều này người ta sử dụng các chữ
số có sẵn ở hệ 10 (0..9) để biểu diễn các giá trị số tương ứng 0..9, còn các số 10..15, dùng
thêm các chữ cái A..F hoặc a..f để biểu diễn các giá trị còn lại. Để phân biệt với các số hệ
khác, ta kèm theo chữ H hoặc h ở cuối.
Ví dụ: 255 = 11111111b = FFh
79 = 01001111b = 4Fh
Chuyển đổi giữa các hệ đếm
Ta gọi a là giá trị cơ số của hệ đếm (a = 2, 8, 10 hoặc 16), n là số chữ số biểu diễn giá trị
cho một số P, trong đó có k chữ số phần nguyên, chỉ số vị trí của các chữ số phần nguyên
trong P là 0..k-1 tính từ dấu phảy thập phân sang trái, chỉ số vị trí các chữ số phần thập
phân trong P là -1 ..-n+k, m
i
là giá trị của chữ số có chỉ số vị trí i trong P (0 < m
i
< a, i =
-n+k..k-1).
Ta có công thức chuyển đổi giữa các số hệ đếm cơ số a về số P hệ 10 như sau:
P = a
k-1
x m
k-1
+ a
k-2
x m
k-2
+ … + a
1

x m
1
+ m
0
+ a
-1
x m
-1
+ … + a
-n+k
x m
-n+k
(1)
Đổi số hệ 2 sang hệ 10
Muốn đổi một số từ hệ 2 sang số hệ 10 tương ứng, ta áp dụng công thức (1) ở trên với
cơ số a = 2, có nghĩa là ta chỉ cần tính các giá trị 2
i
tương ứng với các chữ số khác 0 thứ i
của số hệ 2 rồi cộng chúng lại.
Ví dụ: 10111.11b = 2
4
+ 2
2
+ 2
1
+ 1 + 2
-1
+ 2
-2
= 25.75

Đổi số hệ 16 sang hệ 10
Tương tự như số hệ 2 sang hệ 10. Ta xét ví dụ sau:
1AF7h = 1 * 16
3
+ 10 x 16
2
+ 15 * 16
1
+ 7 = 6903
Ta lưu ý các chữ số là chữ cái trong số hệ 16 có các giá trị tương ứng như sau:
A 10
B 11
C 12
D 13
E 14
F 15
Đổi số hệ 10 về hệ 2
4
GV. Vương Quốc Dũng
Cách 1: Lấy số hệ mười cần đổi trừ đi 2
x
(với x là giá trị lớn nhất của số mũ chọn sao
cho 2
x
nhỏ hơn hoặc bằng số hệ mười cần đổi), ghi lại giá trị 1 cho chữ số hệ 2 ứng với 2
x
.
tiép tục làm như vậy đối với hiệu số vừa tạo ra và các chữ sô 2
i
bậc thấp hơn cho tới khi

đạt tới 2
0
và ghi lại các giá trị 0 hoặc 1 cho chữ số hệ hai thứ i tùy theo quan hệ giữa số dư
và lũy thức tương ứng.
= 1 khi số dư ≥ 2
i

= 0 khi số dư ≤ 2
i
Ví dụ đổi 34 sang số hệ 2:
- Các giá trị 2
i
cần tính đến (2
5
= 32 là giá trị 2
x
sát dưới nhất so với 34):
2
5
2
4
2
3
2
2
2
1
2
0


- Các chữ số hệ hai tính được:
1 0 0 0 1 0
Như vậy 34 = 100010b
Cách 2: 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 vừa nhận được chia cho 2 và ghi nhớ phần dư. Cứ như vậy cho đến khi thương bằng
0. Đảo ngược thứ tự dãy các số dư, ta sẽ được các chữ số của số hệ hai cần tìm.
Ví dụ đổi số 34 sang số hệ hai ta thực hiện như sau:
Các số dư trong khung sẽ được sắp xếp theo chiều mũi tên. Ta có kết quả là 100010b.
Trong trường hợp số hệ mười có thêm phần lẻ sau dấu thập phân cần đổi sang số hệ hai
thì ta phải thực hiện đổi riêng rẽ từng phần rối sau đó ghép kết quả lại.
Riêng với phần lẻ sau dấu phảy thập phân ta làm như sau:
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ẻ thập phân,
ghi nhớ phần nguyên, lấy phần lẻ thập phân của tích vừa thu được nhân với 2. Cứ tiếp tục
như vậy cho đến khi tích được chẵn bằng 1 (không còn phần lẻ thập phân). Lấy các phần
nguyên đã lưu, sắp xếp lại ta được các chữ số sau dấu phảy nhị nhân (phần lẻ nhị phân) cần
tìm.
5
2
2
2
2
2
34
0
2
17
1 8
0 4
0
2

0 1
1
GV. Vương Quốc Dũng
Ví dụ đổi 0.125 ra số hệ hai
0.125 x 2 = 0 .250
0.250 x 2 = 0 .500
0.500 x2 = 1 .000
Kết quả ta thu được số nhị phân: 0.001b (như thứ tự phần được đóng khung)
Kết hợp 2 ví dụ ta có ví dụ đổi số 34.125 ra số nhị phân, kết quả là 100010.001b
Đổi số hệ 10 về hệ 16
Thực hiện tương tự như đổi số hệ 10 về số hệ 2, ta thực hiện chia kết quả phần thương
liên tiếp cho 16, lấy giá trị phần dư sắp xếp theo thứ tự ngược lại…
Tóm lại: để việc chuyển đổi thực hiện nhanh chóng, tránh thực hiện quá nhiều phép
chia, để đổi một số hệ mười ra số hệ hai, ta thực hiện thao thứ tự:
Số hệ mười ---> số hệ mười sáu ---> số hệ hai ---> số hệ tám
Vì việc thực hiện đổi số hệ mười sáu về số hệ hai rất đơn giản, chỉ việc đổi từng chữ số
hệ 16 ra hệ 2 rồi ghép chúng lại theo thứ tự. Từ số hệ 2 về số hệ 8 ta lấy từng cụm 3 bit
một bắt đầu từ LSB để đổi ra các số từ 0 ÷ 7 sau đó ghép đúng theo thứ tự.
Ví dụ: đổi số 125 ra hệ 16, ta lấy 125 chia 16 được 7 dư 13 = C, nhớ C. Lấy 7 chia 16
được 0, dư 7. Kết quả ta được 7Ch
Trong đó: Ch = 1101b
7h = 0111b
Ghép lại ta được số nhị phân: 01111101b = 175 (8)
1.1.2.3. Các phép toán số học với số hệ hai
Phép cộng
Phép cộng các số hệ hai giống như khi ta thực hiện với số hệ mười. Quy tắc phép cộng
số hệ 2 được chỉ ra trong bảng 1.1.
Bảng 1.1. y = a + b
A b y Nhớ
0 0 0 0

0 1 1 0
1 0 1 0
1 1 0 1
6
GV. Vương Quốc Dũng
Bảng 1.2. Mở rộng bảng 1.1, y = a + b + c + d + e + f + g
a b c d e f g y Nhớ
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0
0 0 0 0 0 1 0 1 0
0 0 0 0 0 1 1 0 1

0 0 0 1 1 1 1 0 2
0 0 1 1 1 1 1 1 2
1 0 1 1 1 1 1 0 3
1 1 1 1 1 1 1 1 3
Nhận xét: theo bảng 1.2 ta thấy kết quả tổng chia cho 2 (cơ số hệ đếm nhị phân) là giá
trị cần nhớ, còn phần dư chính là y. Như vậy cách thực hiện không khác gì với số hệ mười,
ví dụ ta cộng nhiều số thập phân được giá trị là 49, ta lấy 49 chia cho 10 (cơ số hệ đếm
thập phân), được 4 dư 9, viết 9 và nhớ 4. Giá trị nhớ sẽ được dùng để cộng với cột bit ở vị
trí tiếp theo.
Bảng 1.1 chính là cách mà các bộ cộng trong các khối tính toán số học của máy tính
thực hiện.
Phép trừ
Phép trừ các số hệ 2 giống như làm với số hệ 10. Bảng 1.3 là qui tắc thực hiện phép trừ
số nhị phân.
Bảng 1.3. Qui tắc trừ số nhị phân y = a - b
a b y Mượn
0 0 0 0
0 1 1 1

1 0 1 0
1 1 0 0
Số bù 2
Trong thực tế, việc thực hiện phép trừ chính là cộng số bị trừ với số đảo dấu của số trừ,
điều này cũng được ứng dụng trong các khối tính toán số học của máy tính để tận dụng các
bộ cộng đã có sẵn. Vậy số đảo dấu của số trừ chính là một số âm. Khi thực hiện phép trừ
trong máy tính cũng tất yếu sẽ có kết quả là một số âm. Vấn đề đặt ra đối với số hệ hai là ta
phải biểu diễn số âm nhị phân như thế nào sao cho thích hợp để đáp ứng được việc sử
7
GV. Vương Quốc Dũng
dụng các bộ cộng trong máy tính. Việc sử dụng số bù 2 chính là cách biểu diễn số có dấu
trong máy tính ngày nay.
Vậy số bù 2 của số A chính là số đảo dấu của số A đó. Ví dụ số bù 2 của 5 là -5 và
ngược lại, số bù 2 của –5 là 5.
Sau đây là phương pháp xây dựng số bù 2:
- Trước hết ta xây dựng số bù 1 của A. Số bù một của A chính là số nhận được khi ta
đảo tất cả các bit của số A.
Ví dụ 5 = 00000101b, số bù 1 của 5 là 11111010b
- Số bù 2 của A = số bù 1 của A + 1
Ví dụ: số bù 2 của 5 = số bù 1 của 5 + 1 = 11111010b + 1 = 11111011b = -5
Bảng 1.4. Biểu diễn các số theo số hệ 2, số hệ hai có dấu và số bù 2
Số hệ hai 8 bit Số hệ mười tương
đương
Số hệ mười tính
theo số bù 2
0000 0000 0 0
0000 0001 1 +1
0000 0010 2 +2
… … …
0111 1101 125 +125

0111 1110 126 +126
0111 1111 127 +127
1000 0000 128 -128
1000 0001 129 -127
1000 0010 130 -126
… … …
1111 1101 253 -3
1111 1110 254 -2
1111 1111 255 -1
Phép nhân
Phép nhân số hệ hai thực hiện giống như ta làm với số hệ mười. Chỉ cần chú ý khi cộng
kết quả tuân thủ theo bảng 1.2. qui tắc cộng mở rộng.
Qui tắc thực hiện phép nhân hệ 2 được chỉ ra trong bảng 1.5 .
Bảng 1.5. Qui tắc thực hiện phép nhân y = a x b
a b y
0 0 0
0 1 0
8
GV. Vương Quốc Dũng
1 0 0
1 1 1
Trên cơ sở quy tắc vừa nêu và để đơn giản ta thực hiện ví dụ một phép nhân 2 số hệ 2
với độ dài 4 bit để làm sáng tỏ thuật toán nhân thực hiện trong máy tính.
1001 Số bị nhân = 9

x
0110 Số nhân = 6
0000 Thành phần 1 của tổng tích lũy
1001 Thành phần 2 của tổng tích lũy
1001 Thành phần 3 của tổng tích lũy

0000 Thành phần 4 của tổng tích lũy
0110110 Tổng tích lũy bằng 54
Độ dài cực đại của kết quả trong trường hợp này là 8 bit. Nếu ta nhân các số 8 bit (hoặc
16) bit thì độ dài cực đại của kết quả là 16 bit (hoặc 32 bit). Mỗi lần nhân một 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 cị trí các bit khác 0, ta tạo ra 1 thành phần của tổng tích lũy. 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 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
như sau:
- Thành phần đầu tiên của tổng tích lũy thu được là tích của LSB trong số nhân với số
bị nhân. Nếu LSB = 0 thì thành phần này bằng 0, Nếu LSB = 1 thì thành phần này =
chính số bị nhân.
- Mỗi thành phần thứ i tiếp theo của tổng tích lũy sẽ tính được bằng cách tương tự,
nhưng phải dịch trái đi i bit (có thể bỏ qua các thành phần = 0)
- Tổng của các thành phần là tích cần tìm.
Để minh họa thuật toán trên, ta dùng luôn nó để rút gọn ví dụ đã làm ở trên:
1001 Số bị nhân = 9

x
0110 Số nhân = 6
1001 Số bị nhân dịch trái 1 lần
1001 Số bị nhân dịch trái 2 lần
0110110 Tổng tích lũy bằng 54
Trong máy tính, phép nhân được thực hiện bởi bộ cộng và bộ dịch trái theo như thuật
toán cộng và dịch vừa trình bày.
Phép chia
Phép chia là phép tính ngược của phép nhân. Từ đó suy ra phép chia có thể thực hiện
bằng các phép trừ và phép dịch liên tiếp cho tới khi không thể trừ được nữa (do không còn
gì để trừ hoặc số bị trừ nhỏ hơn số chia). Sau đây là thuật toán thực hiện phép chia thông
qua ví dụ cụ thể:

9
GV. Vương Quốc Dũng
Ví dụ: 35/7 = 7
Ta hãy quan sát kỹ các bước phải thực hiện khi thực hiện phép chia bằng tay
100011 101
000 0111
1000
101
0111
101
0101
101
000
Trong các phép tính ở trên ta liên tục cần phải dự đoán và kiểm tra để tìm ra kết quả
đúng. Công việc này rất khó khăn 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).
Trong máy tính:
- Nếu số chia là 1 byte, thì số bị chia phải là 2 byte, do vậy khi số bị chia là 1 byte ta
phải mở rộng bit dấu cho số bị chia lên 8 bit cao.
- Nếu số chia là 2 byte, thì số bị chia phải là 4 byte, do vậy số bị chia là 1 word ta phải
mở rộng bit dấu cho số bị chia lên 16 bit cao.
Sau đây là một thuật toán khắc phục nhược điểm trên nêu trên:
1. Kiểm tra số bị chia, mở rộng bit dấu nếu cần
2. Đổi số chia ra số bù 2 của nó (để bước tiếp theo làm phép cộng với số bị chia thay cho
phép trừ). K = số bù 2 của số chia dịch trái đi 8 bit (nếu số chia là số 8 bit) hoặc 16 bit
nếu số chia là số 16 bit. Q = số bị chia
3. H = Q + K.
- Nếu H có MSB = 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. Q = H
- Nếu kết quả này có MSB = 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.
4. Số K = số K dịch phải đi 1 bit, và làm lại bước 3 cho đến khi nhận được H = 0 (chia
hết) hoặc H số chia (chia còn dư).
5. Kết quả của thương số là các bit 0, 1 ghép theo trình tự các bit tương ứng của
thương.
Ví dụ: 103/6 = 17 dư 1. Thực hiện phép chia này ở hệ 2 theo thuật trên.
Ta có: Số chia = 00000110b
Số bù 2 của số chia = 11111010b
Số bị chia = 01100111b = 0000000001100111b (mở rộng bit dấu)
10
GV. Vương Quốc Dũng
Thuật toán chia số nhị phân số 103/6:
Tên toán hạng, thao tác Giá trị Thương
Q = Số bị chia 0000000001100111
K = Số bù 2 của số chia << 8 bit 1111101000000000
H = Q + K 1111101001100111 0
Q 0000000001100111
K = K >> 1 bit (giữ nguyên bit dấu) 1111110100000000
H = Q + K 1111110111100111 0
Q 0000000001100111
K = K >> 1 bit (giữ nguyên bit dấu) 1111111010000000
H = Q + K 1111111011100111 0
Q 0000000001100111
K = K >> 1 bit (giữ nguyên bit dấu) 1111111101000000
H = Q + K 1111111110100111 0
Q 0000000001100111
K = K >> 1 bit (giữ nguyên bit dấu) 1111111110100000
H = Q + K > 6 0000000000000111 1
Q = H 0000000000000111
K = K >> 1 bit (giữ nguyên bit dấu) 1111111111010000

H = Q + K 1111111111010111 0
Q 0000000000000111
K = K >> 1 bit (giữ nguyên bit dấu) 1111111111101000
H = Q + K 1111111111101011 0
Q 0000000000000111
K = K >> 1 bit (giữ nguyên bit dấu) 1111111111110100
H = Q + K 1111111111111011 0
Q 0000000000000111
K = K >> 1 bit (giữ nguyên bit dấu) 1111111111111010
H = Q + K < 6 0000000000000001 1
Vậy ta có kết quả = 10001b = 17, số dư H = 1
1.1.2.4. Biểu diễn số trong máy tính
11
GV. Vương Quốc Dũng
Biểu diễn số nguyên
Phần cứng của máy tính cần giới hạn độ lớn của một số để có thể lưu nó trong các thanh
ghi hay các ô nhớ. Do vậy các số nguyên được chia thành các số 8 bit, 16 bit, 32 bit, 64…
tương ứng chúng có MSB là bit 7, 15, 31, 63 và MSB đều là bit 0.
Số nguyên không dấu
Số nguyên không dấu (unsigned integer) biểu diễn các số nguyên dương. Số nguyên
không dấu rất thích hợp để biểu diễn các đại lượng luôn dương, chẳng hạn địa chỉ của ô
nhớ, bộ đếm hay, mã ASCII của ký tự (chúng ta sẽ thấy sau này). Bởi vì các số nguyên
không dấu được định nghĩa là các số nguyên dương, nên không cần dùng bit nào để biểu
diễn bit dấu, do đó 8 bit của một byte hay 16 bit của một word đều được dùng để biểu diễn
giá trị.
- Số nguyên không dấu lớn nhất có thể chứa trong một byte là:
11111111b = FFh = 255.
- Số nguyên không dấu lớn nhất có thể chứa trong một word là: 1111111111111111b
= FFFFh = 65535.
Chú ý rằng LSB = 1 thì số nguyên là số lẻ và ngược lại nó là số chẵn

Số nguyên có dấu
Số nguyên có dấu (signed integer) có thể là số dương hoặc âm. MSB được dùng để biểu
diễn dấu của số, MSB = 1 cho biết đó là số âm, MSB = 0 cho biết đó là số dương. Các số
nguyên có dấu được lưu trữ trong máy tính dưới dạng số bù 2.
Một ưu điểm của việc biểu diễn số âm trong máy tính bằng số bù 2 là phép trừ có thể
thực hiện bằng phương pháp lấy bù và phép cộng, các vi mạch thực hiện phép cộng và bù
các bit được con người thiết kế tương đối dễ dàng.
Biểu diễn số thực
Trong máy tính các số thực được biểu diễn và được viết dưới dạng dấu phảy
động (dạng có phần số mũ). Còn trong thực tế con người biểu diễn số thực ở 2
dạng:
- Dạng bình thường: 3.14, 3.0, -24.1234567, - 0.0002
Việc dùng dấu chấm trong cách viết số thực là cách viết của các nước Anh,
Mỹ.
- Dạng viết có phần mũ.
Để hiện thị được ra màn hình một số thực dạng bình thường hay dạng viết dấu
phảy động, phải thông qua giả lập bằng phần mềm.
Các dạng số dấu chấm động:
Đổi phần thập phân thành dạng nhị phân
Giả sử có phần thập phân là 0,d1d2d3…dn. Có dạng biểu diễn nhị phân là
0,b1b2b3…bm.
Bit b1 tương ứng với phần nguyên của tích: 0,d1d2d3…dn*2
Sau đây là thuật toán để đổi phần thập phân ra dạng nhị phân m chữ sô
X chứa phần thập phân cần đổi
12
GV. Vương Quốc Dũng
FOR i = 1 to m DO
Begin
Y = X * 2
X = phần thập phân của Y

Bi = Phần nguyên của Y
End;
Các số dấu chấm (phảy) động
Dạng biểu diễn dấu phảy động, mỗi số được biểu diễn bằng 2 phần:
- Phần định trị (mantissa) chứa các bit của số
- Phần mũ (exponent) dùng để điều chỉnh lại vị trí của dấu phảy nhị phân
trong số đó.
Ví dụ : số thập phân 2,5 biểu diễn dạng nhị phân là 1,01b
Phần biểu diến dấu phảy động của nó có phần định trị là 1,01
Phần mũ là 1
Vì 10,1b có thể viết là 1,01b*2
1

Đối với các số khác 0, phần định trị được lưu như là một trị số <1 và < 2. Phần
định trị như vậy được gọi là phần định trị đã được chuẩn hóa
Đối với các số < 1, nếu chúng ta chuẩn hóa phần định trị thì phần mũ của chúng sẽ âm.
chẳng hạn số 0,0001b có dạng biểu diễn dấu phảy động
là 1*2
-4
. Vì phần mũ âm không được biểu diễn như số có dấu, nên với tất cả các số phần
mũ sẽ được tính lại thông qua các số có tên gọi là bias. bias sẽ được cộng thêm vào để tạo
ra phần mũ là một số dương. Ví dụ nếu ta chọn 8 bits cho phần mũ thì số 2
7
-1 = 127 sẽ
được chọn làm bias
Short real – dùng 4 byte để lưu trữ, 1 bit dấu, 8 bit phần mũ, 23 bit phần định trị. Không
chứa phần nguyên của phần định trị. Bias = 127.
Long real – dùng 8 byte để lưu trữ, 1 bit dấu, 11 bit phần mũ, 52 bit phần định trị.
Không chứa phần nguyên của phần định trị. Bias = 1023.
Temporary real – dùng 10 byte để lưu trữ, 1 bit dấu, 15 bit phần mũ, 64 bit phần định

trị. Gồm cả phần nguyên của phần định trị. Bias = 16383.
Ta xem cụ thể một loại số chấm động kiểu short real sau để thấy rõ.
Số dấu chấm (phảy) động kiểu short real
. Để biểu diễn số 0,0001b chúng ta có phần định trị là 1 và phần mũ là -4, Sau
khi cộng thêm 127, chúng ta nhận được phần mũ là 123 = 011111101b
Hình sau mô tả sắp xếp của một dấu phảy động 32 bits, trong đó S là một bit
dấu, exponent (phần mũ) chiếm 8 bits, mantissa (phần định trị) chiếm 23 bits
31 30 23 22 0
S Exponent Mantissa
Hình 1.1. Biểu diễn số dấu chấm (phảy) động 32 bit trong máy tính
13
GV. Vương Quốc Dũng
Ví dụ biểu diễn số 4,9 ở dạng dấu phảy động 32 bit (short real):
Áp dụng cách biểu diễn số dấu chấm động ở hình 1.1, chúng ta có:
4.9 = 100.1110011001100…
Sau khi chuẩn hóa ta có phần định trị là: 1.00111001100110011001100 và phần mũ
là 2. Cộng thêm bias vào phần mũ, ta nhận được 129 = 10000001b. Do phần nguyên trong
phần định trị không được lưu nên ta được số biểu diễn trên máy cho giá trị 4.9 là:
0 10000001 00111001100110011001100 hay bằng 409CCCCCh
Ví dụ biểu diễn số -0.75 ở dạng dấu phảy động 32 bit (short real):
Chúng ta có biểu diễn nhị phân của 0.75 = 0.11b, do đó –0.75 = -0.11b
Phần định trị sẽ được chuẩn hóa bằng 1.1
Phần mũ là -1, cộng với bias = 127, ta được phần mũ là 126 = 01111110b
Phần nguyên không được lưu nên ta có dạng short real của -0.75 là
1 01111110 10000000000000000000000 hay bằng BF400000h
Biểu diễn ký tự
Không phải mọi số liệu mà máy tính xử lý dều là các con sô. các thiết bị ngoại vi như
màn hình hay máy in đều so xu hướng làm việc với các ký tự. Ngoài ra các chương trình
như chương trình xử lý văn bản chuyên làm việc với dữ liệu kiểu ký tự. Cũng như tất cả
các dữ liệu khác, các ký tự cũng cần phải được mã hóa thành dạng nhị phân để máy tính có

thể xử lý chúng. Một kiểu mã hóa thông dụng nhất cho các ký tự đó là mã ASCII
(American Standard Code For Infermation Interchange – Mã chuẩn của Mỹ dùng để trao
đổi thông tin). Trước đây mã ASCII được sử dụng trong thông tin với các thiết bị teletype,
ngày nay mã ASCII được sử dụng trên tất cả các máy tính cá nhân.
Mã một byte
Hệ thống mã ASCII sử dụng 7 bit để mã hóa cho một ký tự, đo đó có tổng cộng 2
7
=
128 mã ASCII. Bảng 1.6 trình bày các mã ASCII và các ký tự tương ứng với chúng.
Chú ý rằng chỉ có 95 ký tự ứng với 95 mã ASCII từ 32 ÷ 126 là có khả năng hiển thị (in
được), các mã từ 0 ÷ 31 và mã 127 được dùng đến với các mục đích điều khiển quá trình
truyền thông, do đó không có khả năng in được. Hầu hết các máy vi tính chỉ sử dụng các
ký tự in được và một số ký tự điều khiển như CR (về đầu dòng), LF (xuống dòng), HT
(Tab), BS (xóa lùi), BEL (Đưa tiếng bip ra loa).
14
GV. Vương Quốc Dũng
Bảng 2.6. Bảng mã ASCII với 128 ký tự đầu.
Hexa-
decimal
0 1 2 3 4 5 6 7
0
<NUL>
0
<DLE>
16 32
0
48
@
64
P

80
`
96
p
112
1
1
<DC1>
17
!
33
1
49
A
65
Q
81
a
97
q
113
2
2
<DC2>
18

34
2
50
B

66
R
82
b
98
r
114
3

3
<DC3>
19
#
35
3
51
C
67
S
83
c
99
s
115
4

4
<DC4>
20
$

36
4
52
D
68
T
84
d
100
t
116
5

5
21
%
37
5
53
E
69
U
85
e
101
u
117
6

6

<SYN>
22
&
38
6
54
F
70
V
86
f
102
v
118
7
<BEL>
7
23

39
7
55
G
71
W
87
g
103
w
119

8
<BS>
8
<CAN>
24
(
40
8
56
H
72
X
88
h
104
x
120
9
<HT>
9
<EM>
25
)
41
9
57
I
73
Y
89

i
105
y
121
A
<LF>
10
26
*
42
:
58
J
74
Z
90
j
106
z
122
B
<VT>
11
<ESC>
27
+
43
;
59
K

75
[
91
k
107
{
123
15
GV. Vng Quc Dng
C
<FF>
12
<FS>
28
,
44
<
60
L
76
\
92
l
108
|
124
D
<CR>
13
29

-
45
=
61
M
77
]
93
Mm
109
}
125
E
<SO>
14
30
.
46
>
62
N
78
^
94
n
110
~
126
F
<SI>

15
31
/
47
?
63
O
79
_
95
o
111
<DEL>
127
Bng 2.7. Bng mó ASCII vi 128 ký t na sau.
Hexa-
decimal
8 9 A B C D E F
0

128

144

160 176 192 208

224

112
1


129

145

161 177 193 209

225

241
2

130

146
ú
162 178 194 210

226

242
3
õ
131

147

163 179 195 211

227


243
4

132

148

164 180 196 212

228

244
5

133
ũ
149

165 181 197 213

229

245
6

134

150
ê

166 182 198 214
à
230

246
7

135

151

167 183 199 215

231

247
8

136

152

168 184 200 216

232

248
9

137


153 169 185 201 217

233

249
A

138
ĩ
154
ơ
170
186 202 218

234

250
16
GV. Vương Quốc Dũng
B
ï
139
¢
155
½
171 187 203 219
δ
235


251
C
î
140
£
156
¼
172 188 204 220

236

252
D
ì
141
¥
157
i
173 189 205 221
φ
237
²
253
E
Ä
142 158
«
174 190 206 222

238


254
F
Ă
143
ƒ
159
»
175 191 207 223

239
255
Vì mỗi ký tự ASCII được mã hóa bằng 7 bit nên mã của một ký tự chứa vừa vặn trong
một byte với MSB = 0. Các ký tự in được có thể hiển thị ra màn hình hoặc ra máy in, trong
khi đó các ký tự điều khiển lại dùng để điều khiển các thiết bị này. Ví dụ để hiển thị ký tự
A trên màn hình, chương trình sẽ gửi mã ASCII 41h đến màn hình, còn để lùi con trỏ trở
lại đầu dòng, chương trình sẽ gửi mã ASCII có giá trị 13 (0Dh – mã ASCII của ký tự điều
khiển CR) đến màn hình.
Ngoài ra máy tính cũng hiển thị một số ký tự đặc biệt ứng với một số mã ASCII không
in được. Như ta sẽ thấy bộ điều khiển màn hình của IBM PC có thể hiển thị một bộ ký tự
mở rộng 256 ký tự (bảng 2.7)
1.1.2.5. Mã hai byte
Unicode là viết tắt của từ Universal Code, tức là bộ mã vạn năng, có thể dùng để mã hoá
tất cả các ngôn ngữ chính trên toàn thế giới (trong đó có tiếng Việt), được dùng chủ yếu
trong trao đổi hiển thị dữ liệu trong các hệ thống công nghệ thông tin. Unicode còn là cộng
động của một số công ty hàng đầu trong lĩnh vực công nghệ thông tin như Microsoft, IBM,
Sun... được thành lập từ năm 1991 nhằm tạo ra một bộ mã dùng chung cho toàn thế giới.
Song song với tổ chức Unicode còn có tổ chức ISO (Tổ chức chuẩn quốc tế chính thống)
cũng nghiên cứu một bộ mã đa ngữ dùng trong CNTT là ISO /IEC 10646. Unicode và ISO
từ năm 1993 đã thống nhất cùng nhau phát triển và đồng nhất 2 bộ mã ở miền 16-Bit.

Unicode là bộ mã 16-Bit (có 65.536 ô mã)
Các định dạng biến đổi tập kí tự Unicode (UTF-Unicode Transformation Format) thực
hiện biến đổi mỗi giá trị Unicode thành một dãy giá trị mã duy nhất. Một UTF có thể xác
định một thứ tự byte cho việc tuần tự hoá các giá trị mã trong byte. UTF cũng có thể xác
định việc dùng dấu thứ tự byte. Unicode định nghĩa ra các định dạng biến đổi tập kí tự là
UTF-8, UTF-16, UTF-16LE, UTF-16BE, UTF-32.
Dạng mã hoá mặc định của chuẩn Unicode là 16-bit: các kí tự được gán một giá trị 16-
bit duy nhất, ngoại trừ các kí tự được mã hoá bằng các thay thế bao gồm một cặp hai giá trị
17
GV. Vương Quốc Dũng
16-bit. Dạng mã hoá 16-bit này chính là định dạng UTF-16. Trong UTF-16, các kí tự cho
tới 65 535 được mã hoá thành các giá trị 16-bit; các kí tự trên 65535 được mã hoá thành
các cặp giá trị 16-bit (thay thế).
1.1.3. Sơ đồ khối cấu trúc của IBM-PC.
Gồm 5 thành phần cơ bản:
Bộ xử lý (Processor).
Hệ thống nhớ (Memory).
Hệ thống vào ra (I/O System).
Bus liên kết hệ thống.
Chương trình.
Sơ đồ khối chung:
Máy tính có 1 bộ xử lý trung tâm (CPU) thì máy tính đó gọi là máy tính tuần
tự, hay còn gọi là máy tính Ven Newmann.
Máy tính có nhiều bộ xử lý gọi là máy tính song song.
Đơn vị xử lý trung tâm:
Chức năng: - Điều khiển hoạt động của hệ thống.
- Xử lý dữ liệu.
Nguyên tắc hoạt động:
Hoạt động theo chương trình nằm trong bộ nhớ, nhận lần lượt từng lệnh từ bộ nhớ,
giải mã để phát tín hiệu điều khiển thực hiện lệnh. Trong quá trình thực hiện

chương trình, nó trao đổi dữ liệu với bộ nhớ và các thiết bị vào ra.
Các thành phần cơ bản:
18
CPU
Bộ nhớ chính
Bus liên kết hệ thống
Hệ thống vào ra
(Bàn phím , màn hình, ổ đĩa, chuột, ...
và các mạch ghép nối)
GV. Vương Quốc Dũng
Đơn vị điều khiển (Control Unit): điều khiển hoạt động của CPU và các thành
phần khác của máy tính.
Đơn vị số học và logic (Arithmetic & Logic Unit - ALU): thực hiện các chức năng
xử lý dữ liệu.
Các thanh ghi: Là các ngăn nhớ đặc biệt nằm trong CPU để chứa các thông tin tạm
thời phục vụ cho quá trình thực hiện chương trình.
Bus bên trong: Dùng để kết nối và trao đổi thông tin giữa các thành phần với nhau.
Hệ thống nhớ:
Chức năng: Dùng để nhớ chương trình và dữ liệu.
Chương trình là những lệnh yêu cầu máy tính phải thực hiện.
Dữ liệu là những gì mà chương trình tác động vào.
Các thành phần cơ bản:
Bộ nhớ chính: (Main Memory): Là thành phần nhớ được nối trực tiếp với CPU và
được điều khiển bởi CPU. Các chương trình đang thực hiện phải nằm trong bộ nhớ
chính.
. Bộ nhớ chính gồm các ngăn nhớ và mỗi ngăn nhớ có 1 địa chỉ xác định,
các ngăn nhớ được tổ chức theo Byte.
. Bộ nhớ chính có tốc độ cao, dung lượng nhỏ. Gồm:
ROM (Read Only Memory): Chứa thông tin cố định trong hệ thống.
RAM (Random Access Memory): Bộ nhớ tạm thời.

Bộ nhớ ngoài: Để lưu trữ các tài nguyên phần mềm của máy tính.
Về mặt tổ chức: được tổ chức như 1 thiết bị vào ra.
Bộ nhớ Cache: Bộ nhớ đệm truy nhập nhanh. Được đặt xen giữa bộ nhớ chính và
CPU để tăng tốc độ trao thông tin giữa CPU và hệ thống nhớ.
Hệ thống vào ra:
Chức năng:
Dùng để trao đổi thông tin giưa máy tính với thế giới bên ngoài.
Các thành phần:
Các thiết bị ngoại vi (các thiết bị vào ra): làm nhiệm vụ chuyển đổi thông tin ở
dạng vật lý nào đó về dạng dữ liệu phù hợp với máy tính.
Các mạch ghép nối vào ra: Các thiết bị ngoại vi không được nối ghép trực tiếp với
CPU mà phải thông qua các mạch ghép nối vào ra. Trong các mạch ghép nối vào
ra có các cổng vào ra và được đánh địa chỉ xác định. Các thiết bị vào ra được ghép
nối thông qua cổng.
Bus liên kết hệ thống:
* Định nghĩa Bus:
Là tập hợp các đường dây để vận chuyển thông tin (các Bit) từ phần mạch này đến
các phần mạch khác trong phạm vi máy tính.
Bit là từ viết tắt của ‘BInary digiT’.
Bản chất vật lý: Không có điện áp  truyền 0
Có điện áp  truyền 1
19
1 Bit (tại 1 thời điểm)
GV. Vương Quốc Dũng
Tập các đường dây vận chuyển thông tin đồng thời được gọi là độ rộng của
Bus (Ví dụ: 8 đường dây thì độ rộng là 8 Bit)
* Chức năng của Bus:
Bus chia thành 3 loại: - Bus địa chỉ.
- Bus dữ liệu.
- Bus điều khiển

Chỉ có Bus địa chỉ và Bus dữ liệu mới có khái niệm độ rộng.



Lý do tồn tại của các loại Bus:
- Bus địa chỉ:
. CPU muốn trao đổi dữ liệu với ngăn nhớ nào, với cổng vào ra nào thì cần
phải có Bus địa chỉ.
. Bus địa chỉ vận chuyển địa chỉ từ CPU đến bộ nhớ hay cổng vào ra để xác
định ngăn nhớ nào hay cổng vào ra nào cần trao đổi thông tin.
. Bus địa chỉ nói tổng quát gồm n đường dây A
0
÷ A
n-1
thì gọi độ rộng Bus
là n Bit và n Bit này được dùng để đánh địa chỉ, do đó có khả năng quản lý tối đa
2
n
địa chỉ ngăn nhớ hay 2
n
Byte nhớ (vì bộ nhớ chính quản lý theo Byte).
Ví dụ:
8088/8086: Bộ vi xử lý có n = 20  quản lý tối đa 2
20
Byte = 1MB
80286:n = 24  quản lý tối đa 2
24
Byte = 2
4
x 2

20
= 16 MB.
80386:n = 32  quản lý tối đa 2
32
Byte = 2
2
x 2
30
= 4 GB.
Pentum II:n = 36  quản lý tối đa 2
36
Byte = 2
6
x 2
30
= 64 GB.
- Bus dữ liệu:
. Vận chuyển dữ liệu từ bộ nhớ đến CPU.
. Vận chuyển dữ liệu giữa các thành phần với nhau.
. Bus dữ liệu ký hiệu D
0
÷ D
m-1
thì độ rộng Bus là m Bit.
m thường là các giá trị: 8, 16, 32, 64.
Ví dụ:
20
Bus dữ liệu
Bus điều khiển
Bus địa chỉ

CPU
Bộ
nhớ
chính
Mạch
ghép nối
vào ra
Các thiết
bị vào ra
GV. Vương Quốc Dũng
8088/86: m = 8 tức là vận chuyển 1 lúc 1 Byte.
80286: m = 16 tức là vận chuyển 1 lúc 2 Byte.
80386/486: m = 32 tức là vận chuyển 1 lúc 4 Byte.
Pentum II: m = 64 tức là vận chuyển 1 lúc 8 Byte.
- Bus điều khiển:
. Là tập hợp các tín hiệu điều khiển hoặc là phát ra từ CPU để điều khiển bộ
nhớ hay hệ thống vào ra, hoặc là từ bộ nhớ hay hệ thống vào ra đến yêu cầu CPU.
1.2. Tổ chức các thanh ghi của vi xử lý 8086.
Để làm việc được thì trong CPU cần có các thanh ghi. Thanh ghi chính là bộ nhớ
có tốc độ truy nhập cực nhanh, dùng để lưu trữ các giá trị địa chỉ và dữ liệu phục
vụ cho nhiệm vụ điều khiển và xử lý dữ liệu. Trong 8086 có:
4 thanh ghi đoạn.
3 thanh ghi con trỏ và 2 thanh ghi chỉ số
4 thanh ghi đa năng.
1 thanh ghi cờ
1.2.1. Các thanh ghi đoạn:
Khối BIU đưa ra trên Bus địa chỉ 20 Bit địa chỉ, như vậy 8086 có khả năng
phân biệt được 2
20
= 1.048.576 = 1M ô nhớ = 1 Mbyte.

Nói cách khác: Không gian địa chỉ của 8086 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 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ả trong không gian của chương trình.
Tạo ra 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ộ VXL khi gọi chương trình con hoặc trở về từ chương trình con.
Bộ vi xử lý 8086 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à:
. CS - Code Segment: Thanh ghi đoạn mã.
. DS - Data Segment: Thanh ghi đoạn dữ liệu.
. SS - Stack Segment: Thanh ghi đoạn ngăn xếp.
. ES - Extra Segment: Thanh ghi đoạn dữ liệu phụ.
Các thanh ghi đoạn sẽ xác định địa chỉ của các ô nhớ nằm ở đầu đoạn. Địa
chỉ này gọi là địa chỉ cơ sở.
1.2.2. Các thanh ghi con trỏ và chỉ số:
Trong 8086 có 3 thanh ghi con trỏ và 2 thanh ghi chỉ số 16 Bit, các thanh ghi
này được ngầm định như là thanh ghi lệch cho các đoạn tương ứng, cụ thể:
. IP - Instruction Pointer (Con trỏ lệnh): 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.
21
GV. Vương Quốc Dũng
. BP - Base Pointer (Con trỏ cơ sở): BP luôn trỏ vào 1 dữ liệu nằm trong
đoạn ngăn xếp SS. Địa chỉ đầy đủ của 1 phần tử trong đoạn ngăn xếp ứng
với: SS : BP.
. SP - Stack Pointer (Con trỏ ngăn xếp): SP luôn trỏ vào đỉnh hiện thời của
ngăn xếp SS. Địa chỉ đầy đủ của đỉnh ngăn xếp ứng với: SS : SP.
. SI - Source Index (Chỉ số gốc/nguồn): SI trỏ vào 1 dữ liệu nằm trong đoạn

dữ liệu DS. Địa chỉ đầy đủ của 1 phần tử trong đoạn DS: DS : SI
. DI - Destination Index (Chỉ số đích): DI trỏ vào 1 dữ liệu nằm trong đoạn
dữ liệu DS. Địa chỉ đầy đủ cụ thể ứng với:
ES : DI
*Địa chỉ của các ô nhớ khác nằm trong đoạn được tính bằng cách cộng thêm
vào địa chỉ cơ sở 1 giá trị gọi là địa chỉ lệch hay độ lệch (địa chỉ offset /địa
chỉ tương đối). Độ 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) - được nói rõ trong phần thanh
ghi con trỏ và chỉ số.
Cụ thể, để xác định địa chỉ vật lý 20 Bit của 1 ô nhớ cụ thể nào đó trong 1
đoạn bất kỳ, CPU 8086 phải dùng đến 2 thanh ghi 16 Bit (1 thanh ghi chứa
địa chỉ cơ sở, 1 thanh ghi chứa địa chỉ lệch). Từ nội dung của cặp thanh ghi
trên, tạo ra địa chỉ vật lý theo công thức sau:
Địa chỉ vật lý = thanh ghi đoạn *16 +thanh ghi lệch.
= segment * 16 + offset
Và địa chỉ logic được ký hiệu như sau:
Thanh ghi đoạn : thanh ghi lệch
Hay:
Segment : offset.
Địa chỉ kiểu Segment : offset là địa chỉ 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. Khi cần thiết truy nhập ô nhớ nào đó,
CPU phải đổi địa chỉ logic này ra địa chỉ vật lý để rồi đưa lên Bus địa chỉ. Việc
chuyển đổi này do 1 bộ tạo địa chỉ thực hiện (Khối ∑ trong hình vẽ)
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 phần tử thuộc chuỗi đích.
. DS:SI luôn ứng với phần tử thuộc chuỗi gốc (nguồn).
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 1 thời điểm nào đó ta có: CS = F000h và IP = FFF0h thì:
địa chỉ logic CS : IP , tương ứng ta có địa chỉ vật lý:

F000h*16 + FFF0h = F0000h + FFF0h = FFFF0h.
Chú ý: Một ô nhớ có duy nhất một địa chỉ vật lý, nhưng ta có thể dùng nhiều địa
chỉ logic khác nhau để định vị cùng một ô nhớ.
Ví dụ: Hai địa chỉ logic FFF0:00F0
22
GV. Vương Quốc Dũng
FF00:0FF0
cùng xác định ô nhớ có địa chỉ vật lý là FFFF0h.
1.2.3. 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 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à 8 Bit thấp để làm việc độc lập. Đó là các cặp thanh
ghi AH & AL, BH & BL, CH & CL, DH & DL.
(trong đó H - chỉ phần cao ; L chỉ phần thấp).
. AX (Accumulater, Acc - thanh chứa): Các kết quả của thao tác được chứa
ở đây (Kết quả của phép *, / ,...).
. BX (Base - thanh ghi cơ sở): Thường chứa địa chỉ cơ sở của 1 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 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 vào các thao tác của
phép * hoặc / 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).
1.2.4. Thanh ghi cờ (Flag Register - FR):
Đây là thanh ghi khá đặc biệt trong CPU, mỗi Bit của nó dùng để phản ánh 1
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 gọi là các Bit cờ.
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 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ờ.
x x x x O D I T S Z x A x P x C
x : Bit không được định nghĩa.
Các cờ cụ thể:
. C hoặc CF (Carry Flag): Cờ nhớ.
CF = 1 khi có nhớ hoặc mượn từ MSB sang.
(MSB - Most Significant Bit: Bit có ý nghĩa nhất).
. P hoặc PF (Parity Flag): Cờ chẵn lẻ, phản ánh tính chẵn lẻ của tổng số Bit 1
trong kết quả.
PF = 1 khi tổng số Bit 1 trong kết quả là chẵn (even parity).
. A hoặc AF (Auxiliary Flag): Cờ nhớ phụ, rất có ý nghĩa khi ta làm việc với
1 số BCD.
AF = 1 khi có nhớ hoặc mượn từ 1 số BCD thấp (4 Bit thấp) sang 1 số
BCD cao (4 Bit cao).
. Z hoặc ZF (Zero Flag): Cờ Zero, ZF = 1 khi kết quả = 0.
. S hoặc SF (Sign Flag): Cờ dấu, SF = 1 khi kết quả âm.
23
GV. Vương Quốc Dũng
. O hoặc OF (Overflow Flag): Cờ tràn, OF = 1 khi kết quả là 1 số bù 2
vượt ra ngoài giớ hạn biểu diễn dành cho nó.
Trên 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 đó. Chúng được lập hoặc xóa tùy theo điều kiện cụ thể
sau các thao tác của ALU. Ngoài ra 8086 còn có 3 cờ điều khiển (các cờ này
được lập, xóa bằng các lệnh riêng):
. T hoặc TF (Trap Flag): Cờ bẫy, TF = 1 khi CPU làm việc ở chế độ chạy
từng lệnh (Chế độ này dùng khi cần tìm lỗi của 1 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 (ngắt che được) được tác động.
. D hoặc DF (Direction Flag): Cờ hướng, DF = 1 khi CPU làm việc với 1

chuỗi ký tự từ phải sang trái (DF còn gọi là cờ lùi).
* ý nghĩa của các cờ khá rõ ràng; Riêng cờ tràn cần làm rõ hơn để hiểu rõ
bản chất và cơ chế làm việc của nó.
Giả thiết ta làm việc với số bù 2 dài 8 Bit, kết quả để ở AL. Gọi C
6,7
là cờ nhớ từ
Bit 6 lên Bit 7 (b7), trong đó b7 là MSB và cũng chính là Bit dấu (SF) của AL
Quan hệ giữa cờ OF với cờ C
6,7
tuân theo phương trình sau:
OF = CF ⊕ C
6,7

Nghĩa là: khi thực hiện các phép toán với số tính theo mã bù 2 (số 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à SF) sang CF
nhưng ngược lại không có nhớ vào chính nó (SF) hoặc ngược lại.
Ví dụ:
01111111 = 127
+
00000001 = 1
10000000 = - 128 (Kq sai)
Overflow
(Nhớ vào SF, xong không có
nhớ vào CF - Kết quả sai: Tổng
hai số dương bằng số âm)
ở đây: C
6,7
= 1 (có nhớ từ bit 6
lên bit 7)
CF = 0 (không có nhớ

từ MSB sang)
do vậy: OF = CF ⊕ C
6,7
= 1
10000000 = - 128
+
10000001 = - 127
1 00000000 = 000 (Sai)

Carry Out Overflow
(Nhớ vào CF, xong không có
nhớ vào SF - Kết quả sai:
Tổng hai số âm bằng 1 số
dương)
ở đây: C
6,7
= 0 (không có nhớ
từ bit 6 lên bit 7)
CF = 1 (có nhớ từ
MSB sang)
24
CF b7 b6 AL b0
C6,7
GV. Vương Quốc Dũng
do vậy: OF = CF ⊕ C
6,7
= 1
1.3. Cơ chế quản lý bộ nhớ.
1.3.1. Tổng quan về hệ thống nhớ:
1.3.1.1. Các đặc trưng của hệ thống nhớ:

+ Vị trí:
Bên trong CPU: Các thanh ghi mà người lập trình có thể can thiệp được.
Bộ nhớ trong: . Bộ nhớ chính.
. Bộ nhớ Cache.
Bộ nhớ ngoài:
+ Dung lượng:
Độ dài của từ nhớ (Bit): 8 Bit hay 16 Bit (có thể là Byte).
Số lượng từ nhớ.
+ Đơn vị trao đổi:
Theo từ nhớ.
Theo Block nhớ.
+ Phương pháp truy cập:
Tuần tự.
Trực tiếp.
Ngẫu nhiên.
+ Hiệu năng (Performance):
Thời gian truy nhập.
Chu kỳ truy nhập.
Tốc độ truyền (Bps - Bit/sec).
+ Các loại bộ nhớ vật lý:
Bộ nhớ từ.
Bộ nhớ quang.
Bộ nhớ bán dẫn.
+ Các đặc trưng vật lý:
Xoá được và không xoá được.
Khả biến và không khả biến.
. Khả biến: Mất nguồn thì mất thông tin.
. Không khả biến: Mất nguồn thì không mất thông tin (VD: Đĩa từ).
+ Tổ chức bộ nhớ.
+ Giá thành.

1.3.1.2. Mô hình phân cấp hệ thống nhớ:

25
Bộ vi xử lý (CPU)

Tập
thanh
ghi
Cache
L2
(Thứ cấp)
SRAM
Bộ nhớ
chính
Bộ nhớ
ngoài
DRAM
Cache
L1
(Sơ cấp)

×