1. Trang chủ
  2. » Công Nghệ Thông Tin

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

70 3K 60
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Bộ Vi xử lý Intel 8088
Trường học Trường Đại học Bách Khoa Hà Nội
Chuyên ngành Kỹ thuật Vi xử lý và Hệ thống Tín hiệu
Thể loại Báo cáo môn học
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 70
Dung lượng 545,21 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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ệ

Trang 1

Chương 3

Bộ Vi xử lý Intel 8088

Sau khi đã tìm hiểu qua về cấu trúc của hệ vi xử lý, trong chương nμy ta sẽ đi sâu tìm hiểu một bộ vi xử lý cụ thể vμ rất điển hình: bộ vi xử lý 8088 của Intel Trước hết cần nói rõ lý do tại sao ở đây ta lại chọn đích danh bộ vi xử lý 8088

để tìm hiểu mμ không phải lμ bộ vi xử lý nμo khác (điều mμ nhiều người khác cũng đã lμm) Thứ nhất, đây lμ bộ vi xử lý nổi tiếng một thời thuộc họ 80x86 của Intel, nó được

sử dụng trong nhiều lĩnh vực khác nhau, nhất lμ trong các máy IBM PC/XT Các bộ vi

xử lý thuộc họ nμy sẽ còn được sử dụng rộng rãi trong hμng chục năm nữa, vμ vì tính

kế thừa của các sản phẩm trong họ 80x86, các chương trình viết cho 8088 vẫn có thể chạy được trên các hệ thống tiên tiến sau nμy Thứ hai, về góc độ sư phạm thì đây lμ

bộ vi xử lý khá đơn giản vμ vì vậy việc hiểu nó lμ tương đối dễ đối với những người mới bắt đầu thâm nhập vμo lĩnh vực nμy Thứ ba, các họ vi xử lý của các hãng tuy có khác nhau nhưng xét cho cùng cũng có khá nhiều điểm chủ yếu rất giống nhau Do đó một khi đã nắm được các vấn đề kỹ thuật của 8088, ta sẽ có cơ sở để nắm bắt được các

kỹ thuật của các bộ vi xử lý khác cùng trong họ Intel 80x86 hoặc của các họ khác

1 Giới thiệu cấu trúc bên trong vμ hoạt động của bộ vi xử lý 8088

Trước khi giới thiệu tập lệnh vμ cách thức lập trình cho bộ vi xử lý 8088 hoạt

động ta cần phải tìm hiểu kỹ cấu trúc bên trong của nó

Trên hình 3.1 lμ sơ đồ khối cấu trúc bên trong của bộ vi xử lý Intel 8088:

27

Trang 2

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

EU: Execution unit, khối thực hiện lệnh

BIU: Bus interface unit, khối phối ghép bus

ALU: Arithmetic and logic unit, khối số học vμ lôgic

Hình 3.1 Sơ đồ khối của bộ vi xử lý 8088

BUS ngoμi

Bus dữ liệu (8 bit)

Bus trong của CPU 8bit dữ liệu 20bitđịa chỉ

Bus địa chỉ (20bit)

Thanh ghi cờ

ALU

Đệm lệnh (hμng đợi lệnh) (6 byte cho 8086)

Khối điều khiển của E U

Σ

Các thanh ghi

đa năng

Bus dữ liệu ALU (16bit)

Các thanh ghi đoạn vμ con trỏ lệnh

Các thanh ghi

con trỏ vμ chỉ số

28

Trang 3

1.1 BIU vμ EU

Theo sơ đồ khối trên hình 3.1 ta thấy bên trong CPU 8088 có 2 khối chính:

khối phối ghép bus (bus interface unit, BIU) vμ khối thực hiện lệnh (execution unit,

EU) Việc chia CPU ra 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ên trong CPU có nhiệm vụ chuyển tải các tín hiệu của các khối khác Trong số các bus đó có bus dữ liệu 16 bit của ALU, bus các tín hiệu điều khiển ở EU vμ bus trong của hệ thống ở BIU Trước khi đi ra bus ngoμi hoặc đi vμ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 khả năng phối ghép

BIU đưa ra địa chỉ, đọc mã lệnh từ bộ nhớ, đọc/ghi dữ liệu từ/vμo cổng hoặc bộ nhớ Nói cách khác BIU chịu trách nhiệm đưa địa chỉ ra bus vμ trao đổi dữ liệu với bus

Trong EU ta thấy có một khối điều khiển (control unit, CU) Chính tại bên trong khối điều khiển 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μ ta thu được các dãy xung khác nhau (tuỳ theo mã lệnh) để điều khiển hoạt động của các bộ phận bên trong vμ bên ngoμi CPU

Trong khối EU còn có khối số học vμ lôgic (arithmetic and logic unit, ALU) dùng để

thực hiện các thao tác khác nhau với các toán hạng của lệnh Tóm lại, khi CPU hoạt

động EU sẽ cung cấp thông tin về địa chỉ cho BIU để khối nμy đọc lệnh vμ dữ liệu, còn bản thân nó thì giải mã lệnh vμ thực hiện lệnh

Trong BIU còn có một bộ nhớ đệm lệnh với dung lượng 4 byte dùng để chứa

các mã lệnh đọc được nằm sẵn để chờ EU xử lý (trong 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ý 8086/88 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 trong các máy lớn Nhân đây ta sẽ giới thiệu sơ qua một chút về cơ chế 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ủa CPU gồm 3 giai đoạn: đọc mã lệnh (opcode fetch), giải mã lệnh (decode)

vμ thực hiện lệnh (execution) Trong một thời điểm nhất định, CPU thế hệ 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, khi CPU giải mã lệnh hoặc khi nó đang thực hiện những lệnh không liên quan đến bus (thao tác nội bộ) thì các bus không được dùng 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) Trong khi đó từ bộ vi xử lý 8086/88, Intel sử dụng cơ chế xử lý xen kẽ liên tục dòng mã lệnh thì CPU được chia thμ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ệc giải mã lệnh vμ thực hiện lệnh lμ do khối EU đảm nhiệm Các khối chức năng nμy có khả năng lμm việc đồng thời vμ các bus sẽ liên tục được sử dụng: trong khi EU lấy mã lệnh từ bộ

29

Trang 4

đệm 4 byte để giải mã hoặc thực hiện các thao tác nội bộ thì BIU vẫn có thể đọc mã lệnh từ bộ nhớ chính rồi đặt chúng 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ệnh trong bộ đệm nμy thì có nghĩa lμ có sự phối hợp hoạt động hiệu quả giữa 2 khối

EU vμ BIU theo cơ chế xử lý xen kẽ liên tục dòng mã lệnh để 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 gặp các lệnh nμy nội dung cũ củ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ặc gọ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ác lệnh tuần tự

không có pipelining F1 D1 E1 F2 D2 E2 F3 D3 E3

có pipelining F1 D1 E1

F2 D2 E2 F3 D3 E3

(F: đọc lệnh, D: giải mã lệnh, E: thực hiện lệnh)

Hình 3 2 Dòng lệnh thường vμ dòng lệnh xen kẽ liên tục

Trong bộ vi xử lý 8088 ta còn thấy có các thanh ghi 16 bit nằm trong cả 2 khối BIU vμ EU, 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ên cùng chức năng chính của chúng

• Các thanh ghi đoạn

Khối BIU đưa ra trên bus địa chỉ 20 bit địa chỉ, như vậy 8088 có khả năng phân biệt ra được 220

= 1.048.576 = 1 M ô nhớ hay 1 Mbyte, vì các bộ nhớ nói chung

tổ chức theo byte Nói cách khác: không gian địa chỉ của 8088 lμ 1 Mbyte Trong

không gian 1 Mbyte nμy bộ nhớ cần được chia thμnh các vùng khác nhau (đ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ả trung gian của chương trình vμ

- tạo ra một vùng nhớ đặc biệt gọi lμ ngăn xếp (stack) dùng 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ữ

30

Trang 5

liệu DS (data segment), thanh ghi đoạn ngăn xếp SS (stack segment) vμ thanh ghi

đoạn dữ liệu phụ ES (extra segment) Các thanh ghi đoạn 16 bit nμy chỉ ra địa chỉ

đầu của 4 đoạn trong bộ nhớ, dung lượng lớn nhất của mỗi đoạn nhớ 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 4 đoạn nhớ 64 Kbyte nμy Việc thay đổi giá trị của các thanh ghi đoạn lμm cho các đoạn tương ứng có thể dịch chuyển linh hoạt trong phạm vi không gian 1 Mbyte, vì vậy các đoạn 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 Kbyte hoặc cũng có thể nằm trùm nhau do có những đoạn không cần dùng hết độ dμi 64 Kbyte vμ vì thế nhữ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ớ (64Kbyte) nμo nằm trong toμn bộ không gian 1Mbyte

Nội dung các thanh ghi đoạn sẽ xác định địa chỉ của ô nhớ nằm ở đầu đoạn

Địa chỉ 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 đóng vai trò thanh ghi lệch (offset register) mμ ta sẽ nói đến sau Cụ thể, để xác định địa chỉ vật lý

20 bit của một ô nhớ 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 để chứa địa chỉ cơ sở, còn thanh kia chứa độ lệch) vμ từ nội dung của cặp thanh ghi đó nó tạo ra địa chỉ vật lý theo công thức sau:

Địachỉvậtlý = Thanhghiđoạn ì16+Thanhghilệch

Việc dùng 2 thanh ghi để ghi nhớ thông tin về địa chỉ thực chất tạo ra một

loại địa chỉ gọi lμ địa chỉ logic vμ được ký hiệu như sau:

Thanhghiđoạn : Thanhghilệch hay segment : offset

Địa chỉ kiểu segment : offset lμ logic vì nó tồn tại dưới dạng giá trị của các

thanh ghi cụ thể bên trong CPU vμ khi cần thiết truy nhập ô nhớ nμo đó thì nó phải

được đổi ra địa chỉ vật lý để rồi được đưa lên bus địa chỉ Việc chuyển đổi nμy do một

bộ tạo địa chỉ thực hiện (phần tử Σ trên hình 3.1)

Ví dụ: Cặp CS:IP sẽ chỉ ra địa chỉ của lệnh sắp thực hiện trong đoạn mã Nếu

tại một thời điểm nμo đó ta có CS=F000H vμ IP=FFF0H thì

CS:IP ~ F000Hì16 + FFF0H = F0000H + FFF0H = FFFF0H

Địa chỉ FFFF0H chính lμ địa chỉ khởi động của 8088 Dấu ~ ở đây lμ để chỉ sự tương ứng Địa chỉ các ô nhớ thuộc các đoạn khác cũng có thể tính được theo cách tương tự như vậy Từ nay khi cần nói đến đến địa chỉ của một ô nhớ ta có thể sử dụng

31

Trang 6

cả địa chỉ logic lẫn địa chỉ vật lý vì bao giờ cũng tồn tại sự tương ứng giữa 2 loại địa chỉ nμy (thông qua bộ tạo địa chỉ Σ)

Trước khi nói đến các thanh ghi khác ta nói thêm chút ít về tính đa trị của các thanh ghi đoạn vμ thanh ghi lệch trong địa chỉ logic ứng với một địa chỉ vật lý Điều

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ị:

• Các thanh ghi đa năng

Trong khối EU có 4 thanh ghi đa năng 16 bit: AX, BX, CX, DX Điều đặc biệt

lμ khi cần chứa các dữ liệu 8 bit thì mỗi thanh ghi nμy có thể tách ra thμnh 2 thanh ghi 8 bit cao vμ thấp để lμm việc độc lập, đó lμ các cặp thanh ghi AH vμ AL, BH vμ

BL, CH vμ CL, DH vμ DL (trong đó H chỉ phần cao, L chỉ phần thấp) Mỗi thanh ghi

có thể được dùng một cách vạn năng để chứa các loại dữ liệu khác nhau, nhưng cũng

có những 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 ghi thường được gán cho những cái tên đặc biệt rất có ý nghĩa

Cụ thể:

• AX (accumulator, Acc): thanh chứa Các kết quả của các thao tác thường

được chứa ở đây (kết quả của phép nhân, chia) Nếu kết quả lμ 8 bit thì thanh ghi AL được coi lμ Acc

• BX (base): thanh ghi cơ sở, thường chứa địa chỉ cơ sở của một bảng dùng trong lệnh XLAT

• CX (count): bộ đếm CX thường được dùng để chứa số lần lặp trong trường hợp các lệnh LOOP (lặp), còn CL thường chứa số lần dịch hoặc quay trong các lệnh dịch hoặc quay thanh ghi

• DX (data): thanh ghi dữ liệu DX cùng AX tham gia vμo các thao tác của phép nhân hoặc chia các số 16 bit DX còn dùng để chứa địa chỉ của các cổng trong các lệnh vμo/ra dữ liệu trực tiếp (IN/OUT)

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

32

Trang 7

Trong 8088 còn có 3 thanh ghi con trỏ vμ 2 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ể:

• IP: con trỏ lệnh (instruction pointer), 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 vμ được xác định theo cách đã nói ở trên

• BP: con trỏ cơ sở (base pointer), BP luôn trỏ vμo một dữ liệu nằm trong đoạn ngăn xếp SS Địa chỉ đầy đủ của một phần tử trong đoạn ngăn xếp ứng với SS:BP vμ được xác định theo cách đã nói ở trên

• SP: con trỏ ngăn xếp (stack pointer), SP luôn trỏ vμo đỉnh hiện thời của ngăn xếp nằm trong đoạn ngăn xếp SS Địa chỉ đầy đủ của đỉnh ngăn xếp ứng với SS:SP vμ được xác định theo cách đã nói ở trên

• SI: chỉ số gốc hay nguồn (source index), SI chỉ vμo dữ liệu trong đoạn dữ liệu DS mμ địa chỉ cụ thể đầy đủ ứng với DS:SI vμ được xác định theo cách

đã nói ở trên

• DI: chỉ số đích (destination index), DI chỉ vμo dữ liệu trong đoạn dữ liệu DS

mμ địa chỉ cụ thể đầy đủ ứng với DS:DI vμ được xác định theo cách đã nói ở trên

Riêng trong các lệnh thao tác với dữ liệu kiểu chuỗi thì cặp ES:DI luôn ứng với địa chỉ của phần tử thuộc chuỗi đích còn cặp DS:SI ứng với địa chỉ của phần tử thuộc chuỗi gốc

• Thanh ghi cờ FR (Flag register)

Đây lμ thanh ghi khá đặc biệt trong CPU, mỗi bit của nó được dùng để phản

ảnh một trạng thái nhất định của kết quả phép toán do ALU thực hiện hoặc một trạng thái hoạt động của EU Dựa 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)

Trang 8

• P hoặc PF (Parity flag): cờ parity, PF phản ảnh tính chẵn lẻ (parity) của tổng số bit 1 có trong kết quả Cờ PF = 1 khi tổng số bit 1 trong kết quả lμ chẵn (even parity, parity chẵn) ở đây ta tạm dùng từ parity dạng nguyên gốc để tránh sự lủng củng khi phải dịch cụm từ 'even parity' thμnh tính chẵn lẻ chẵn hoặc 'odd parity' thμnh tính chẵn lẻ lẻ

• A hoặc AF (auxiliary carry flag): cờ nhớ phụ, rất có ý nghiã khi ta lμm việc với các số BCD AF = 1 khi có nhớ hoặc mượn từ một số BCD thấp (4 bit thấp) sang một số BCD cao (4 bit cao)

• Z hoặc ZF (zero flag): cờ rỗng, ZF = 1 khi kết quả bằng 0

• S hoặc SF (sign flag): cờ dấu, SF = 1 khi kết quả âm

• O hoặc OF (overflow flag): cờ trμn, OF = 1 khi kết quả lμ một số bù hai vượt

ra ngoμi giới hạn biểu diễn dμnh cho nó

Trên đây lμ 6 bit cờ trạng thái phản ảnh các trạng thái khác nhau của kết quả

sau một thao tác 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 khi cần tìm lỗi trong một chương trình)

• I hoặc IF (interrupt enable flag): cờ cho phép ngắt, IF = 1 thì CPU cho phép các yêu cầu ngắt (che được) được tác động

• D hoặc DF (direction flag): cờ hướng, DF = 1 khi CPU lμm việc với chuỗi ký

tự theo thứ tự từ phải sang trái (vì vậy D chính lμ cờ lùi)

ý nghĩa của các cờ đã khá rõ 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ù hai có dấu Để cho việc giải thích được đơn giản, đầu tiên giả thiết

ta lμm việc với số bù hai dμi 8 bit, kết quả để ở AL (xem hình 3.4) Gọi C67 lμ cờ nhớ từ bit 6 (b6) lên bit 7 (b7), trong đó b7 lμ MSB vμ cũng chính lμ bit dấu (SF) của AL Ta

có thể chứng minh được rằng quan hệ giữa cờ OF với các cờ CF vμ C67 tuân theo phương trình sau:

OF = CF ⊕ C67

Nghĩa lμ khi thực hiện các phép toán với số bù hai có dấu, hiện tượng trμn sẽ xẩy ra (cờ OF=1) nếu có nhớ từ MSB (tức lμ từ SF) sang CF nhưng lại không có nhớ vμo chính nó (SF) hoặc ngược lại Điều nμy có thể tổng quát hoá cho các trường hợp lμm việc với số bù hai có dấu với độ dμi 16/32 bit

Trang 9

Hình 3.4 Sơ đồ thanh ghi AL vμ các cờ CF, C67

1.2 8086 vμ 8088

Chế độ Chế độ MIN MAX

[AD14] A14 A15 [AD13] A13 A16/S3 [AD12] A12 A17/S4 [AD11] A11 A18/S5 [AD10] A10 A19/S6 [AD9] A9 S S 0 (B H E/S7)

AD7 RD

AD6 HOLD (RQ/GT0) AD5 HLDA (RQ/G T 1) AD4 W R (LOCK) AD3 IO/M (S2)

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

Trang 10

bên trong của 8088 vμ 8086 giống nhau về cơ bản, ngoại trừ 2 điểm Điểm khác nhau

đầu tiên lμ ở độ dμi bộ nhớ đệm lệnh (hμng đợi lệnh): độ dμi nμy ở 8088 lμ 4 byte còn ở

8086 lμ 6 byte; điều nμy sẽ có ảnh hưởng ít nhiều đến sự khác biệt về tốc độ xử lý của

2 bộ CPU Điểm khác nhau thứ hai lμ ở kích thước của bus dữ liệu: ở 8088 lμ 8 bit còn

ở 8086 lμ 16 bit (trong khi ALU vμ các thanh ghi của 2 bộ CPU vẫn có độ 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 ở 2 ô nhớ 'thẳng hμng' (1 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 1 chu kỳ

đọc/ghi; còn ở 8088 do bus dữ liệu chỉ có 8 bit nên để đọc/ghi 1 từ nằm ở 2 ô nhớ 'thẳng hμng' (nằm liên tiếp như trên), nó phải thực hiện trong 2 chu kỳ đọc/ghi Bù lại nhược

điểm về tốc độ, 8088 có giá rẻ vμ được dùng để tạo ra các hệ thống với giá phải chăng vì nó dễ phối ghép với các thiết bị ngoại vi 8 bit đang thịnh 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 ở 2 vi mạch như trên hình 3.5 (xem thêm phần giới thiệu cụ thể các tín hiệu tại các chân ở chương 5)

Mặc dù có những điểm khác nhau đã nêu, nhưng vì những điểm giống nhau

lμ rất cơ bản vμ vì 2 bộ vi xử lý có tập lệnh giống nhau nên về quan điểm lập trình thì chúng lμ tương đương

2 Cách mã hoá lệnh của bộ vi xử lý 8088

Lệnh của bộ vi xử lý được ghi bằng các ký tự dưới dạng gợi nhớ (mnemonic) để người sử dụng dễ nhận biết Đối với bản thân bộ vi xử lý thì lệnh cho nó được mã hoá dưới dạng các số 0 vμ 1 (còn gọi lμ mã máy) vì đó lμ dạng biểu diễn thông tin duy nhất

mμ máy hiểu được Vì lệnh cho bộ vi xử lý được cho dưới dạng mã nên sau khi nhận lệnh, bộ vi xử lý phải thực hiện giải mã lệnh rồi sau đó mới thực hiện lệnh Việc hiểu

rõ bản chất cách ghi lệnh bằng số hệ hai cho bộ vi xử lý sẽ có lợi khi ta cần dịch "bằng tay" một lệnh gợi nhớ khi 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μm việc với các hệ được trang bị chương trình dịch hợp ngữ)

Một lệnh có thể có độ 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ệnh MOV để giải thích cách ghi lệnh nói chung của 8088

Lệnh MOV đích, gốc dùng để chuyển dữ liệu giữa 2 thanh ghi hoặc giữa ô

nhớ vμ thanh ghi Chỉ nguyên với các thanh ghi của 8088, nếu ta lần lượt đặt các thanh ghi vμo vị trí các toán hạng đích vμ toán hạng gốc ta thấy đã phải cần tới hμng trăm mã lệnh khác nhau để mã hoá tổ hợp các lệnh nμy

36

Trang 11

Hình 3.6 biểu diễn dạng thức các byte dùng để mã hoá lệnh MOV Từ đây ta thấy rằng để mã hoá lệnh MOV ta phải cần ít nhất lμ 2 byte, trong đó 6 bit của byte

đầu dùng để chứa mã lệnh Đối với các lệnh MOV, để chuyển dữ liệu kiểu:

- thanh ghi ↔ thanh ghi (trừ thanh ghi đoạn) hoặc

- bộ nhớ ↔ thanh ghi (trừ thanh ghi đoạn)

thì 6 bit đầu nμy luôn lμ 100010 Đối với các thanh ghi đoạn thì điều nμy lại khác

Bit W dùng để chỉ ra rằng một byte (W=0) hoặc một từ (W=1) sẽ được chuyển

Byte 1 Byte 2 Byte 3 Byte 4

1 0 0 0 1 0

Opcode D W mod REG M/R

hoặc

Disp: displacement (dịch chuyển)

Hình 3.6 Dạng thức các byte mã lệnh của lệnh MOV

Trong các thao tác chuyển dữ liệu, một toán hạng luôn bắt buộc phải lμ thanh ghi Bộ vi xử lý dùng 2 hoặc 3 bit để mã hoá các thanh ghi trong CPU như sau:

Bit D dùng để chỉ hướng đi của dữ liệu, D=1 thì dữ liệu đi đến thanh ghi cho

bởi 3 bit của REG, D=0 thì dữ liệu đi từ thanh ghi cho bởi 3 bit của REG

2 bit MOD (chế độ) cùng với 3 bit R/M (thanh ghi/bộ nhớ) tạo ra 5 bit dùng để

chỉ ra chế độ địa chỉ cho các toán hạng của lệnh (có thể hiểu chế độ địa chỉ lμ cách tìm

37

Trang 12

ra địa chỉ của toán hạng, xem thêm phầ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

Bảng 3.1 Phối hợp MOD vμ R/M để tạo ra các chế độ địa chỉ

000 [BX] + [SI] [BX] + [SI] + d8 [BX] + [SI] + d16 AL AX

001 [BX] + [DI] [BX] + [DI] + d8 [BX] + [DI] + d16 CL CX

010 [BP] + [SI] [BP] + [SI] + d8 [BP] + [SI] + d16 DL DX

011 [BP] + [DI] [BP] + [DI] + d8 [BP] + [DI] + d16 BL BX

100 [SI] [SI] + d8 [SI] + d16 AH SP

101 [DI] [DI] + d8 [DI] + d16 CH BP

(địa chỉ trưc tiếp)

[BP] + d8 [BP] + d16 DH SI

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

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

Ghi chú: - d8: disp 8 bit, d16: disp.16 bit

- Các giá trị cho trong các cột 2, 3, 4 (ứng với MOD=00,01,10)

lμ các địa chỉ hiệu dụng (EA) sẽ được cộng với DS để tạo ra địa chỉ vật lý (riêng BP phải được cộng với SP)

Trong các ví dụ sau đây ta sẽ dùng các kiến thức nêu trên để mã hoá một vμi lệnh MOV

- MOV CL,[BX]

1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1

Opcode mã hoá CL chuyển tới thanh ghi

chuyển 1 byte [BX]

- MOV 0F3H[SI],CL:

38

Trang 13

1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1

CL Chuyển từ thanh ghi 1 byte [SI] d8=F3H

1 Chế độ địa chỉ thanh ghi (register addressing mode)

2 Chế độ địa chỉ tức thì (immediate addressing mode)

3 Chế độ địa chỉ trực tiếp (direct addressing mode)

4 Chế độ địa chỉ gián tiếp qua thanh ghi (register indirect addressing mode)

5 Chế độ địa chỉ tương đối cơ sở (based relative addressing mode)

6 Chế độ địa chỉ tương đối chỉ số (indexed relative addressing mode)

7 Chế độ địa chỉ tương đối chỉ số cơ sở (based indexed relative addressing mode)

Các chế độ địa chỉ nμy sẽ được giải thích thông qua các chế độ địa chỉ của lệnh MOV vμ lệnh ADD

• Chế độ địa chỉ thanh ghi

Trong chế độ địa chỉ 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 hơn so với các lệnh có truy nhập đến bộ nhớ

Ví dụ

MOV BX,DX ; chuyển nội dung DX vμo BX

MOV DS,AX ; chuyển nội dung AX vμo DS

ADD AL,DL ; cộng nội dung AL vμ DL rồi đưa vμo

• Chế độ địa chỉ tức thì

39

Trang 14

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ụ

• Chế độ địa 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 cho phép quy chiếu bộ nhớ 2 lần đối với một lệnh)

Ví dụ

40

Trang 15

MOV AL,[BX] ; chuyển nội dung ô nhớ có địa

; liên tiếp có địa chỉ DS:DI vμ

• 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μ

MOV CX,[BX+10] ;1 cách viết khác của lệnh trên

MOV AL,[BP]+5 ;chuyển nội dung ô nhớ SS:(BP+5)

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:

- 10, 5, Table gọi lμ các dịch chuyển của các toán hạng tương ứng 10 vμ 5 lμ

các giá trị cụ thể, Table lμ tên mảng biểu diễn dịch chuyển của mảng (phần tử đầu tiên) so với địa chỉ đầu của đoạn dữ liệu DS,

- (BX+10) hoặc (BP+5) gọi lμ địa chỉ hiệu dụng (effective address, EA, theo

cách gọi của Intel),

- DS:(BX+10) hoặc SS:(BP+5) chính lμ logic tương ứng với một địa chỉ vật lý

- Theo cách định nghĩa 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ảng Table[BX] thuộc đoạn DS lμ EA=Table+BX vμ của phần tử

đầu tiên lμ EA=Table

• Chế độ địa chỉ tương đối chỉ số

41

Trang 16

Trong chế độ địa chỉ nμy các thanh ghi chỉ số như SI vμ DI vμ các hằng số

biểu diễn các giá trị dịch chuyển (displacement values) được dùng để tính địa chỉ của

toán hạng trong vùng nhớ DS

Ví dụ

MOV AX,[SI]+10 ; chuyển nội dung 2 ô nhớ liên

; tiếp có địa chỉ DS:(SI+10) vμ

MOV AX,[SI+10] ;1 cách viết khác của lệnh trên

;vμo CL

• Chế độ địa chỉ tương đối chỉ số cơ sở

Kết hợp hai chế độ địa chỉ chỉ số vμ cơ sở ta có chể độ địa chỉ chỉ số cơ sở Trong chế độ địa chỉ 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 địa chỉ hoá các mảng 2 chiều

Ví dụ

; liên tiếp có địa chỉ

• 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ác chế độ địa chỉ của 8086/88 được biểu diễn trên hình 3.7

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

42

Trang 17

Như trong các phần trước đã nói, các thanh ghi đoạn vμ thanh ghi lệch được ngầm định đi kèm với nhau từng cặp dùng để địa chỉ hoá các toán hạng trong các vùng khác nhau của bộ nhớ Bảng 3.3 chỉ ra các khả năng cặp đôi ngầm định của các thanh ghi đoạn vμ thanh ghi lệch thường dùng.Vì tính ngầm định nμy nên trong các lệnh ta chỉ cần viết ra các thanh thanh ghi lệch lμ đủ cơ sở để tính ra được địa chỉ của toán hạng

Tuy nhiên, 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ợp khác của các thanh ghi đoạn vμ thanh ghi lệch Muốn loại bỏ các tổ hợp ngầm định nói trên, trong khi viết lệnh ta phải ghi rõ thanh ghi đoạn sẽ dùng để tính

địa chỉ vμ kèm thêm dấu 2 chấm trước thanh ghi lệch Cụm ký hiệu nμy gọi lμ cụm tiếp đầu để loại bỏ thanh ghi đoạn ngầm định (segment override prefix) vμ để đạt

được việc loại bỏ nμy chỉ cần ghi rõ thanh ghi đoạn

[BP] + Disp

DS

SS Tương đối chỉ số [DI] + Disp

[SI] + Disp

DS

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

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

(Ghi chú: Reg: Thanh ghi; Data: Dữ liệu tức thì; Disp: Dịch chuyển)

Bảng 3.3 Các cặp thanh ghi đoạn vμ thanh ghi lệch ngầm định

Thanh ghi lệch IP SI,DI,BX DI SP,BP

Ví dụ

Trong lệnh chuyển dữ liệu

43

Trang 18

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 lμ đoạn ngầm định của vùng nhớ chứa toán hạng do BX chỉ ra Nếu ta muốn thay

đổi, không lấy toán hạng trong đoạn dữ liệu DS nữa, mμ lại lấy toán hạng trong đoạn dữ liệu phụ ES để đưa vμ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õ lμ thanh ghi đoạn mới dùng trong lệnh nμy bây giờ lμ ES

dễ đọc ta qui định ký hiệu AL được hiểu lμ thanh ghi AL hoặc lμ nội dung của AL

Địa chỉ hiệu dụng

DSì16SSì16ESì16

hoặc hoặc Dịch chuyển

Địa chỉ vật lý

+ +

Chế độ chỉ số cơ sở

+

CSì16

hoặc

44

Trang 19

Trong khi ghi lệnh, dấu [x] nên được hiểu như lμ một ký hiệu của Intel để ghi lệnh, không nên hiểu lμ "nội dung" của x, còn {xx:yy} dùng để chỉ nội dung ô nhớ tại địa chỉ xx:yy, hoặc {SP} dùng để chỉ ô nhớ của ngăn xếp có địa chỉ do nội dung của thanh ghi con trỏ ngăn xếp SP chỉ ra

AAA - ASCII Adjust after Addition (Chỉnh sau khi cộng 2 số ở dạng

Ví dụ: Ta có hai số dưới dạng mã ASCII lμ 30H vμ 39H ứng với '0' vμ '9' Nếu

cộng 2 số ở dạng mã lại ta được số 69H, số nμy không có ý nghĩa gì vì nó không phải

lμ số BCD đúng Ta sẽ thu được số BCD không gói nếu dùng thêm lệnh AAA:

; AL = 0011 0000B = 30H = '0',

; BL = 0011 1001B = 39H = '9', ADD AL,BL ; thu được AL = 0110 1001B = 69H , kết

Trang 20

AAD ; sau khi chỉnh AX=0041 = 41H;

; lμ số BCD không gói,

AAM - ASCII Adjust after Multiplication (Chỉnh sau khi nhân 2 số ở dạng

ASCII)

Lệnh nμy dùng để đổi một số hệ hai, lμ tích của 2 số BCD không gói, có trong

AL sang số BCD không gói để tại AX

; trở lại thiết bị đầu cuối

AAS - ASCII Adjust after Subtraction (Chỉnh sau khi trừ 2 số ở dạng

Trang 21

; để truyền kết quả trở lại thiết bị

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

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

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

Trong đó toán hạng đích vμ gốc có thể tìm đ−ợc theo các chế độ địa chỉ khác nhau, nh−ng phải chứa dữ liệu có 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 Có thể tham khảo các ví dụ của lệnh ADC

47

Trang 22

Xoá: CF,OF

Cập nhật: PF, SF, ZP PF chỉ có nghĩa khi toán hạng lμ 8 bit

Không xác định: AF

Ví dụ

AND BL,0FH ; Che 4 bit cao của BL

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

Địa chỉ trở về lμ địa chỉ của lệnh tiếp ngay sau lệnh Call Khi gọi gần thì chỉ cần cất

IP của địa chỉ trở về (vì CS không đổi), khi gọi xa thì phải cất cả CS vμ IP của địa chỉ trở về Địa chỉ trở về được tự động cất tại ngăn xếp khi bắt đầu thực hiện lệnh gọi vμ

được tự động lấy ra khi gặp lệnh RET (trở về CTC từ ctc) tại cuối ctc

Như vậy, nếu lμ gọi gần:

+ SP ← SP - 2 vμ địa chỉ lệnh trở về được cất vμo ngăn xếp {SP} ← IP + IP ← Địa chỉ lệch của chương trình con

+ Khi gặp lệnh RET tại cuối ctc thì sẽ có thao tác ngược lại:

{SP} → IP vμ SP ← SP + 2

48

Trang 23

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

+ SP ← SP - 2 vμ địa chỉ lệch của lệnh trở về được cất vμo ngăn xếp: {SP} ← CS

+ SP ← SP - 2 vμ địa chỉ cơ sở của lệnh trở về được cất vμo ngăn xếp: {SP} ← IP

+ IP ← Địa chỉ lệch của chương trình con,

CS ← Địa chỉ cơ sở của chương trình con, + Khi gặp lệnh RET tại cuối ctc thì sẽ có thao tác ngược lại:

{SP} → IP vμ SP ← SP + 2

{SP} → CS vμ SP ← SP + 2,

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

cách tính địa chỉ của ctc:

CALL Multiple: Gọi ctc có tên lμ Multiple trong cùng đoạn mã với CTC, ctc

nμy phải nằm trong giới hạn dịch chuyển -32Kbyte (dịch về phía địa chỉ thấp) hoặc (32K-1)byte (dịch về phía địa chỉ cao) so với lệnh tiếp theo ngay sau lệnh Call Sau khi cất IP cũ (địa chỉ trở về) vμo ngăn xếp, IP mới được tính: IP ← IP + Dịchchuyển

CALL Divi: Gọi ctc có tên Divi ở đoạn mã khác Trong chương trình hợp ngữ

Divi phải được khai báo lμ một ctc ở xa:

Divi Proc Far

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

CALL BX: Gọi trực tiếp một ctc trong cùng đoạn, lệnh đầu tiên của ctc địch

chuyển so với đầu đoạn bằng nội dung của thanh ghi BX, do đó IP ← BX (SI, DI có thể dùng thay chỗ của BX)

CALL WORD PTR [BX]: Gọi ctc nằm trong cùng đoạn mã, ctc có địa chỉ

dịch chuyển (tính từ lệnh tiếp ngay sau lệnh gọi tới lệnh đầu tiên của ctc) chứa trong

2 ô nhớ do BX vμ BX+1 chỉ ra trong đoạn DS Địa chỉ lệch 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 trong cùng một đoạn mã, ctc

có địa chỉ CS:IP, giá trị gán cho IP vμ CS chứa trong 4 ô nhớ do BX vμ BX+1 (cho IP)

vμ BX+2 vμ BX+3 (cho CS) chỉ ra trong đoạn DS (SI, DI có thể dùng thay chỗ của BX)

49

Trang 24

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ấu của AL Ta dùng CBW để mở rộng dấu cho số có dấu nằm trong AL trước khi muốn chia nó cho một số có dấu 8 bit khác bằng lệnh IDIV (lệnh chia các số

có dấu), hoặc trước khi muốn nhân nó với một số có dấu 16 bit khác bằng lệnh IMUL (lệnh nhân các số có dấu)

Lệnh nμy không tác động đến các cờ

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

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

Trang 25

Lệnh nμy chỉ tạo cá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 Lệnh nμy thường được dùng để tạo cờ cho các lệnh nhảy có

điều kiện (nhảy theo cờ)

Các cờ chính theo quan hệ đích vμ gốc khi so sánh 2 số không dấu:

CMPS/CMPSB/CMPSW - Compare String Bytes or String Words (So

sánh 2 chuỗi byte hay 2 chuỗi từ)

CMPSB CMPSW

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ạo cá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 trong chuỗi đích

+ Sau mỗi lần so SI ← SI ± 1, DI ← DI ± 1 hoặc SI ← SI ± 2, DI ← DI ± 2 một cách tự động tuỳ thuộc cờ hướng DF lμ 0 hay 1 vμ chuỗi lμ chuỗi byte hoặc chuỗi từ

51

Trang 26

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ả thích nμy cũng có thể áp dụng cho các lệnh có dạng thức lệnh hoặc cấu trúc ngữ pháp tươ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 tên ngay từ đầu chuỗi nguồn vμ chuỗi đích lμ loại gì Sau đó ta dùng lệnh COMPS để thao tác với các chuỗi đó:

Lệnh CMPS/CMPSB/CMPSW có thể dùng kèm với lệnh REPE hoặc REPNE

để so sánh tất cả các phần tử trong chuỗi

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

Ví dụ

Trang 27

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ộng dấ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 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ải chỉnh lại kết quả 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ệ hai, để lμm toán với các số BCD Lệnh DAA chỉ tác động đú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ủ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

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ỉnh lại kết quả 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ệ hai, để lμm toán với cá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:

53

Trang 28

+ 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

Trang 29

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, sau khi chia: AL ← thương, AH ← số dư,

• 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, sau khi chia: AX ← thương, DX ← số dư

Nếu thương không phải lμ số nguyên nó được lμm tròn theo số nguyên sát dướ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ạng 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

ESC - Escape

Lệnh nμy dùng để truyền các lệnh cho bộ đồng xử lý toán học 8087 Bộ vi xử

lý 8088 khi gặp lệnh ESC thì tuỳ theo khung cảnh, có lúc nó coi ESC như lμ lệnh NOP (no operation), có lúc nó truy nhập dữ liệu từ bộ nhớ vμ đưa đến cho bộ đồng xử

lý toán học 8087

HLT - Halt Processing (Dừng)

Khi gặp lệnh nμy, các hoạt động của 8088 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

55

Trang 30

Đâ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), + dấu của số 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μi của Gốc) thì 8088 thực hiện lệnh ngắt INT 0

• nếu Gốc lμ số có dấu 8 bit: ALìGốc,

số bị nhân phải lμ số có dấu 8 bit để trong AL, sau khi nhân: AX ← tích,

• nếu Gốc lμ số có dấu 16 bit: AXìGốc,

số bị nhân phải lμ số có dấu 16 bit để trong AX,

sau khi nhân: DXAX ← tích

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 bit (hoặc 32 bit) kết quả chỉ chứa các giá trị của dấu thì CF=OF=0

Nếu byte cao (hoặc 16 bit cao) của 16 (hoặc 32) bit kết quả chứa một phần kết quả thì CF=OF=1

Như vậy CF vμ OF sẽ báo cho ta biết kết quả cần độ dμi thực chất lμ bao nhiêu

Ví dụ: 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ệnh IMUL Gốc vμ kết quả có trong cặp

DXAX

56

Trang 31

+ 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ỉ hoá cổng mềm dẻo hơn Lúc nμy địa chỉ cổng nằm trong dải 0000H FFFFH vμ ta phải viết lệnh theo dạng:

Trang 32

INT - Interrupt Program Execution (Ngắt, gián đoạn chương trình đang

Mỗi lệnh ngắt ứng với một chương trình phục vụ ngắt (CTPVN) khác nhau có

địa chỉ lấy từ bảng vectơ ngắt Bảng nμy gồm 256 vectơ, chứa địa chỉ của các CTPVN

tương ứng vμ chiếm 1Kbyte RAM có địa chỉ thấp nhất của bộ nhớ CTPVN cũng có

thể được gọi lμ chương trình con phục vụ ngắt (CTCPVN) vì cách thức tổ chức vμ

quan hệ giữa nó với chương trình bị ngắt cũng giống như cách thức tổ chức vμ quan

hệ 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ắt INT 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ấy lạ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ề địa chỉ vμ trạng thái, tất nhiên cũng cần phải 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)

JNBE NHAN

58

Trang 33

Mô tả: IP ← IP + Dịchchuyển

Hai lệnh trên biểu diễn cùng một thao tác: nhảy (có điều kiện) tới NHAN nếu

CF+ZF=0 Quan hệ "trên", "cao hơn" (above) vμ "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 2 số không dấu Nhãn NHAN phải nằ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 JA/JNBE Chương trình dịch sẽ căn cứ vμo vị trí NHAN để xác định giá trị dịch chuyển

JAE/JNB/JNC - Jump 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 không thấp hơn/Nhảy nếu không

có nhớ)

JNB NHAN JNC NHAN

Ba lệnh trên biểu diễ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", "cao hơn" (above) vμ "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 2 số không dấu Nhãn NHAN phải nằ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 JAE/JNB/JNC 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 cao hơn hoặc bằng 10H thì nhảy đến nhãn

THOI:

CMP AL,10H ; so sánh AL với 10H, JAE THOI ; Nhảy đến THOI nếu AL cao hơn hoặc

JB/JC/JNAE - Jump if Below/Jump if Carry/Jump if Not Above or Equal (Nhảy nếu thấp hơn/Nhảy nếu có nhớ/Nhảy nếu không cao hơn hoặc bằng)

59

Trang 34

Viết lệnh: JB NHAN

JC NHAN JNAE NHAN

Ba lệnh trên biểu diễn cùng một thao tác: nhảy (có điều kiện) tới NHAN nếu

CF=1 Quan hệ "trên", "cao hơn" (above) vμ "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 2 số không dấu Nhãn NHAN phải nằ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 JB/JC/JNAE 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 thấp hơn 10H thì nhảy đến nhãn THOI:

CMP AL,10H ; so sánh AL với 10H,

JBE/JNA - Jump if Below or Equal/Jump if Not Above (Nhảy nếu thấp

hơn hoặc bằng/Nhảy nếu không cao hơn)

JNA NHAN

Hai lệnh trên biểu diễ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", "cao hơn" (above) vμ "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 2 số không dấu Nhãn NHAN phải nằ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 JBE/JNA 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 35

JBE THOI ; nhảy đến THOI nếu AL thấp hơn hoặc

JCXZ - Jump if CX Register if Zero (Nhảy nếu nội dung thanh đếm rỗng)

Đây lμ lệnh nhảy (có đ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 (dịch đi một khoảng) -128 +127 byte so với lệnh tiếp theo sau lệnh JCXZ Chương trình dịch sẽ căn cứ vμo vị trí NHAN để xác định giá trị dịch chuyển

JE/JZ - Jump if 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 biểu diễ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 đi một khoảng) -128 +127 byte so với lệnh tiếp theo sau lệnh JE/JZ 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 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

JG/JNLE - Jump if Greater than/Jump if Not Less than or Equal

(Nhảy nếu lớn hơn /Nhảy nếu không bé hơn hoặc bằng)

61

Ngày đăng: 28/07/2014, 17:22

HÌNH ẢNH LIÊN QUAN

Hình 3.1.  Sơ đồ khối của bộ vi xử lý 8088. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.1. Sơ đồ khối của bộ vi xử lý 8088 (Trang 2)
Hình 3. 2. Dòng lệnh th−ờng vμ dòng lệnh xen kẽ liên tục - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3. 2. Dòng lệnh th−ờng vμ dòng lệnh xen kẽ liên tục (Trang 4)
Hình 3.3.  Sơ đồ thanh ghi cờ của bộ vi xử lý 8086/88. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.3. Sơ đồ thanh ghi cờ của bộ vi xử lý 8086/88 (Trang 7)
Hình 3.5. Sơ đồ chân của CPU 8088 [8086]. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.5. Sơ đồ chân của CPU 8088 [8086] (Trang 9)
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 - Chương 3 - Bộ Vi xử lý 8088 pptx
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 (Trang 11)
Bảng 3.2. Tóm tắt các chế độ địa chỉ. - Chương 3 - Bộ Vi xử lý 8088 pptx
Bảng 3.2. Tóm tắt các chế độ địa chỉ (Trang 17)
Hình 3.7.  Một hình thức khác tổng kết các chế độ địa chỉ của 8088. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.7. Một hình thức khác tổng kết các chế độ địa chỉ của 8088 (Trang 18)
Hình 3.8. Các kiểu lệnh nhảy không điều kiện (JUMP). - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.8. Các kiểu lệnh nhảy không điều kiện (JUMP) (Trang 40)
Hình 3.9. Lệnh RCL. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.9. Lệnh RCL (Trang 55)
Hình 3.11. Lệnh ROL. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.11. Lệnh ROL (Trang 59)
Hình 3.12. Lệnh ROR. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.12. Lệnh ROR (Trang 60)
Hình 3.15. Lệnh SHR. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.15. Lệnh SHR (Trang 64)
Hình 3.16. Đoạn dữ liệu, thanh ghi AL vμ BX tr−ớc vμ sau lệnh XLAT. - Chương 3 - Bộ Vi xử lý 8088 pptx
Hình 3.16. Đoạn dữ liệu, thanh ghi AL vμ BX tr−ớc vμ sau lệnh XLAT (Trang 69)

TỪ KHÓA LIÊN QUAN

w