Các hệ đếm và mã hoá thông tin trong máy tính Tài liệu Kĩ thuật vi xử lý - Văn Thế Minh
Trang 1CHƯƠNG I CÁC HỆ ĐẾM VÀ VIỆC MÃ HÓA THÔNG TIN TRONG MÁY
TÍNH
1 Câc hệ đếm dùng trong mây tính
1.1 Hệ mười vă hệ hai
Trong cuộc sống hăng ngăy chúng ta dùng hệ cơ số mười hoặc nói gọn hơn hệ mười để biểu diễn câc giâ trị số Điều năy lă rất tự nhiín vì từ khi xưa một con người bình thường đê biết dùng 10 ngón tay của mình như lă “công cụ tính toân sơ đẳng Trong hệ thống năy chúng ta dùng tổ hợp của câc chữ số 0 9 để biểu diễn câc giâ trị số, đi kỉm theo tập hợp đó có thể dùng thím chữ D đi mă vẫn ngầm hiểu rằng đó lă số hệ mười
Trong thế giới mây tính thì khâc, để biểu diễn 1 giâ trị số chúng
ta dùng hệ cơ số hai hoặc nói gọn hơn hệ hai, trong đó chỉ tồn tại hai chữ số 0 vă 1để biểu diễn câc giâ trị số (ứng với hai trạng thâi có điện
vă không có điện của câc mạch điện tử cấu tạo trín mây) 0 vă 1 cũng
lă câc giâ trị có thể có của một chữ số hệ hai Hệ hai lă hệ dùng trong câc mây tính Một số hệ hai thường được đânh dấu bằng chữ B đi kỉm
ở cuối để phđn biệt với câc hệ khâc khi ta lăm việc cùng một lúc với nhiều hệ đếm khâc nhau Một cụm 4 bit sẽ tạo thănh 1 nibble, cụm 8 bit sẽ tạo thănh 1 byte, cụm 16 bit thông thường sẽ trạo thănh một từ(word), cụm 32 bit sẽ tạo thănh một từ kĩp Chữ số đầu tiín bín trâi trong dêy câc số hệ hai gọi lă bít có ý nghĩa lớn nhất, còn bit cuối cùng bín phải trong dêy gọi lă bit có ý nghĩa bĩ nhất Ứng với việc đếm thứ
tự 1,2,3…ở hệ 10 thì ở hệ 2 ta có 1,10,11…
Nibble
byte
word
Double
Word
Hình1.1 Câc đơn vị đo độ dăi của số hệ hai dẫn xuất từ bit
Vì con người chỉ quen tính toân với hệ mười, trong khi câc bộ phận tính toân của mây tính chỉ biết lăm việc với hệ hai, nín để đảm bảo sự giao tiếp thuận tiện giữa người vă mây (khi đưa số liệu văo vă lúc lấy ra kết quả tính toân) thường xuyín phải có việc chuyển đổi qua lại giữa hai hệ đếm năy Chúng ta cùng xem xĩt nhanh câc vấn đề trín thông qua câc ví dụ đơn giản dưới đđy
Một số hệ mười viết như sau: 12345,67
Trang 2Sẽ có giâ trị số bằng tổng của câc tích giữa câc hệ số 1,2,3,4,5,6,7 với câc trọng số 10i như sau:
12345,67=1.104 +2.103 +3.102 +4.101 +5.100 +6.10-1 +7.10-2 Tương tự như vậy, một số hệ hai viết như sau: 10111,01
Sẽ có giâ trị số bằng tổng của câc tích giữa câc hệ số 1,0,1,1,1,01,1 với câc trọng số 2i tương ứng lần lược như sau:
=1.24 +0.23 +1.22 +1.21 +1.20 +0.2-1 +1.2-2
Câc thuật toân thường dùng để chuyển đổi giữa hai hệ trín:
Đổi số hệ hai sang hệ mười
Muốn đổi một số từ hệ hai sang hệ mười chỉ cần tính câc giâ trị 2i tương ứng với câc chữ số khâc không thứ i của hệ số hai rồi cộng lại như đê nói ở trín:
Ví dụ
10111,11B =24 +22 +21 +20 +2-1 +2-2 =25,75 Ngược lại muốn chuyển một số từ hệ mười sang hệ hai ta có thể lăm theo hai câch:
Câch một để đổi số hệ mười sang hệ hai
Quy tắc: Lấy số hệ mười cần đổi trừ đi 2x (x lă giâ trị lớn nhất của
số mũ chọn sao cho 2x nhỏ hơn hoặc bằng so với số hệ 10 cần đổi), ghi lại giâ trị 1 cho chữ số hệ hai ứng với 2x Tiếp tục lăm như vậy đối với
số dư do phĩp trừ trín tạo ra vă câc số 2i bậc thấp hơn cho tới đạt tới
20 vă ghi lại câc gia 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ừa tương ứng:
1, khi số dư lớn hơn hoặc bằng 2i
0, khi số dư nhỏ hơn hoặc bằng 2i (vă phĩp trừ không được thực hiện)
ví dụ đổi số 34 sang hệ hai.
Câc giâ trị 2i cần tính dến (25 =32 lă giâ trị 2x sât dưới nhất so với
số 34)
25 24 23 22 21 20
Câc chữ số hệ hai tính được:
Như vậy 34=100010B
Quy tắc: Lấy số cần đổi chia cho 2 và ghi nhớ phần dư,
tiếp theo lấy thương của phép chia trước đó chia cho 2 và ghi nhớ phần dư Làm như vậy cho tới khi được thương bằng 0 Đảo ngược thứ tự dãy các số dư sẽ được các chữ số của số hệ hai cần tìm
Ví dụ : Đổi số 34 sang hệ hai (hình 1.1.) Kết quả được
100010B
34 2
0 17 2
Trang 31 8 2
0 4 2
0 2 2
0 1 2
Các số dư trong khung sẽ được sắp xếp theo chiều mũi tên
HÌnh 1.1 Một cách đổi số hệ mười sang hệ hai
Trong trường hợp số hệ mười cần đổi có thêm cả phần lẻ sau dấu phẩy thì đầu tiên ta phải đổi riêng rẽ từng phần rồi sau đó cộng các kết quả lại Đối với phần nguyên ta có thể làm theo 2 cách đã nói ở trên Riêng đối với phần sau dấu phẩy ta đổi theo quy tắc trình bày sau đây
Lấy số cần đổi nhân với 2, tích nhận được sẽ gồm phần nguyên và phần lẻ nhị phân, lấy phần lẻ nhị phân của tích thu được nhân tiếp với 2 Làm như vậy cho tới khi được tích chẵn bằng 1 Chọn riêng các phần nguyên (phần trước dấu phẩy) của các tích thu được và sắp xếp lại sẽ được các chữ số sau dấu phẩy của số hệ hai cần tìm
Ví dụ: Đôỉ số 0.125 ra số hệ hai.
Ta thực hiện phép nhân lần lượt theo các bước trên:
0,125 * 2 = 0 ,250 0,250 * 2 = 0 ,500 0,500 * 2 = 1 ,000
và thu được kết quả là 0,125 = 0,001B (phần được đóng trong khung)
Kết hợp các ví dụ trên lại, nếu phải đổi số 34,125 ra hệ hai ta thu được kết quả cuối cùng là 34,125 = 100010,001 B
1.2 Số BCD (số hệ mười mã hóa bằng hệ hai)
Giữa hệ mười và hệ hai còn tồn tại một hệ lai: hệ
BCD cho các số hệ mười mã hóa bằng hệ hai (Binary Coded Decimal number), rất thích hợp cho các thiết bị do có thêm
phần hiện thị số ở đầu ra dùng các loại đèn hiện số khác nhau Ở đây ta dùng 4 số hệ hai để mã hóa một số hệ mười có giá trị nằm trong khoảng 0 9 Như vậy, ở đây ta không dùng hết các tổ hợp có thể có của 4 bit Vì tầm quan trọng của các số BCD nên các bộ vi xử lý thường có các lệnh thao tác với chúng
Trang 4Ví dụ: Số 410 nếu biểu diễn theo kiểu số BCD thì
được 0100 0001 0000 Kết quả này cũng gợi ý cho ta cách thức chuyển đổi giữa hai loại số
1.3 Hệ mười sáu (Hexa-decimal, hex, H)
Nếu ta dùng hệ hai để biểu diễn các số có giá trị lớn ta sẽ gặp điều bất tiện là số hệ hai thu được quá dài Ví dụ để biểu diễn số 255 ta cần đến 8 bit viết như sau:
255 = 1111 1111 B Trong thực tế để viết kết quả biểu diễn các số cho gọn lại người ta tìm cách nhóm 4 số hệ hai (1 nibble) thành
một số hệ mười sáu Khác với hệ BCD vừa nói hệ 16 dùng
hết các tổ hợp có thể của 4 bit để biểu diễn các giá trị số Để làm được điều này người ta sử dụng các chữ số sẵn có của hệ mười 0 9 để biểu diễn các giá trị số ứng với 0 9 và dùng thêm các chữ cái A F để biểu diễn các giá trị còn lại ứng với 10 15 để phân biệt một số hệ mười sáu với các số hệ khác ta kèm thêm chữ H ở cuối Ta cũng dễ nhận thấy rằng số mười chỉ là một bộ phận của hệ mười sáu
2 Các phép toán số học đối với số hệ hai
2.1 Phép cộng
Phép cộng các số hệ hai thực hiện giống như khi ta làm với số hệ mười Quy tắc phép cộng số hệ hai được chỉ
ra trong bảng 1.1
Bảng 1.1 Quy tắc phép cộng Bảng 1.2 Quy tắc phép trừ
y=a+b y= a-b
C: nhớ (Carry) B: mượn (Borrow)
Ví dụ:
Cộng hệ mười Cộng hệ hai
11 nhớ 1111 1110
099 Số hạng 1 0110 0011
095 Số hạng 2 0101 1111
Trang 5194 Tổng 1100 0010
Các bộ cộng trong các khối tính toán số học của máy tính sẽ thực hiện các phép cộng theo cách đã nói ở trên
2.2 Phép trừ và số bù hai
a) Phép trừ
Phép trừ các số hệ hai thực hiện giống như khi ta làm với số hệ mười
Quy tắc phép trừ số hệ hai được chỉ ra trong bảng 1.2
Ví dụ
Trừ hệ mười Trừ hệ hai
1 Mượn 110 0000
109 số bị trừ 0110 1101
9 số trừ 0011 0001
060 Hiệu 0011 1100
b) Số bù hai
Trong khi làm phéo trừ ta nhận thấy có thể thực hiện phép trừ bằng phép cộng: cộng số bị trừ với số đối 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ấn đề đặt ra đối với số hệ hai là ta phải có cách biểu diễn số âm một cách thích hợp sao cho ta có thể ứng dụng được tính chất nói trên Có rất nhiều cách mã hóa các số hệ hai đê biểu diến số âm nhưng trong thực tế hay dùng nhất là dùng
cách mã hóa kiểu số bù hai.
Bảng 1.3 chỉ ra cách tạo ra các số hệ hai có dấu và số bù hai trong sự tương quan với số hệ hai
Bảng 1.3 Biểu diễn các số theo hệ hai, hệ hai có dấu và mã bù hai
Số 8 bit số hệ mười số hệ mười theo số hệ mười tính
hệ hai tương đương mã hệ hai có dấu theo mã bù hai
0000 0000 0 + 0 + 0
0000 0001 1 + 1 + 1
0000 0010 2 + 2 + 2
0111 1101 125 + 125 + 125
Trang 60111 1110 126 +126 +126
0111 1111 127 +127 +127
1000 0000 128 - 0
- 128
1000 0001 129 - 1
- 127
1000 0010 130 - 2
- 126
1111 1101 125 -125
- 3
1111 1110 126 -126
- 2
1111 1111 255 -127
- 1
Quan sát kỹ bảng này chúng ta có thể rút ra các nhận xét sau:
1 Nếu ta dùng 8 bit để biểu diễn số thì ta thu được 256 tổ hợp có giá trị từ 0 đến 255 (tương ứng 00 FF H), tức là chỉ biểu diễn được số dương
2 Với tổ hợp trên nếu ta muốn biểu diễn số có dấu theo kiểu dấu và độ lớn (sign and magnitude) ta phải mất 1 bit để dành cho dấu và 7 bit còn lại để định giá trị Với cách làm này ta có khả năng biểu diễn cả số
âm và số dương nằm trong khoảng -127 -0, +0 +127 (chú ý 2 giá trị 0 khác nhau)
3 Số bù hai được tạo ra theo cách gần giống như kiếu dấu và độ lớn nhưng nó dùng cả 8 bit để biểu diễn giá trị của số được mã hóa Mã bù hai dài 8 bit có khả năng biểu diễn các số âm và dương trong khoảng -128 0 +127 Một số dương có mã bù hai giống như hệ mã hai thông thường
4 Một số biểu diễn theo hệ hai sẽ có các giá trị khác nhau nếu hiểu đó là mã để biểu diễn số theo kiểu hệ hai có dấu hoặc kiểu số bù hai Nói khác đi, một cụm các số 0 và 1 sẽ được cảm nhận khác nhau khi nó biểu diễn giá trị số theo các mã khác nhau Cho dù có được biểu diễn bằng số hệ hai có dấu hay số bù hai thì các số âm đều có bit b7 = 1, còn các số dương có bit b7 = 0
Trang 7Bây giờ ta nói cụ thể cách tính số bù hai của một số nào đó Về mặt toán học thì sí bù hai của một số chính là số đối của nó Như vậy một số dương sẽ có số bù hai là một số âm cùng giá trị tuyệt đối và ngược lại
Quy tắc: Muốn tìm số bù hai (còn gọi là bù số học) của
một số A ta làm theo các bước sau:
biểu diễn số A theo mã bù hai của nó
tìm số bù một (bù logic) của số đó (bằng cách
đảo bit)
cộng 1 vào số bù một ở trên để nhận được số bù hai của số A
Ghi chú: Khi có một số âm được biểu diễn theo mã bù hai nếu muốn tính giá trị tuyệt đối của nó ta cũng áp dụng quy tắc này (áp dụng các bước 2.3)
Ví dụ: Tìm số bù hai của 13.
13 = 0000 1101 B (mã bù hai của 13) số bù 1 của 13: 1111 0010 B (đảo bit của số trên) cộng thêm 1: 1
số bù hai của 13: 1111 0011 B (tức là -13)
Có thể lấy một ví dụ khác để chứng tỏ kết quả trên là đúng và qua đó cũng thấy được ứng dụng của số bù hai trong khi làm phép trừ
Ví dụ: 15 - 13 = ?
Ta có thể viết lại phép trừ trên thành phép cộng 15 + (-13) và sử dụng kết quả vừa tính được ở trên cho số (-(-13):
15 0000 1111 (-13) 1111 0011 tổng 0000 0010 (nhớ 1) Nếu không để ý đến nhớ ta có kết quả là 2
Ví dụ: 12 - 13 = ?
12 0000 1100 (-13) 1111 0011 tổng 1111 1111 (tức -1) Đây là một số âm (bit b7=1) với giá trị tuyệt đối là
1 (tra theo bảng 1.2) Mặt khác ta cũng có thể tìm được giá trị tuyệt đối của kết quả bằng cách tìm số bù hai của nó:
Mã bù hai của kết quả trên 1111 1111
Số bù 1 của kết quả trên 0000 0000
Cộng - để tìm giá trị tuyệt đối 0000 0001
2.3 Phép nhân
Trang 8Phép nhân các số hệ hai thực hiện giống như khi ta làm với hệ số mười Quy tắc phép nhân số hệ hai được chỉ ra trong bảng 1.4
Bảng 1.4 Quy tắc phép nhân y=a.b
Trên cơ sở quy tắc vừa nêu và để cho đơn giản ta thực hiện ví dụ một phép nhân 2 số hệ hai với độ dài 4 bit để làm sáng tỏ thuật toán nhân
1001 Số bị nhân (9)
0110 Số nhân (6)
0000 Thành phần 1 của tổng tích luỹ
1001 Thành phần 2 của tổng tích luỹ
1001 Thành phần 3 của tổng tích luỹ
0000 Thành phần 4 của tổng tích luỹ
0110110 Tổng tích luỹ (54)
Độ dài cực đại của kết quả trong trường hợp này là 8 bit Nếu ta có các toán hạng 8 (hoặc 16) bit thì độ dài cực đại của kết quả là 16 (hoặc 32) bit Mỗi lần nhân 1 bit khác 0 của số nhân với số bị nhân ta thu được chính số bị nhân Nếu dịch trái nó một số lần tương ứng với vị trí của bit khác 0 đó trong số nhân, ta tạo ra 1 thành phần của tổng tích luỹ Tổng của các thành phần như trên là kết quả của phép nhân
Phân tích kỹ quá trình trên ta thấy phép nhân có thể thực
hiện theo thuật toán cộng và dịch (trên cơ sở các bộ cộng và
dịch) như sau:
Thành phần đầu tiên của tổng tích luỹ thu được là tích của số LSB trong số nhân với số bị nhân Nếu LSB
= 0 thì thành phần này cũng bằng 0, còn nếu LSB = 1 thì thành phần này chính bằng số bị nhân
Mỗi thành phần thứ i tiếp theo của tổng tích luỹ sẽ tính được bằng cách tương tự, nhưng phải dịch trái i bit (có thể bỏ qua các thành phần bằng 0)
Tổng của các tổng thành phần là tích cần tìm
Trang 9Để minh hoạ cho thuật toán trên, ta dùng luôn nó để rút gọn ví dụ đã làm trước đây như sau:
1001 Số bị nhân (9)
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 luỹ (54)
2.4 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ể được 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 của phép chia thông qua ví dụ cụ thể
Ví dụ: 35/5 = 7
Ta hãy quan sát kỹ các bước phải làm khi chia bằng tay:
100011 101
000 0111
1000
101 111 101 101 101 0 Trong các bước tính ở trên liên tục cần phải có các dự đoán và kiểm tra để tìm ra được kết quả đúng Công việc này là rất khó khăn đối với các mạch điện tử của khối tính toán số học (vốn là các phần tử để thực hiện phép cộng và dịch trong máy tính) Sau đây là một thuật toán khắc phục được các vấn đề nêu ở trên:
1.Đổi số chia ra số bù hai của nó (để bước ở sau làm tính trừ bằng tính cộng)
2.Lấy số bị chia trừ đi số chia
Nếu kết quả này có bit dấu bằng 0 (có nghĩa là phần này của số bị chia chia được cho số chia) thì bit tương ứng của thương bằng 1
Nếu kết quả này có bit dấu bằng 1 (có nghĩa là phần này của số bị chia không chia được cho số chia) thì bit tương ứng của thương bằng 0 và ta buộc phải khôi phục lại giá trị ban đầu của số bị chia bằng cách cộng kết quả này với số chia ở mã hệ hai
Trang 103.Dịch trái kết quả thu được ở trên và làm lại bước 2 cho đến khi nhận được kết quả cuối cùng là 0 (chia hết) hoặc nhỏ hơn số chia (chia còn dư)
Ví dụ: 36/5 = 7, dư 1 Thực hiện phép chia này trong hệ
hai
Đầu tiên ta có 5 = 0101B và số bù hai của nó là 1011B Các bước tính toán tiếp của phép chia theo thuật toán đã nêu ở trên được liệt kê ra như sau:
Toáìn hạng Thương Tên toán hạng, thao tác
để cộng
(kq1)
để cộng
lần
để cộng
0 10000 1 Tổng, kết
quả 2 (kq2)
lần
hai để cộng
0 0110 1 Tổng, kết
quả 3 (kq3)
để cộng
0 001 1 Tổng, kết
quả 4 (kq4)
Bit dấu
Từ đây ta rút ra 36/5 = 7 và dư 1