Bài giảng Kỹ thuật Vi xử lý - Văn Thế Minh
Trang 1MỤC LỤC
Trang 2CHƯƠ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ễncá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 taycủ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ọnhơ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ĩalớ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…
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ếtlà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úclấ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ùngxem 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
Tương tự như vậy, một số hệ hai viết như sau: 10111,01
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
không thứ i của hệ số hai rồi cộng lại như đã nói ở trên:
Ví dụ
Trang 310111,11B =2 +2 +2 +2 +2 +2 =25,75Ngượ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:
cho chữ số hệ hai thứ i tùy theo quan hệ giữa số dư và lũy thừa tương ứng:
ví dụ đổi số 34 sang hệ hai.
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ãycá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.
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 đổiriê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êngcá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ấuphẩy của số hệ hai cần tìm
Trang 4Ta thực hiện phép nhân lần lượt theo các bước trên:
0,125 * 2 = 0 ,2500,250 * 2 = 0 ,5000,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 trongkhoả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
Ví 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 đượcquá dài Ví dụ để biểu diễn số 255 ta cần đến 8 bit viết như sau:
255 = 1111 1111 BTrong 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 ứngvớ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
Trang 5C: 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
194 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
0111 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
Trang 61111 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ị 0khá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ôngthườ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ố theokiể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ậnkhá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.Bâ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:
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ó tacũng áp dụng quy tắc này (áp dụng các bước 2.3)
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êncho số (-13):
15 0000 1111(-13) 1111 0011tổng 0000 0010 (nhớ 1)Nếu không để ý đến nhớ ta có kết quả là 2
Ví dụ: 12 - 13 = ?
Trang 712 0000 1100(-13) 1111 0011tổ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
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:
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ínhbằng số bị nhân
dịch trái i bit (có thể bỏ qua các thành phần bằng 0)
Để 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:
Trang 8tử để 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ằngcách cộng kết quả này với số chia ở mã hệ hai
3.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
0 100100 Số bị chia
1 111100 0 Tổng, kết quả 1 (kq1)
Trang 93 Mã ASCII - mã tiêu chuẩn cho trao đổi thông tin
Bảng 1.5 Bảng mã ASCII tiêu chuẩn
Trang 10để hiển thị trên màn hình đều ở dưới dạng ký tự và tuân theo 1 loại mã được dùng rất rộng rãi gọi là mãASCII (American Standard Code for Information Interchange, mã chuẩn của Mỹ dùng cho trao đổi thôngtin) Việc dùng các ký tự để mã hoá thông tin theo bảng mã ASCII (bảng 1.5) cho ta khả năng trao đổithông tin với hầu hết các máy tính khác.
Trong bảng mã ASCII tiêu chuẩn, người ta dùng 7 bit để mã hóa các kỹ tự thông dụng, như vậy
bảng mã này sẽ có 128 ký tự ứng với các mã số từ 0 127 Bit thứ 8 có thể cho liên tục bằng 0, 1 hoặc có
thể dùng để chứa bit parity (xem ý nghĩa của parity ở chương 3, phần nói về các cờ) phục vụ cho việc phát
hiện lỗi khi truyền
Bên cạnh bảng ASCII tiêu chuẩn người ta còn dùng bảng ASCII mở rộng cho các ký tự đặc biệt
(khác các ký tự tiêu chuẩn) với mã từ 128 255
Khi tra các bảng này ta đọc mã của ký tự theo thứ tự cột – hàng
Ví dụ: Mã ASCII của một số ký tự thường dùng trong khi lập trình:
<Bel> (Bell, chuông): 7
<BS> (Back space, xoá lùi): 8
<HT> (Horizont tab, giãn cách ngang): 9
<LF> (Line feed, thêm dòng mới): OAH
<CR> (Carriage return, về đầu dòng): ODH
<SP> (Space, dấu cách): 2OH;
‘$’: 24H; ‘0’: 30H; ‘9’: 39H; ‘A’:41H; ‘a’: 61H
Khi xem xét bảng 1.5 ta có thể rút ra mấy nhận xét sơ bộ như sau:
1 2 cột đầu của bảng mã được dùng cho các ký tự điều khiển
2 Cột 2 dành riêng cho các ký tự ngăn cách
3 Các ký tự số nằm ở cột 3 Mã của ký tự ‘0’ là 30H ‘9’ là 39H Giữa giá trị số và mã ASCII của
số đó có khoảng cách là 30H
4 Các chữ cái hoa nằm ở các cột 4,5, các chữ cái thường ở cột 6,7 Khoảng cách giữa chữ thường
và chữ hoa cùng tên là 20H
4 Quan hệ giữa mã ASCII với số BCD
Trong khi làm toán với các số BCD ta thường kết hợp 2 số BCD thành 1 byte Dạng số BCD viết
theo kiểu này gọi là dạng BCD chuẩn hay còn được gọi là dạng BCD gói (packed BCD) Khi lưu trữ, khi
hiện thị hoặc khi truyền giữa các thiết bị các giá trị số 0 9, thực chất ta làm việc với mã ASCII của các
số đó, tức là các số 30H 39H Như vậy ta thấy trong 1 byte mã ASCII biểu diễn các số 0 9 có 4 bit thấpứng với mã BCD của chính các số đó, 4 bit cao bao giờ cũng ứng với mã BCD của số 3 (tức là 0011B)
Trang 11Nếu trong byte mã ASCII này ta thay 4 bit cao bằng OH thì ta thu được số BCD không gói Nói cách khác
số BCD không gói là số dài 1 byte, trong đó 4 bit cao bằng không, 4 bit thấp là số BCD chuẩn mã hóa sốcần biểu diễn
Ví dụ sau minh họa quan hệ giữa số BCD gói, BCD không gói và mã ASCII
Mã ASCII của 5 là 0011 0101B = 35H
Mã ASCII của 9 là 0011 1001B = 39H
Mã ASCII không gói của 5 là 0000 0101B = 05H
Mã ASCII không gói của 9 là 0000 1001B = 09H
Mã ASCII gói (chuẩn) của 59 là 0101 1001B = 59H
Từ đây ta có thể rút ra các bước phải làm để đổi 2 số ở dạng mã ASCII sang dạng số BCD chuẩn:
Đây là các công việc hay gặp khi thao tác với các số trong các hệ vi xử lý
Trang 12CHƯƠNG 2 : MÁY VI TÍNH VÀ HỆ THỐNG VI XỬ LÝ
Bộ vi xử lí có mặt trong các máy vi tính là sự phát triển tiếp theo của bộ xử lí được dùng như là một
bộ phận chủ chốt trong cácmáy tính của các thế hệ trước Để nắm bắt được tính kế thừa và tính liên tụccủa sự phát triển này, trước khi giới thiệu về các bộ vi xử lí ta để ra một chút thời gian để giới thiệu về cácloại máy tính nói chung
1 Từ máy tính lớn đến máy vi tính
Như ta đã biết về kiến thức của máy tính nói chung, một máy tính (Computer) thông thường baogồm các khối chức năng cơ bản như: khối xử lí trung tâm (CPU, central processing unit), bộ nhớ (M,Memory) và khối phối ghép với thiết bị ngoại vi (I/O, input/output) tuỳ theo quy mô phức tạp của cáckhối chức năng kể trên mà người ta phân các máy điệ tử đã và đang sử dụng ra thành các loại sau:
1.1.Máy tính lớn
Máy tính lớn (mainframe) là loại máy tính được thiết kế để giải các bài toán lớn với tốc đọ nhanh.
Nó thường làm việc với số liệu từ 64 bit hoặc lớn hơn nữa và được trang bị bộ nhớ rất lớn Chính vì vậymáy tính cũng lớn về kích thước vật lý Chúng thường được dùng để điều khiển các hệ thống thiết bị dùngtrong quân sự hoặc các hệ thống máy móc của chương trình nghiên cứu vũ trụ, để xử lý các thông tintrong ngành ngân hàng, ngành khí tượng, các công ty bảo hiểm Tiêu biểu cho loại máy tính này là loại
máy IBM 8341, honeywell DSP8 loại máy lớn nhất trong các máy lớn được gọi là supercomputer (như
loại máy Y-MP/832 của Cray)
1.2 Máy tính con
Máy tính con (minicomputer) là một dạng thu nhỏ về kích thước cũng như về tính năng của máy tính
lớn Nó ra đời nhằm thoả mãn các nhu cầu sử dụng máy tính cho các ứng dụng vừa phải mà nếu dùng máytính lớn vào đó thì sẻ gây lãng phí Do vậy máy tính con thường làm việc với các dữ liệu có đọ dài từ 32bit với tốc độ chậm hơn và khả năng của bộ nhớ hạn chế hơn Máy tính con thường được dùng cho cáctính toán khoa học kỹ thuật, gia công dữ liệu quy mô nhỏ hay để điều khiển quy trình công nghệ Tiêubiểu cho nhóm này là loại máy VAX 6360 của Digital Equipment Corporation và MV/8000II của Datagenaral
1.3.Máy vi tính
Máy vi tính (Microcomputer) là loại máy tính rất thông dụng hiện nay Một máy vi tính có thể là một
bộ vi điều khiển (microcontroller)., một máy vi tính trong một vỏ mách (one- chip- microcomputer), vàmột hệ vi xử lí có khả năng làm việc với số liệu có độ dài 1 bit, 4 bit, 8 bit, 16 bit Hiện nay một số máy vitính có tính năng có thể so sánh được với máy tính con, làm việc với số liệu có độ dài từ là 32 bit (thậmchí là 64 bit) Ranh giới để phân chia giữa máy vi tính và máy tính con chính vì thế ngày càng không rỏnét Một dặc điểm tiêu biểu để nhận biết máy vi tính là chúng đều sử dụng các bộ xử lí trung tâm (CPU)được chế tạo bằng công nghệ mạch vi điện tử với mức độ tổ hợp lớn, mạch VLSI (very large of
Các bộ vi xử lý hiện có tên thị trường thường được xếp theo các họ phụ thuộc vào các nhà sản xuất
và chúng rất đa dạng về chủng loại Nổi bật nhất trong các họ vi xử lý đố là 2 họ của 2 nhà sản xuất hàngđầu nổi tiếng trong lĩnh vực này, đó là họ vi xử lý 80x86 của Intel và họ vi xử lý 680xx của Motorola.Trong các chương sau chúng ta sẽ quan tâm chủ yếu đến các bộ vi xử lý, các mạch phụ trợ và các hệthống xây dựng trên cơ sở linh kiện của Intel, tuy thế sau đây cúng ta cũng sẽ giới thiệu lướt qua về lịch sửphát triển và các đặc điểm chung nhất của các thế hệ vi xử lý từ trước đến nay Cuối cùng chúng ta sẽ đưa
ra bảng tổng kết, trong đó nêu ra các thông số chính của các bộ vi xử ký thế hệ gần đây nhất của 2 nhàcung cấp nổi tiếng la Intel và Motorola
2 Sự phát triển của các bộ vi xử lý
Trang 132.1 Thế hệ 1 (1971-1973)
Năm 1971, trong khi phát triển các vi mạch dùng cho máy tính cầm tay, Intel đã cho ra đời bộ vi xử
lý đầu tiên là 4004 ( 4 bit ) của Rockwell International, IPM-16 (16 bit) của National Semiconductor.Đặc điẻm chung của các vi xử lý thế hệ này là:
Độ dài từ thường là 4 bit (cũng có thể dài hơn)
Công nghệ chế tạo PMOS với đặc điểm mật độ phần tử nhỏ, tốc độ thấp, giá thành rẻ và cókhả năng đưa ra dòng tải nhỏ
Tập lệnh đơn giản phải cần nhiều mạch phụ trợ mới tạo nên một hệ vi xử lý hoan chỉnh
2.2 Thế hệ 2 (1974-1977)
Các bộ vi xử lý đại diên trong thế hệ này là các vi xử lý 8 bit 6502 của MOS Technology, 6800 và
6809 của Motorola, 8080 và 8085 của Intel và đặc biệt là bộ vi xử lý Z80 của Zilog Các bộ vi xử lý này
có tập lệnh phong phú hơn và thường có khả năng phân biệt địa chỉ bộ nhớ với dung lượng đến 64KB Cómột số bộ vi xử lý còn có khả năng phân biệt được 256 địa chỉ cho các thiết bị ngoại vi (họ Intel và Zilog).Chúng đã được sử dụng rộng rãi trong công nghiệp và nhất là để tạo ra các máy tính 8 bit nỗi tiếng mộtthời như Apple II và Commodore 64 Tất cả các bộ vi xử lý thời kì này đều được sản xuất bằng công nghệNMOS ( Với mật độ điện tủ trên một đơn vị diện tích cao hơn so với công nghệ PMOS) hoặc CMOS ( tiết
vi xử lý được dùng trong các máy IBM PC, PC/XT, PC/AT và các máy Macintosh của Apple Phần lớncác bộ vi xử lý trong thế hệ này đều được sản xuất bằng công nghệ HMOS và cho phép đạt được tốc độ từ
số cơ bản của bộ vi xử lí ngày càng được cải thiện : tốc độ ngày càng cao ( các bộ vi xử lí hiện đại củaINTEL đã đạt tới tốc độ 800 MHz - 3GHz, độ rộng kênh thông tin dữ liệu ngày càng lớn như : 32, 64bit Điều đó đã giúp cho bài toán thiết jkế các bài toán thjiết kếcác hệ vi xử lí chuyên dung với tính năngrang lain trở nên dễ dàng hơn Song song với các hệ vi xử lí của hãng INTEL, hãng Motola cũng đưa racác vi xử lý 32 bit 68020/68030/68040 và các vi xử lí 64 bit 68060/64 Ngày nay tốc độ của các vi xử líhiện đại của hãng MOTOROLA cũng đạt trên 3GHz Đặc điểm của các bộ vi xử lý thế hệ này có sốlượng transistor rất lớn ( từ vài 3 triệu đến trên 50 triệu transistor Phần lain các bộ vi xử lí mới thực hiệncác lênh trong một chu kỳ, và thực tế taut cả chúng đều có đơn vị xử lí dấu phẩy động FPU (Floating-point Unit ) bên trong Chúng có các thanh ghi chung 16-32 bit Nhiều loại có phân biệt các tệp thanh nghi32-bit ( register file ) cho đơn vị nguyên IU ( interger unit ) vaf teepj thanh ghi 32- bit cho FPU Chúng
có Cache memory bên trong với dung lượng lên tới 36 KB Đa số Cache memory bên trong phân đôi :dùng cho lệnh Icache và dùng cho dữ liệu Dcache Các bộ vi xử lí công nghệ cao hiện nay( advanced
Trang 14microprocessors) đã thoả mãn các yêu cầu chế tạo các máy tính lớn ( mainframes ) và các siêu máy tính( supercomputers) Các vi xử lí thời này có bus địa chỉ đều là 32 bit ( phân biệt 4 GB bộ nhớ) và có khả
năng làm việc với bộ nhớ ảo Người ta cũng áp dụng các cơ chế hoặc các cấu trúc đã được sử dụng trong các máy tính lớn vào các bộ vi xử lí : cơ chế xử lý xen kẽ liên tục dòng mã lệnh( pipeline), bộ nhớ cache
(bộ nhớ ẩn), bộ nhớ ảo Các bộ vi xử lý này đều có bộ quản lý bộ nhớ(MMU) và nhiều khi cả các bộ đồng
xử lý toán học ở bên trong Chính nhờ các cải tiến đó mà các bộ vi xử lý thế hệ này có khả năng cạnh
tranh được với các máy tính nhỏ trong rất nhiều lĩnh vực ứng dụng Phần lớn các bộ vi xử lý thế hệ nàyđều được sản xuất bằng công nghệ HCMOS
Bên cạnh các bộ vi xử lý vạn năng truyền thống thường được dùng đẻ xây dựng các máy tính với tập
lệhn đầy đủ ( complex instruction set computer, CISC) đã nói ở trên, trong thời gian này cũng xuất hiện
các bộ vi xử lý cải tiến dùng để xây dựng các máy tính với tập lệnh rút gọn (reduced instruction set
computer, RÍC) với nhiều tính năng có thể so sánh với các máy tính lớn ở các thế hệ trước Đó là các bộ vi
xử lý Alpha của Digital, PowerPC của tổ hợp hãng Apple- Motorola- IBM Có lẽ hãy còn sớm, nhưngcũng đã có nhiều biểu hiện để có thể nói được rằng sự ra đời của các vi xử lý loại RISC chính là sự bắtđầu cho một thế hệ khác trong lịch sử phát triển của các thế hệ vi xử lý
3 Giới thiệu sơ lược cấu trúc và hoạt động của hệ vi xử lý
Trên đây bộ vi xử lý là một thành phần rất cơ bản không thiếu được để tạo nên máy vi tính Trongthực tế bộ vi xử lý còn phải có thể kết hợp thêm với các boịo phận điện tử khác như bộ nhớ và bộ phối
ghép vào/ra để tạo nên một hệ vi xử lý hoàn chỉnh Cần lưu ý rằng để chỉ một hệ thống có cấu trúc như
trên, thuật ngữ “hệ vi xử lý” mang ý nghĩa tổng quát hơn so với thuật ngữ “máy vi tính”, vì máy vi tính chỉ
là một ứng dụng cụ thể cảu hệ vi xử lý
Hình 2.1 giới thiệu sơ đồ khối tổng quát của một hệ vi xử lý
Trong sơ đồ naydf ta thấy rõ các khối chức năng chính của hệ vi xử lý gồm:
+ Khối xử lý trung tâm (central pgocessing unit,CPU)
+ Bộ nhớ bán dẫn (memory, M
+ Khối phối ghép với các thiết bị ngoại vi (input/ output,I/O)K
+ Các bus truyền thông tin.
Ba khối chức năng đầu liên hệ với nhau thông qua qập các đường day để truyền tín hiệu gọi chung
là Bus hệ thống Bus hệ thống bao gồm 3 bus thành phần Ứng với các tín hiệu địa chỉ, dữ liệu và điều khiển ta có bus địa chỉ, bus dữ liệu và bus điều khiển.
CPU đóng vai trò chủ đạo trong hệ vi xử lý Đây là một mạch vi điện tử có độ tích hợp rất cao Khi
hoạt động, nó đọc mã lệnh được ghi dưới fạng các bit 0 và bit 1 từ bộ nhớ, sau đó nó sẽ giải mã các lệnh này thành các dãy xung điều khiển ứng với các thao tác trong lẹnh để điều khiển các khối khác thực hiện
từng bước các thao tác đó Để làm được việc này bên trong CPU có thanh ghi dùng để chứa địa chỉ của
lệnh sắp thực hiện gọi là thanh ghi con trỏ lệnh (instruction pointer,IP) hoặc bộ đếm chương trình
(program cuonter,PC), một số thanh ghi đa năng khác cùng bộ tính toán số học và logic (ALU) để thao tác
với dữ liệu Ngoài ra ở đây còn có các hệ thống mạch điện tử rất phức tạp để giải mã lệnh và từ đó tạo ra
các xung điều khiển cho toàn hệ
Bộ nhớ bán dẫn hay còn gọi là bộ nhớ trong là một bộ phận khác rất quan trọng của hệ vi xử lý.Tại
đây (trong ROM) ta có thể chứa chương trình điều khiển hoạt động của toàn hệ để khi bật điện thì CPU có
Trang 15thể lấy lệnh từ đây mà khửoi đầu hệ thống Một phần của chương trình điều khiển hệ thống, các chuiươngtrình ứng dụng , dữ liệu cùng các kết quả của chương trình thường được để trong RAM Các dữ liệu vàchương trình muốn lưu trữ lâu dài sẽ được để ở bộ nhớ ngoài.
Khối phối ghép vào/ra (I/O) tạo ra khả năng gaio tiếp giữa hệ vi xử lý với thế giới bên ngoài Các
thiết bị ngoại vi như bàn phím, chuột, màn hình, máy in, chuyển đổi số tương tự (D/A converter, DAC) vàchuyển đổi tương tự / số (A/D converter, ADC)., ổ đĩa từ đều liên hệ với hệ vi xử lý qua bộ phận này
Bộ phận phối ghép cụ thể giữa bus hệ thống với thế giới bên ngoài thường được gọi là cổng Như vậy tra
sẽ có các cổng vào để lấy thông tin từ ngoài vào và các cổng ra để đưa thông tin từ trong ra ngoài Tùy
theo nhu cầu cụ thể của công việc, các mạch cổng này có thể được xây dựng từ các mạch lôgic đơngiản hoặc từ các vi mạch chuyên dụng lập trình được
Bus địa chỉ thường có từ 16, 20,24 đến 32 đường dây song song chuyển tải thông tin của các bit địa
chỉ Khi đọc/ghi bộ nhớ CPU sẽ đưa ra trên bus này địa chỉ của o nhớ liên quan Khả năng phân biệt địa
chỉ (số lượng địa chỉ cho ô nhớ mà CPU có khả năng phân biệt được) phụ thuộc vào số bit của bus địa chỉ.
bit địa chỉ tương uéng của cổng Trên sơ đồ khối ta dễ nhận ra tính một chiều của bus địa chỉ qua một
chiều của mũi tên Chỉ có CPU mới có khả năng đưa ra địa chỉ trên bus địa chỉ( sau này ta sẽ thấy cònmạch DMAC, mạch điều khiển trao đổi dữ liệu trực tiếp giữa bộ nhớ - thiết bị ngoại vi cũng có khả năngnày)
Bus dữ liệu thường có từ 8,16,20,24,32 đến 64 đường dây tùy theo các bộ vi xử lý cụ thể Số lượng
đường dây này quyết định số bit dữ liệu mà CPU có khả năng xử ký cùng một lúc Chiều mũi tên trên sus
số liệu chỉ ra rằng đây là bus 2 chiều., nghĩa là dữ liệu có thể truyền đi từ CPU (dữ liệu ra) hoặc truyền đến CPU (dữ liệu vào) Các phần tử có đầu ra nối thẳng với bus dữ liệu đều phải được trang bị đầu ra 3
tạng thái để có thể ghép vào được và hoạt động binbhf thường với bus này.
Bus điều khiển thường gồm hàng chục đường dây tín hiệu khác nhau Mỗi tín hiệu điều khiển có một chiều nhất định Vì khi hoạt động CPU đưa tín hiệu điều khiển tới các khối khác trong hệ, đồng thời nó
cũng nhận tín hiệu điều khiển từ các khối đó để phối hợp hoạtm dộng của toàn hệ nên các tín hiệu này trênhình vẽ được thể hiện bởi các đường có mũi tên 2 chiều, điều đó không phải là dể chỉ tính hai chiều củamột tín hiệu mà là tính hai chiều của cả một nhóm các tín hiệu
Hoạt đọng của hệ thống vi xử lý trên cũng xó thể nhìn theo một cách khác Trong khi hoạt động và
tại một thời điểm nhất định, về mặt chức năng mỗi khối trong hệ thống trên tương đương với các thanh
ghi trong ( nằm trong CPU) hoặc các thanh ghi ngoài (nằm rải rác trong bộ nhớ ROM, bộ nhớ RAM và
trong khối phối ghép I/O) Hoạt động của toàn hệ thực chất là sự phối hợp hoạt động của các thanh ghi
trong và cngoài nói trên để thực hiện sự biến đổi dữ liệu hoặc sự trao đổi dữ liệu theo các yêu cầu đã
định trước
Trang 16đó một khi đã nắm được các vấn đề kỷ thuật của8088, ta sẽ có cơ sở để nắm bắt 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ìmhiể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ảu bộ vi xử lý Intel 8088:
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 interface unit, BIU ) vàkhối thực hiện lệnh ( execution unit, EU ) Việc chia CPU ra thành 2 phần làm
việc đồng thời có liên hệ với nhau qua đệm lệnh làm tăng đáng kể tốc độ xử lý của CPU Các bus bêntrong CPU có nhiệm vụ chuyển tải tín hiệu của các khối khác Trong số các bus đó có bus dữ liệu 16 bitcủ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 ngoàihoặc đivào 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 phối ghép
BIU đưa ra địa chỉ, đọc mã lệnh từ bộ nhớ, đọc / ghi dữ liệu từ vào cổng hoặc bộ nhớ Nói cáchkhá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 này có mạch giải mã lệnh Mã lệnh đọc vào từ bộ nhớ được đưa đến đầu vào 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à tu thu được cácdã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 ngoài
CPU Trong khối EU còn có khối số học và lôgic ( arithmetic anh 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 này đọc lệnh và dữ liệu, còn bản thân nó thì đọc lệnh và giải mã 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 tài liệu của Intel bộ đệm lệnh này còn được gọi là hàng đợi lệnh ) Đây là một cấu trúc mới được cấy vào bộ vi xử lý 8086x88 do việc Intel đưa cơ chế xử lý xen kẻ liên tục,
dòng mã lệnh ( instruction pipelining ) vào ứ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 từ các máy lớn Nhân đây ta sẽ giới thiệu sơ qua một chút về cơchế này
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ủaCPU gồm 3 giai đoạn: đọc mã lệnh ( ôpcde fetch ), giải mã lệnh ( đecode ) và thực hiện lệnh ( execution ).Trong một thời điểm nhất định, CPU thế hệ này 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 nhàn rỗi Chẳng hạn, khiCPU 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ì
Trang 17F1 D1 E1 F2 D2 E2 F3 D3 E3 Không có pipelining
các bus không được dùng vào việc gì dẫn đến tình trạng lãng phí khả năng của chúng ( hình 3.2 ) Trongkhi đó 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 chiathành 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ệcgiả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 này có khả năng làm việcđồng thời và các bus sẽ liên tục sử dụng: trong khi EU lấy mã lệnh từ bộ đệm 4 byte để giải mã hoặc thựchiệ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 vào bộ nhớ đệm
lệnh đã nói Bộ đệm lệnh này làm việc theo kiểu “ vào trước – ra trước “ (first in-first out, FIFO ), nghĩa
là byte nào được cất vào đệm trước sẽ được lấy ra xử lý trước Nếu có sự vào/ra liên tục của dòng mã lệnhtrong bộ đệm này thì có nghĩa là có sự phối hợp hoạt động hiệu quả giữa hai khối EU và BIU theo cơ chế
xử lý xen kẻ liên tục dòng mã lệnh để làm 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 các lệnh này nội dungcủa bộ đệm sẽ bị xoá và thay thế vào đó là nội dung mới được nạp bởi các mã lệnh mới do lệnh nhảy hoặcgọi quyết định Việc này 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áclệnh tuần tự
Trong bộ vi xử lý 8088 ta còn thắy có các thanh ghi 16 bit nằm trong cả hai khối BIU và EU,ngoài 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êncùng chức năng chính của chúng
*Các thanh ghi đoạn
= 1.048.576 = 1M ô nhớ hay 1Mbyte, vì các bộ nhớ nói chung tổ chức theo byte Nói cách khác: khônggian địa chỉ của 8088 là 1Mbyte Trong không gian 1Mbyte bộ nhớ cần được chia thành các vùng khácnhau ( điều này rất 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ả không gian của chương trình
Tạo ra một 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ộ 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ữ liệu DS ( Data sement ) Thanh ghi đoạn ngăn xếp SS ( Stacksegment ) và thanh ghi đoạn dữ liệu phụ ES ( Extra segment ) Các thanh ghi đoạn 16 bit này chỉ ra địa chỉđầu của bốn đoạn trong bộ nhớ, dung lượng lớn nhất của mỗi đoạn nhớ này là 64 Kbyte và tại một thờiđiểm nhất định bộ vi xử lý chỉ làm việc được với bốn đoạn nhớ 64 Kbyte này Việc thay đổi giá trị của cácthanh ghi đoạn làm cho các đoạn có thể dịch chuyển linh hoạt trong phạm vi không gian 1 Mbyte, vì vậycác đoạn này có thể nằm cách nhau khi thông tin cần lưu trong chúng đòi hỏi dung lượng đủ 64 Kbytehoặc cũng có thể nằm trùm nhau do có những đoạn không cần dùng hết đoạn dài 64 Kbyte và vì vậy
Trang 18những đoạn khác có thể bắt đầu nối tiếp ngay sau đó Điều này cũng cho phép ta truy nhập vào bất kỳđoạn nhớ ( 64 Kbyte ) nào nằm trong toàn bộ không gian 1 Kbyte.
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ỉ này 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 vào đị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ể nào đó so với ô đầu đoạn Độ lệch này được xác định bởi các thanh ghi 16 bit khác đóngvai 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ủamột ô nhớ nào đó trong một đoạn bất kỳ CPU 8088 phải dùng đến 2 thanh ghi 16 bit ( một thanh ghi để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 đó tạo ra địa chỉ vật lýtheo công thức sau:
Địachỉvậtlý=Thanhghiđoanx16+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
trông CPU và ghi cần thiết truy cập ô nhớ nào đó thì nó phải được đổi ra địa chỉ vật lý để rồi được đưa lê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ã Tại một thời điểm nào
đó ta có CS = F00H và IP = FFFOH thì
CS:IP~FOOOHx16 + FFFOH = FOOOOH + FFFOH = FFFFOH
Địa chỉ FFFFOH chính là địa chỉ khởi động của 8088 dấu ~ ở đây là để chỉ sự tương ứng Địachỉ 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 cả địa chỉ logic lẫn địa chỉ vật lý vì bao giờ cũng tồn tại
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 này 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 vào 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
*Các thanh ghi đa năng
trong khối EU có bốn thanh ghi đa năng 16 bit AX, BX, CX, DX Điều đặc biệt là khi cần chứacác dữ liệu 8 bit thì mỗi thanh ghi có thể tách ra thành hai thanh ghi 8 bit cao và thấp để làm việc độc lập,
đó là các tập thanh ghi AH và AL, BH và BL, CH và CL, DH và DL ( trong đó H chỉ phần cao, L chỉ phầnthấp ) Mỗi thanh ghi có thể dùng một cách vạn năng để chứa các tập dữ liệu khác nhau nhưng cũng cócông việc đặc biệt nhất định chỉ thao tác với một vài thanh ghi nào đó và chính vì vậy các thanh ghithường được gan 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 qủa của các thao tác thường được chứa ở đây ( kết quả của
Trang 19Các cờ của bộ vi xử lý 8086
X : Không được định nghĩa
chữ ci thường ở cột 6,7 Hình 3.3 Sơ đồ thanh ghi cờ của bộ vi xử lý 8086/88
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 cho ta 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 BX tham gia các thao tác của phép nhân hoặc chia các số 16 bit
DX thường 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
*Các thanh ghi con trỏ và chỉ số
Trong 8088 còn có ba thanh ghi con trỏ và hai thanh ghi chỉ số 16 bit Các thanh ghi này ( trừ
IP ) đều có thể được dùng như các thanh ghi đa năng, nhưng ứ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ể:
nằm trong đoạn mã CS Địa chỉ đầy đủ của lệnh tiếp theo này ứng với CS:IP và được xác định theo cách
đã nói ở trên
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
trong đoạn ngăn xếp SS Địa chỉ đỉnh ngăn xếp ứng với SS:SP và được xác định theo cách đã nói ở trên
địa chỉ cụ thể đầy đủ ứng với DS:SI và được xác định theo cách đã nói ở trên
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 thoa 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áinhấ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 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 nhảy 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ờ ( hình 3.3 )
Các cờ cụ thể
C hoặc CF ( carry flag ): cờ nhớ CF = 1 khi có nhớ hoặc muợn từ MSSP
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 trong kết quả là chẵn ( even parity, parity chẵn ) Ơđây ta tạm dùng parity dạng
nguyên gốc để tránh sự lủng củng khi phải dịch cụm từ “ even parity “ thành tính chẵn lẻ chẵn hoặc “ odd
party “ thành tính chẵn lẻ lẻ.
A hoặc AF ( auxilialyry carry flag ): cờ nhớ phụ rất có ý nghĩa khi ta làm việc với các số BCD.AF = 1 khi
có nhớ hoặc muợ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ả = 0
S hoặc SF ( sign flag ): cờ dấu SF = 1 khi kết quả âm
O hoặc OF ( over flow flag ): cò tràn OF = 1 khi kết quả là một số bù 2 vượt qua ngoài giới hạn biểu diễndành cho nó
Trang 20Chế độ MIN VI6 AI5 AI6/S3 AI7/S4 AI8/S5 AI9/S6 SS0 MN/MN RD HOLD WR IO/M DT7R DEN ARE ININ IIST READY RESET
Chế độ MAX
BIH
(RQ/GT0) (RQ/GH) (LOCK) (S2) (S1) (S0) (QS0) (QS1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
P 8088 [8086]
GND A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INRT CLK GND
AD14 AD13 AD12 AD11 AD10 AD00 AD91 AD81
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 sau một thao tác nào đó,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 Ngoài ra, bộ vi xử lý
8088 còn có các cờ điều khiển sau đây ( các cờ này đượ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 làm việc ở chế độ chạy từng lệnh ( chế độ này dùng khicầ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 làm việc với chuổi ký tự theo thứ tự từ phải sangtrái ( vì vậy D chính là cờ lùi )
Ý nghĩa của các cờ đã khá rõ ràng Riêng cờ tràn cần phải làm rõ hơn để ta hiểu được bản chất và
cơ chế làm việc của nó Cờ tràn thường được dùng đến khi ta làm việc với số bù 2 có dấu Để cho việcgiải thích được đơn giản, đầu tiên giả thiết ta làm việc với số bù 2 dài 8 bit, kết quả để ở AL ( xem hình
sau:
Nghĩa là khi thực hiện các phép toán với số bù 2 có dấu, hiện tượng tràn sẽ xảy ra ( cờ OF = 1 )nếu có nhớ từ MSB ( tất là SF ) sang CF nhưng lại không có nhớ vào chính nó ( SF ) hoặc ngược lại Điềunày có thể tổng quát hoá cho các trường hợp làm việc với số bù 2 có dấu với độ dài 16/32 bit
[Type text] Trang
Trang 21Trước khi kết thúc phần mô tả cấu trúc của bộ vi xử lý để đi vào giới thiêu tập lệnh của 8088 tanói qua một chút về sự giống nhau vàkhác nhau giữa 8088 và 8086 là bộ vi xử lý 16 bit hoàn chỉnh, còn
8088 là bộ vi xử lý với 16 bit dữ liệu bên trong ( giống như 8086 ), nhưng khi ra ngoài bus dữ liệu của nóchỉ còn 8 bit Cấu trúc bên trong của 8088 và 8086 giống nhau về cơ bản, ngoài trừ hai điểm Điểm khácnhau đầu tiên là ở độ dài bộ nhớ đệm lệnh ( hàng đợi lệnh ) độ dài này ở 8088 là 4 byte còn ở 8086 là 6byte; điều này sẽ có ảnh hưởng ít nhiều đến sự khác biệt về sự tốc độ xử lý của hai bộ CPU Điểm khácnhau 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ácthanh ghi của hai bộ CPU vẫn có độ dài như nhau Điều này có ảnh hưởng nhiều đến công năng( Perfomance ) và giá thành của hệ thống xây dựng trên cơ sở các bộ vi xử lý này Đối với 8086 do bus dữliệu là 16 bit nó có thể đọc/ghi được một từ nằm ở hai ô nhớ thẳng hàng ( một từ trong bộ nhớ được coi làxếp thẳng hàng khi ở địa chỉ chẵn làbyte thấp, ở địa chỉ lẻ là byte cao ) trong một chu kỳ đọc/ghi: còn ở
8088 do bus dữ liệu chỉ có 8 bit nên đọc/ghi một từ nằm ở hai ô nhớ thẳng hàng ( nằm liên tiếp như trên )
nó phải thực hiện trong hai chu kỳ đọc/ghi Bù lại nhược điểm về tốc độ, 8088 có giá rẻ vàdùng để tạo racá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 hành 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 ở hai vi mạch như trênhì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 V )
Mặc dù có những điểm khác nhau đã nêu, nhưng vì những điểm giống nhau là rất cơ bản và vìhai 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ủabộ vi xử lý 8088
Trang 22Di chuyển trực tiếp phần thấp Di chuyển trực tiếp phần cao
Hình 3.6 Dạng thức Byte mã lệnh của lệnh MOV
Lệnh củabộ vi xử lý được ghi bằng các ký tự dưới dạng gợi nhớ ( memonic ) để người sử dụng
để 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 do bộ vi xử lý được chodưới dạng mã nên sau khi nhận lệnh., bộ vi xử lý phải thực hiện việc giải mã lệnh rồi sau đó mới thực hiệnlênh Việc hiểu rõ bản chất cách ghi lệnh bằng số hệ 2 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 làm việc với các “ kit “ vi xử lý ( tuy rằng việc này ít khi xảy ra vì ta thường làmviệ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ó độ dài một vài byte tuỳ theo bộ vi xử lý Giả thiết một bộ vi xử lý nào đó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 này cóthể mã hoá được là 256 lệnh Trong thực tế việc ghi lệnh không phải hoàn toàn đơ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ó độ dài từ 1 đến 6 byte Ta sẽ chỉ lấy trường hợp lệnhMOV để giải thích cách ghi lệnh nói chung của 8088
Lệnh MOV đích, gốc dùng để nguyển dữ liệu giữa 2 thanh ghi hoặc giữa 2 ô 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 vào các vị trí toán hạng đích và toánhạng gốc ta thấy đã phải cần tới hàng trăm mà lệnh khác nhau để mã hoá tổ hợp các lệnh này
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áclệnh MOV Để chuyển dữ liệu kiểu:
thì điều này lại khác
Bit W dùng để chỉ ra rằng 1 byte (W = 0 ) hoặc 1 từ ( W = 1 ) sẽ được chuyển
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:
Trang 23Thanh ghi Mã
W = 1 AX PX CX DX SP DI BP SI
W = 0 AL BL CL DL AH BH CH DH
000 011 001 010 100 111 101 110
CS DS ES SS
01 11 00 10
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 b 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ế độ địachỉ cho các toán hạng của lệnh ( có thể hiểu chế độ địa chỉ là cách tìm ra địa chỉ của toán hạng, xem thêmphần sau của chương này để 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 này ) MOD
Ghi chú : - disp , 8bit ,d16: disp , 16bit
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ộngvớ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 vài lệnh MOV
Trang 241111 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 MOV CL ,[BX]
Opcode Chuyển tới thanh ghi
Chuyển 1 byte
mã hoá CL [ BX]
có 7 chế độ địa chỉ sau:
1 Chế độ địa chỉ thanh gi ( 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 indexed 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ỉ này sẽ được giải thích thông qua các chế độ địa chỉcủa lệnh MOV và lệnhADD
*chế độ địa chỉ thanh ghi
Trong chế độ địa chỉ này 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 hon so với các lệnh có truynhập đên bộ nhớ
Ví dụ:
MOV BX, DX ; chuyển nội dung DX vào BX
MOV DS,AX ; chuyển nội dung AX vào DX
ADD AL,DL ; cộng nội dung AL và DL rồi đưa vào
*Chế độ địa chỉ tức thì
trong chế độ địa chỉ này 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 này ở ngay sau mã lệnh ( chính vì vậy chế độ địa chỉ này cótên là chế độ địa chỉ tức thì ) Ta có thể dùng chế độ địa chỉ này để nạp dữ liệu cần thao tác vào bất kỳthanh ghi nào ( trừ các thanh ghi đoạn và thanh cờ ) hoặc vào bất kỳ ô nhớ nào trong đoạn dữ liệu DS
Ví dụ:
MOV CL, 100 ; chuyển 100 vào CL
Trang 25MOV AX, OFFOH ; chuyển OFFOH vào AX để rồi đưa
MOV DS, AX ; vào DS ( vì không thể chuyển
; trực tiếp vào thanh ghi đoạn )
MOV ( BX ), 10 ; chỉ DS:BX
Trong ví 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ó địachỉ DS:BX
*Chế độ địa chỉ trực tiếp
Trong chế độ địa chỉ này một toán hạng chứa địa chỉ lệnh của ô nhớ dùng chứa dữ liệu còn toánhạ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
*Chế độ gián tiếp qua thanh ghi
Trong chế độ địa chỉ này 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 chophép quy chiếu bộ nhớ 2 lần đối với một lệnh )
MOV ( DI ), AX ; chuyển nội dung AX vào 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ỉ này 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+10 ) vào CX
MOV CX, ( BX+10 ) ; một cách viết khác của lệnh trên
MOV CX, 10 ( BX ) ; một cách viết khác của lệnh đầu
MOV AL, ( BP ) +5 ; chuyển nội dung ô nhớ SS: ( BP+5 )
; vào AL
ADD AL, Table ( BX ) ; cộng AL với nội dung ô nhớ do
; BX chỉ ra trong bảng table
; ( bảng này nằm trong DS ), kết
; quả dựa vào AL
Nhân đây cần làm rõ một số thuật ngữ hay dùng thông qua các ví dụ trên
Trang 26 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ênmảng biểu diễn kiểu 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 ( BJP+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 này thì địa chỉ hiệu dụng của một phần tử thứ BX nào đó ( kể từ 0 ) trong mảngTable ( 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ố 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ỉnày 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ảthành 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ỉ này rất phù hợp cho việc dịa chỉ hoá các mảng haichiề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 ) vào AX
MOV AX, [BX+SI+8] ; một 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 ) vào CL
*Tổng kết các chế độ địa chỉ
Các chế địa chỉ đã trình bày ở 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ủa chế độ địa chỉ của 8086/88 được biểu diễn trrrn hình 3.7
*Phương pháp bỏ ngầm định thanh ghi đoạn ( segment override )
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èmvới nhau từng cặp dùng để địa chỉhoá các toán hạng teong các vùng khác nhau vủa bộ nhỡ.Bảng 3.3 chỉ racác khả năng cặp đôi ngầm định của cácthan ghi đoạn và thanh ghi lệch thưồng dung Vì tính ngầm địnhnày nểntong các lệnh ta chỉ cần viểta cấctnh thanh ghi lệch là đủ cơ sở để tính ra được đia chỉ của toànhạng
Tuy nhiên, ngoài các tổ hợp ngầm định đã kể, 8088 còn cho phép ta làm việc với các tổ hợpngầm định đã kể, 8088 còn cho phép ta làm việc với các tổ hợp khác của các thanh ghi đoạn và thanh ghilệch Muốn loại vỏ các tổ hợp ngầm định nói trên, trung 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 này goik là cụm tiếp đầu để lại
bỏ thanh ghi đoạn ngầm đinhj (segmnent override prefix) và để dạt được ivệc loại bỏ này chỉ cần ghi rõthanh ghi đoạn
Bảng 3.2 : Tóm tắt các chế độ địa chỉ
[BP] +DISP
DSSS
Trang 27Dịch chuyển
Địa chỉ vật lý
CSx16
DSx16 SSx16
ESx16
BX
BP DI
hoặc
hoặc
hoặc hoặc Chế độ cơ sở hoặc chỉ số Chế độ chỉ số cơ sở
Hình 3.7 : một hình thức khác tổng kết các chế độ địa chỉ của 8088
[SI]+ DISP
DSDS
[BX]+[SI]+DISP[BP]+[DI]+DISP[BP]+[SI]+DISP
DSDSSSSS(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
Ví dụ:
Trong lệnh chuyển dữ liệu thỉ địa chỉ vật lý của toán hạng để chuyển vào thanh ghi AL, tươngứng với DS:BX, vì DS sà đoạn ngầm định cuarvùng nhớ chứatoá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 ,mà lại lấy toán hạng traong đoạn dữ liệu phụ ES dể đưavào AL,thì ta phải viết lại lệnh trên thành
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õthanh ghi đoạn mới dùng trong lệnh nayf bây giờ là ES
Trang 284 Mô tả tập lệnhcủa bộ vi xử lý 8088.
Có nhiều cánh trình bày tập lệnh của bộ vi xử lý:Trình bày cac lệnh cho các nhóm hoặc theo thứ
tự ABC Ta sẻ chọn cách làm thứ 2 để sau này dễ tìm kiếm cac lệnh cần tra cứu cụ thể.Trong khi nói tớicác lệnh ở dạng gợi nhớ tacũng mô tả ngắn gon luôn từng lệnh và tác động (nếu có) của lệnh tới cac cờ.Đểcho các diển giải dể đọc ta quy định kí hiệu AL được hiểu là thanh ghi AL hoặc là nội dung của AL.Trongkhi ghi lệnh ,dấu[ X] nên được hiểu như là một ki 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ủangă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 hai 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 dãtruyền đi các số dưới dạng ASCII roòi,đôi khi ta muốn cộng luôn các số đó.Bộ vi xử lý 8088 cho phep talàm điều này 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ó 2 số dưới dạng mã ASCII là 30H và 39H ứng với ‘ 0 ‘ và ‘ 9 ‘
Nếu cộng hai số ở dạng mã lại ta được số 69H.Số náy không có ý nghĩa gì vì nó không phải la 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 này đổi 2 số BCD khônbg gói ở AH và AL sang số hệ 2 tương đương để tại Al.Viêc nàyphải thưc hiện trước khi làm phép chia một số BCD không gói( gồm 2 chữ số ) để trong AX cho 1 số BCDkhông gói khác.Kết quả và số dư cũng là cac số BCD không gói
AAD ;sau khi chỉnh AX = 0041 = 41H
DIV BL;sau khi chia đươc thương AL = 08
;số dư ở AH = 1 là số BCD không gói ,
AAM_ASCII Adjust After Mult iplication (Chỉnh sau khi nhân 2 số ở dạng ASCII )
Lệnh này dung để đổi 1 số hệ 2,là tích của 2 số BCD không gói ,có trong AL sang số BCDkhông gói để tại AX
Trang 29MUL BL; thu được AX = 002DH = 45,
AAM; thu được AX = 0405H, mã BCD
;không nen 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-ASCH Adjust after Subtraction ( chỉnh sau khi trừ 2 số ở dạng ASCH )
Lệnh này dùng để đổi một số hệ hai là hiệu của 2 số BCD không gói, có ở AL sang số BCDkhông gói
SUB AL, BL ; thu được AL = 04H = 4,
AAC ; thu được AL = 04H, mã BCD không
; gói của 4
OR AL, 30H ; thu được AL = 34H, mã ASCII cho 4
; để truyển kết qủa trở lại thiết bị
; đầu cuối
b) ; AL = 0011 0101B = 35H = ‘5’,
; BL = 0011 1001B = 39H = ‘ 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
Cập nhật: AF, CF, PF, SF, ZP/
AND-And Corresponding Bits of Two Operands ( Và 2 toán hạng )
Viết lệnh: AND Đích, Gốc
Trang 30Mô tả: Đích - Đích, Gốc.
Trong đó toán hạng đích và gốc có thể tìm được thoe các chế độ địa chỉ khác nhau Nhưng phảichứa dữ liệu cùng độ dài 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 vài bit nào đó của một toán hạng bằng cách nhân logic toánhạ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 này 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: À.
Ví dụ:
AND AL, BL ; AL , AL BL theo từng bit
AND OFH ; che 4 bit cao của BL
CALL-Call o Proceduce ( Gọi chương trình con )
Mô tả:
Lệnh này 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ì tra 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ác 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ặplệnh RET ( trở về CTC từ ctc ) tại cuối ctc
Viết lệnh: Sau đây là ví dụ các dạng khác nhau của 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 này phải nằm
trong giới hạn đích chuyển-32Kbyte ( dịch về phái đị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ề ) vào ngăng xếp IP mớiđược tính: IP –IP + Dịch chuyển
CALL Divi: Gọi ctc có tên Divi ở đạon 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
Đại chỉ của ctc là đại chỉ CS:IP cảu Divi
CALL WORD PTR [ BX ]: Gọi ctc nằm trong cùng đạon 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 này sẽ đưa vào IP ( SI, DI có thể dùng thay chỗ của BX )
CALL DWORD PTR [ BX ]: Gọi ctc không nằm trongcù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ỉ ratrong đoạn DS ( SI, DI có thể dùng thay chỗ của BX )
CBW-Convert a Byte to a Word ( Chuyển byte thành từ )
Lệnh này mở rộng bit dấu của AL sang 8 bit của AH, AH lúc này được gọi là phần mở rộng dấucuả 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 này không tác động đến các cờ
Ví dụ: Nếu AL = 80 thì sau lệnh chuyển ta có AX = PF80H
CLC-Clear the Carry Flag ( xoá cờ nhớ )
Mô tả: CF – 0.
Trang 31Mô tả: Chuổiđích – Chuổigốc.
Lệnh này 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ạocác cờ, không lưu 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 này 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 trongchuỗi đích
Ta sẽ giải thích cụ thể các trường hợp dùng các dạng lệnh trên Giải thích này cũng có thể ápdụng cho cáclện có dạng thức lện hoặc cấu trúc ngữ pháp ương tự
MOVS, STOS, LODS, SCAS
Có 2 cách để chỉ ra một chuỗi là chuỗi byte hoặc chuỗi từ Cách đầu tiên là ta khai rõbằng ten ngay từ đầu chuỗi nguồn và chuỗi đích là loại gì Sau đó ta dùng lệnh COMPS để thao tácvới các chuỗi đó
StrByte1 DB “daylachuoibyte1”
StrByte2 DB “ daylachuoibyte2”
Trang 32StrWord1 DW “ daylachuoitư1”
StrWord1 DW “daylachuoitu2”
LEA SI, StrByte1 LEA DI, StrByte2 COMPS StrWord2, StrWord1 ;có thể thay ; bằng MOMPSB
Cách ths hai là ta thêm vào lệnh CMPS đuôi thích hoẹp để báo cho chương trình dịch biết kiểuthao tác trên chuỗi đã được định nghĩa: đuôi “B” để thao tác với byte hoặc đuôi “W”để thao tác với từtrong chuỗi
Cập nhật: AF, CF, OF, PF, SF, ZP.
Ví dụ:
MOV DI, OFFSET chuỗiđích ; lấy địa chỉ lệch
; của chuỗiđích tại
; ES vào SI,
MOV SI, OFFSET chuỗigốc ; lấy địa chỉ lệch
; của chuỗigốc tại
CWD-Convert a Word to a DoubleWord ( chuyển từ thành từ kép )
Lệnh này mở rộng bit dấu của AX sang 16 bit của DX DX lúc này được gọi là phần mở rộngdấu của AX Ta dùng CWD để mở rộng dấu cho số có dấu nằm trong AX trước khi muốn chia nó cho một
số có dấu khác bằng lệnh IDIV
Lệnh này không tác động đến các cờ.
Ví dụ: nếu DX = 0000H AX = 8087H thì sau lệnh đổi ta có:
DX = FFFFH, AX = 8086H
DAA-Decimal Adjust AL after BCD Addition ( chỉnh AL sau khi cộng số BCD )
Lệnh này dùng để chỉnh lại kết quả ( hiện nằm ở AL ) sau phép cộng 2 số BCD Lý do phảichỉnh lại kết quả này là do ta đã dùng bộ ALU của XPU, cốn chỉ biết làm toán với các số hệ hai Để làmotán với các số VCD, lệnh DÂ chỉ tác độ đúng đến kết quả ở AL ngay sau khi vừa thực hiện phép cộng.Hoạt động của lệnh DAA:
+Nếu 4 bit thấp cảu AL lớn hơn 9 hoặc AF = 1 thì AL – AL + 6
+Nếu 4 bit cao của AL lớn hơn 9 hoặc CF = 1 thì AL – AL + 60H
Trang 33; AL + 60H +6 = 1001 0000BCD = 36,CF = 1.
DAS- Decimal Adjust AL after BCD Subtraction ( chỉnh AL sau khi trừ 2 số BCD )
Lệnh này dùng để chỉnh lại kết quả ( hiện nằm ở AL ) sau phép trừ 2 số BCD Lý do phải chỉnhlại kết qủ này là do ta đã dùng bộ ALU của CPU, vốn chỉ biết làm toán với các số hệ hưi, để làm toán vcớicác số BCD Lệnh DAS chỉ tác động đúng đến kết quả ở AL ngay sau khi vừa thực hiện phép trừ Hoạtđộng của lệnh DAS:
+Nếu 4 bit thấp của AL lớn hơn 9 hoặc AF = 1 thì AL – AL.6
+Nếu 4 bit cao của AL lớn hơn 9 hoặc CF = 1 thì AL – AL.60H
Trong thí dụ trên CF = 1 có nghĩa là phải mượn 100 thêm vào số bị trừ để được kết quả là 99.Nói cách khác đi kết quả đúng sẽ là -1
DEC – Decrement Destination Register or Memory ( Giảm toán hạng đi 1 ).
Viết lệnh : DEC Destination
Mô tả: Đích – Đích -1.
Trong đó toán hạng đích có thể tìm đựoc thưo các chế độ địa chỉ khác nhau Lưu ý là nếu Đích =00H ( hoặc 0000H ) thì Đích -1 = FFH ( hoặc FFFFH ) mà không làm ảnh hưởng đến cờ CF Lệnh nàycho kết quả tương đương như lệnh SUB Đích nhưng chạy nhanh hơn
Cập nhật: AF, OF, PF, SF, ZP.
Không tác động: CF/
DIV – Unsingned Divide ( chia 2 số không có dấu )
Viết lệnh: DIV Gốc
Trong đó toán hạng Gốc là số chia và có thể tìm được theo các chế độ địa chỉ khác nhau
Mô tả: tuỳ theo độ dài của toán hạng gốc ta có 2 trường hợp bố trí phép chia Các chỗ để ngầm
định cho số bị chia và kết quả:
Nếu Gốc là số 8 bit: AX/Gốc Số bị chia phải là số không dấu 16 bit để trong AX
Nếu Gốc là số 16 bit: DXAX/Gốc Số bị chia phải là số không dấu 32 bit để trong cặp thanh ghi DXAX
Nếu thương không phải là số nguyên nó được làm tròn theo số nguyên sát đuôi
Nếu Gốc = 0 hoặc thương thu được lớn hơn FFH hoặc FFFFH ( tuỳ theo độ dài của toán hạngGốc ) thì 8088 thực hiện lệnh ngắt INT 0
Không xác định: AF, CF, OF, PF, SF, ZP.
ESC – Escape
Lệnh này dùng để truyêng các lệnh cho bộ đồng xử lý toán học 8087 bị tạm dừng và bộ vi xử lý
8088 bước vào trạng thái dừng Để thoát khỏi trạng thái dừng chỉ có cách tác động vào một trong các
chân INTR.NMI hoặc RESET của bộ vi xử lý
IDIV – Integer Division ( Signed division ) ( chia số có dấu )
Viết lệnh: IDIV Gốc
Trong đó toán hạng Gốc là số chia và có thể tìm được theo các chế độ địa chỉ khác nhau.
Đây là lệnh dùng để chia các số nguyên có dấu Chỗ để ngầm định của số chia Số bị chia.Thương và số dư giống như ở lệnh DIV chỉ có 2 điều khác là:
+Sau phép chia AL chứa thương ( số có dấu ) AH chứa số dư ( số có dấu )
Trang 34+Dấu của số có dư sẽ trùng với dấu của số bị chia.
+Nếu Gốc = 0 hoặc thương nằm ngoài dải.128…+ 127 hoặc -32768…+32767 ( tuỳ theo độ dàicủa Gốc ) thì 8088 thực hiện lệnh ngắt INT 0
Không xác định: AF, CF, OF, PF, SF, ZP.
IMUL – Integer Multiplication ( Multiply Signed Numbers ) ( Nhân số có đầu ).
Viết lệnh: IMUL Gốc.
Trông dố toán hạng Gốc là số nhân và có thể tìm được theo các chế độ địa chỉ khác nhau.
Mô tả: tuỳ theo độ dài của toán hạng Gốc ta có 2 trương hợp bố trí phép nhân Chỗ để ngầm
định cho só bị nhân và kết quả:
Số bị nhân phải là số cso dấu 8 bit để trong AL
Số bị nhân phải là số có dấu 16 bit để trong AX
Nếu tích thu được nhỏ, không đủ lấp đầy hết được các chỗ dành cho nó thì các bit không dùngđến đựơc thay bằng bit dấu
Nếu byte cao ( hoặc 16 bit cao ) của 16 ( hoặc 32 bit ) kết quả chỉ chưa một giá trị của dấu thì CF
Nếu ta cần nhân một số có dấu 8 bit với một số có dấu 16 bit, ta để số 16 bit ở gốc và số 8 bit ở
AL Số 8 bit này ở AL cần phải được mở rộng dấu sang AH băng lệnh CBW Sau cùng chỉviệc dùng lệnhIMUL gốc và kết quả có trong cặp DXAX
Cập nhật:CF, OF.
Không xác đinh: AF, PF, FS, ZP.
In- Input Data From a Port ( đọc dữ liệu từ cổng vào thanh ACC.
Viết lệnh: In ACC, Port.
Mô tả: ACC <- {Port}.
các giá trị trong khoảng 00H…FFH Như vậy ta có thể có các khả năng sau:
+Nếu ACC là AL thì dữ liệu 8 bit được đưa vào từ cổng Port
+Nếu ACC là AX thì dữ liệu 16 bit được đưa vào từ cổng Port và cổng Port+1
Có một cách khác để biểu diển địa chỉ cổng là thông qua thanh ghi DX Khi dùng thanh ghi DX
để chứa địa chỉ cổng ta sẽ có khả năng địa chỉ cổng hoá mềm dẽo hơn Lúc này địa chỉ cổng nằm trong dải0000H FFFFH và ta phải viết lệnh theo dạng:
Cập nhật: AF, OF, PF, SF, ZP.
Trang 35hệ giữa CTC với ctc.
INTO-Interrupt On Overflow ( ngắt nếu có tràn ).
Nếu có tràn ( OF = 1 ) thì lệnh này ngắt công việc đang làm của vi xử lý và thực hiện lệnh ngắtINT 4
IRET-Interrupt Return ( trở về CTC từ chương trình ( Con ) phục vụ ngắt ).
Như đã trình bày ở lệnh CALL, tại cuối ctc phải có lệnh trở về ( RET ) để bộ vi xử lý tự động lấylại địa chỉ trở về CTC Trong trường hợp CTCPVN, để trở về CTC với đầy đủ thông tin cần thiết về địachỉ và trạng thái, tất nhiên phải cần có lệnh với các tác động tương ứng: lệnh IRET Lệnh này, ngoài việc
tự động lấy lại địa chỉ trở về CTC, còn lấy lại thanh ghi cờ đã được cất giữ trước khi chạy CTCPVN
JA/JNBE-Jump If Above/Jump If Not Below Or Equal ( nhảy nếu cao hơn/nhảy nếu không
thấp hơn hoặc bằng )
Viết lệnh: JA NHAN
JNBE NHAN
Mô tả IP ←IP → Dịchchuyển
Hai lệnh trên điều khiển cùng một thao tác Nhảy có điều kiện với nhản nếu CF+ZF = 0 Quan hệ “trên
“ (above),” cao hơn “ và quan hệ “dưới “ , “ thấp hơn” (below) là các quan hệ dành cho việc so sánh (dolệnh CMP thực hiện ) độ lớn của hai số không dấu Nhãn NHAN phải nằm cách xa (dịch chuyển mộtkhoảng )-128 +127byte so với lệnh tiếp theo sau lệnh A:/INBE Chương trình sẽ căn cứ vào giá trịchuyển để xác định các giá trị chuyển
Lệnh này không tác động đến các cờ
Vi dụ :Nếu 1 khung thanh AL cao hơn 10H thì nhảy lên nhãn TH01
CMP AL , 10H ; so sánh Al với 10H
UA THOI ; nhảy lên TH01 nếu Al cao hơn
4AE/JNB/4NC – 4jump if Above or Equal /jump if not below /jump if no carry ( nhảy nếu cao hơn
hoặc bằng / nhảy nếu thấp hơn / nhảy nếu không có nhỏ )
Trang 36IP ←IP → Dịchchuyển
Ba lệnh trên đều thực hiện cùng một thao tác : nhảy có điều kiện tới NHAN nếu CF = 0 Quan hệ
“trên “ (above),” cao hơn “ và quan hệ “dưới “ , “ thấp hơn” (below) là các quan hệ dành cho việc so sánh(do lệnh CMP thực hiện ) độ lớn của hai số không dấu Nhãn NHAN phải nằm cách xa (dịch chuyển mộtkhoảng )-128 +127byte so với lệnh tiếp theo sau lệnh A:/INBE Chương trình sẽ căn cứ vào giá trịchuyển để xác định các giá trị chuyển
Lệnh này không tác động đến các cờ
Ví dụ : Nếu nội dung thanh AL cao hơn hoặc bằng 10H thì nhảy đến nhãn THOI
JB/JC/JNAE - jump if Below/ Jump if Carry /Jump ì Not Above or Equal ( Nhảy thấp hơn / nhảy
nếu có / nhảy nếu không cao hơn hoặc bằng )
Viết lệnh
JB NHAN
JC NHAN JNAE NHAN
Ba lệnh trên đều thực hiện cùng một thao tác : nhảy có điều kiện tới NHAN nếu CF = 0 Quan hệ
“trên “ (above),” cao hơn “ và quan hệ “dưới “ , “ thấp hơn” (below) là các quan hệ dành cho việc so sánh(do lệnh CMP thực hiện ) độ lớn của hai số không dấu Nhãn NHAN phải nằm cách xa (dịch chuyển mộtkhoảng )-128 +127byte so với lệnh tiếp theo sau lệnh A:/INBE Chương trình sẽ căn cứ vào giá trịchuyển để xác định các giá trị chuyển
Lệnh này không tác động đến các cờ
Ví dụ : Nếu nội dung thanh AL thấp hơn hoặc bằng 10H thì nhảy đến nhãn THOI
CMP AL ,10H ; So sánh AL với 10H
JB THOI ; nhảy đến THOI nếu Al thấp hơn hoặc bằng 10H
JBE/JNA- jump if Below/ Jump if Carry /Jump ì Not Above or Equal ( Nhảy thấp hơn / nhảy nếu
có / nhảy nếu không cao hơn hoặc bằng )
IBA NHAN
Mô tả :
IP ←IP → Dịchchuyển
Hai lệnh trên đều thực hiện cùng một thao tác : nhảy có điều kiện tới NHAN nếu CF+ZF=1 Quan hệ
“trên “ (above),” cao hơn “ và quan hệ “dưới “ , “ thấp hơn” (below) là các quan hệ dành cho việc so sánh(do lệnh CMP thực hiện ) độ lớn của hai số không dấu Nhãn NHAN phải nằm cách xa (dịch chuyển mộtkhoảng )-128 +127byte so với lệnh tiếp theo sau lệnh A:/INBE Chương trình sẽ căn cứ vào giá trịchuyển để xác định các giá trị chuyển
Lệnh này không tác động đến các cờ
Ví dụ : Nếu nội dung thanh AL thấp hơn hoặc bằng 10H thì nhảy đến nhãn THOI
JBE/JNA- jump if Below/ Jump if Carry /Jump ì Not Above or Equal ( Nhảy thấp hơn / nhảy nếu
có / nhảy nếu không cao hơn hoặc bằng )
Mô tả :
IP ←IP + Dịchchuyển
Trang 37Đây là lệnh nhảy điều kiện tới NHAN nếu CX =0 và không có liện hệ gì với cờ ZF Nhãn NHAN phải
nằm cách xa (di chuyển một khoảng ) -128 +127byte so với lệnh tiếp theo sau lệnh A:/INBE Chươngtrình sẽ căn cứ vào giá trị chuyển để xác định các giá trị chuyển
Lệnh này không tác động đến các cờ
Ví dụ : Nếu thanh CX rỗng thì nhảy đến lệnh THOI
: JCXZ THOI
:
JE/JZ - Jump ì Equal /jump if Zero ( Nhảy nếu bằng nhau /Nhảy nếu kết quả bằng không )
JZ NHAN
Hai lệnh trên đều thực hiện cùng một thao tác : nhảy (có điều kiện ) tới NHAN nếu ZF=1.Nhãn NHAN
phải nằm cách xa (dịch chuyển một khoảng )-128 +127byte so với lệnh tiếp theo sau lệnh JE/JZ.Chương trình sẽ căn cứ vào giá trị chuyển để xác định các giá trị chuyển
Lệnh này không tác động đến các cờ
Ví dụ : Nếu nội dung thanh AL bằng 10H thì nhảy đến nhãn THOI
SUB AL ,10H ; AL trừ giá trị cần quan tâm
JE THOI ; Nhảy đến THOI nếu AL bằng 10H
JNLENHAN
Quan hệ “lớn hơn “ (greater than ),” bé hơn “(less than) và các quan hệ dành cho việc so sánh (do lệnhCMP thực hiện ) độ lớn của hai số không dấu Lớn hơn có nghĩa là dương hơn Nhãn NHAN phải nằmcách xa (dịch chuyển một khoảng )-128 +127byte so với lệnh tiếp theo sau lệnh JG/JNLE Chươngtrình sẽ căn cứ vào giá trị chuyển để xác định các giá trị chuyển
Viết lệnh
JGE NHAN JNL NHAN
hệ “lớn hơn “ (greater than ),” bé hơn “(less than) và các quan hệ dành cho việc so sánh (do lệnh CMPthực hiện ) độ lớn của hai số không dấu Lớn hơn có nghĩa là dương hơn Nhãn NHAN phải nằm cách xa(dịch chuyển một khoảng )-128 +127byte so với lệnh tiếp theo sau lệnh JG/JNLE Chương trình sẽ căn
cứ vào giá trị chuyển để xác định các giá trị chuyển
Trang 38Ví dụ : Nếu nội dung thanh AL lớn hơn hoặc bằng 10H thì nhảy đến nhãn THOI :
JNLE NHAN
+ZF=0 Quan hệ “lớn hơn” (greater than) và “bé hơn “ (less than) là các quan hệ dành cho việc sosánh (do lệnh CMP thực hiện) của 2 số có dấu Lớn hơn có nghĩa là dương hơn Nhãn NHAN phảinằm cách xa (dịch đi một khoảng) - 128 + 127 byte so với lệnh tiếp theo sau lệnh JG/JNLE chương trình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển
Lệnh này không tác động đến các cờ :
Ví dụ : Nếu nội dung thanh AL lớn hơn 10H thì nhãy đến nhãn THOI :
CMP AL, 10H ; so sánh AL với 10H
JG THOI ; nhảy đến THOI nếu AL lớn hơn 10H
JGE/JNL - Jump if Greater than or Equal/jump if not less than
(Nhảy nếu lớn hơn hoặc bằng /Nhảy nếu không bé hơn)
JNLE NHAN
Quan hệ “lớn hơn” (greater than) và “bé hơn “ (less than) là các quan hệ dành cho việc so sánh(do lệnh CMP thực hiện) của 2 số có dấu Lớn hơn có nghĩa là dương hơn Nhãn NHAN phải nằmcách xa (dịch đi một khoảng) - 128 + 127 byte so với lệnh tiếp theo sau lệnh JGE/JNL Chươngtrình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển
Lệnh này không tác động đến các cờ :
Ví dụ : Nếu nội dung thanh AL lớn hơn hoặc bằng 10 H thì nhảy đến nhãn THOI :
CMP AL, 10H ; so sánh AL với 10HJGE THOI ; nhảy đến THOI nếu AL lớn hơn hoặc
Trang 39; bằng 10H.
JL/JNGE - Jump if Less than/Jump if Not Greater than or Equal
(Nhảy nếu bé/Nhảy nếu không lớn hơn hoặc bằng)
JNGE NHAN
Quan hệ “lớn hơn” (greater than) và “bé hơn “ (less than) là các quan hệ dành cho việc so sánh(do lệnh CMP thực hiện) của 2 số có dấu Lớn hơn có nghĩa là dương hơn Nhãn NHAN phải nằmcách xa (dịch đi một khoảng) - 128 + 127 byte so với lệnh tiếp theo sau lệnh JL/JNGE Chươngtrình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển
Lệnh này không tác động đến các cờ :
Ví dụ : Nếu nội dung thanh AL nhỏ hơn 10 H thì nhảy đến nhãn THOI :
CMP AL, 10H ; so sánh AL với 10H
JL THOI ; nhảy đến THOI nếu AL nhỏ hơn 10H
JLE/JNG - Jump if Less than or Equal/Jump if Not Greater than
(Nhảy nếu bé hơn hoặc bằng/Nhảy nếu không lớn hơn)
JNG NHAN
+2Z=1 Quan hệ “lớn hơn” (greater than) và “bé hơn “ (less than) là các quan hệ dành cho việc sosánh (do lệnh CMP thực hiện) của 2 số có dấu Lớn hơn có nghĩa là dương hơn Nhãn NHAN phảinằm cách xa (dịch đi một khoảng) - 128 + 127 byte so với lệnh tiếp theo sau lệnh JLE/JNG.Chương trình dịch sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển
Trang 40Viết lệnh : sau đây là các dạng lệnh nhảy không điều kiện :
JMP NHAN
Lệnh mới bắt đầu tại địa chỉ ứng với nhãn NHAN Chương trình dịch sẽ căn cứ vào khoảngdịch giữa nhãn và lệnh nhảy để xác định xem đó là :
+ nhảy ngắn (short jump) ứng với trường hợp a) hình 3.8
Trong trường hợp này nhãn NHAN phải nằm cách xa (dịch đi một khoảng nhiều nhất là-128 + 127 byte so với lệnh tiếp theosau lệnh JMP Chương trình dịch sẽ căn cứ vào vị tríNHAN để xác định giá trị dịch chuyển mở rộng dấu cho nó Sau đó
Đây là lệnh nhảy trợc tiếp vì dịch chuyển được để trực tiếp trong mã lệnh
Để định hướng cho chương trình dịch làm việc nên viết lệnh dưới dạng :
JMP SHORT NHAN
+ nhảy gần (near jump) ứng với trường hợp c) hình 3.8Trong trường hợp này nhãn NHAN phải nằm cách xa (dịch đi một khoảng nhiều nhất là-32768 + 32767 byte so với lệnh tiếp theosau lệnh JMP Chương trình dịch sẽ căn cứ vào vị tríNHAN để xác định giá trị dịch chuyển mở rộng dấu cho nó Sau đó
Đây là lệnh nhảy trợc tiếp vì dịch chuyển được để trực tiếp trong mã lệnh
Để định hướng cho chương trình dịch làm việc nên viết lệnh dưới dạng :
JMP NEAR NHAN
+ nhảy xa (far jump) ứng với trường hợp d) hình 3.8