Trong tập thanh ghi của cpu8086 – thanh ghi nào dưới đây không phải nhóm thanh ghi đa dụng?

Trong tập thanh ghi của cpu8086 – thanh ghi nào dưới đây không phải nhóm thanh ghi đa dụng?

Loading Preview

Sorry, preview is currently unavailable. You can download the paper by clicking the button above.

Bộ thanh ghi trong 8086 Các thanh ghi trong bộ vi xử lí 8086 đều là các thanh ghi 16 bit và được chia thành các nhóm như sau: - Các thanh ghi công dụng chung AX (accumulator), BX (base), CX (counter), DX (data): có thể được truy xuất độc lập như 2 thanh ghi 8 bit : AH và AL, BH và BL, CH và CL, DH và DL. - Các thanh ghi con trỏ và chỉ mục (xem chi tiết ở các phần sau) SP (Stack Pointer), BP (Base Pointer): con trỏ dùng khi làm việc với stack SI (Source Index), DI (Destination Index): chỉ số mảng khi xử lí mảng (chuỗi) - Các thanh ghi phân đoạn CS (Code Segment), DS (Data Segment), ES (Extra data Segment), SS (Stack Segment): tương ứng lưu địa chỉ phân đoạn mã lệnh, phân đoạn dữ liệu, phân đoạn dữ liệu bổ sung, phân đoạn ngăn xếp. Địa chỉ phân đoạn này sẽ được kết hợp với địa chỉ offset để truy xuất ô nhớ. (xem chi tiết ở các phần sau) - Các thanh ghi con trỏ lệnh và trạng thái IP (Intruction Pointer): thanh ghi chứa địa chỉ offset của lệnh kế tiếp cần thực hiện. Thanh ghi này không thể được truy xuất trực tiếp. FLAGS: thanh ghi cờ trạng thái, dùng để chứa các bit mô tả trạng thái của lệnh vừa được thực hiện, hoặc chứa các bit điều khiển cần thiết lập trước khi gọi lệnh. Bao gồm các bit cờ sau đây: (xem chi tiết ở các phần sau) CF (Carry Flag): bật khi phép tính vừa thực hiện có sử dụng bit nhớ PF (Parrity Flag): bật khi kết quả của phép tính vừa thực hiện có chẵn bit 1 AF (Auxilary Flag): bật khi phép tính vừa thực hiện có sử dụng bit nhớ phụ ZF (Zero Flag): bật khi kết quả của phép tính vừa thực hiện là 0 SF (Sign Flag): bật khi kết quả của phép tính vừa thực hiện có bit dấu bật TF (Trace Flag): bật để chuyển sang chế độ chạy từng bước IF (Interrupt Flag): bật để cho phép các ngắt xảy ra DF (Direction Flag): bật để chọn chế độ giảm chỉ số tự động khi làm việc với mảng OF (Overflow Flag): bật khi phép tính vừa thực hiện gây ra tràn số Tổ chức bộ nhớ trong 8086 Địa chỉ vật lí. Bus địa chỉ có độ rộng 20 bit, nếu đánh địa chỉ tuần tự tăng dần cho các ô nhớ:  số lượng tối đa các ô nhớ có thể được đánh địa chỉ là 2^20 ô nhớ. Mỗi ô nhớ có kích thước 1 byte  kích thước bộ nhớ tối đa có thể truy cập là 2^20 byte = 1 MB. Khi đó, địa chỉ của một ô nhớ là một con số 20 bit (hoặc 5 chữ số hex), gọi là địa chỉ vật lí. Địa chỉ logic Các thanh ghi trong 8086 đều là 16 bit. Nếu dùng các thanh ghi này để lưu trữ địa chỉ 20bit thì không tiện lợi. Người ta đã tìm cách giảm số bit dùng để đánh địa chỉ xuống còn 16bit. Ý tưởng được sử dụng là: thông thường, các dữ liệu mà một chương trình cần truy cập nằm gần nhau và tạo thành một khối không lớn lắm; như vậy, nếu ta đánh địa chỉ tương đối (gọi là offset) trong một khối thì số lượng bit dùng để đánh địa chỉ sẽ giảm xuống. Bộ nhớ được chia thành các khối 64KB, gọi là segment, các khối này không xếp tuần tự cạnh nhau mà xếp gối đầu, với khoảng cách 16byte. Nghĩa là, cứ 16 byte thì lại bắt đầu một segment mới. Như vậy, số lượng segment trong 1MB bộ nhớ là 1MB / 16byte = 65536 = 2^16. Do đó, để đánh địa chỉ segment ta cũng cần 16 bit. Trong phạm vi một segment 64KB (=65536 byte), chỉ cần dùng 16 bit làm địa chỉ offset để xác định một ô nhớ. (Xem Hình 1. Tổ chức bộ nhớ kiểu segment - offset) Tóm lại, trong cách đánh địa chỉ logic, mỗi ô nhớ có địa chỉ là một cặp (segment:offset), tổng cộng 32bit. Tuy nhiên, như đã nói ở trên, các dữ liệu có liên quan trong bộ nhớ thường ở gần nhau trong một khối segment nên ta có thể không cần xác định tường minh địa chỉ segment mà chỉ cần ngầm hiểu. Khi bắt đầu làm việc với một segment nào thì ta sẽ dùng một thanh ghi để ghi lại địa chỉ segment đó. Thanh ghi này sẽ được dùng chung cho tất cả các phép truy xuất bộ nhớ tiếp theo. Và như thế, trong các phép truy xuất bộ nhớ tiếp theo, chỉ cần dùng thêm 16 bit địa chỉ offset là đủ để xác định vị trí một ô nhớ. Nếu địa chỉ gồm cả hai phần segment:offset, người ta gọi đó là địa chỉ xa. Nếu địa chỉ chỉ có offset còn segment ngầm định thì người ta gọi là địa chỉ gần, hàm ý là nó xác định một ô nhớ chỉ ở trong phạm vi của segment ngầm định mà thôi. Chuyển đổi giữa hai kiểu địa chỉ Việc đổi từ địa chỉ logic sang địa chỉ vật lí rất đơn giản. Phy_address = segment * 16 + offset Vd: địa chỉ logic 1234h:0005h sẽ ứng với địa chỉ vật lí 1234h * 16 + 0005h = 12340h + 0005h = 12345h Việc đổi từ địa chỉ vật lí sang địa chỉ logic cũng không có gì phức tạp. Tuy nhiên, do các segment gối đầu nhau nên mỗi ô nhớ có thể thuộc một vài segment khác nhau. Vì vậy, một địa chỉ vật lí có thể ứng với nhiều địa chỉ logic khác nhau. Vd: địa chỉ vật lí 12345h có thể ứng với các địa chỉ logic sau: 1234h:0005h 1230h:0045h 1200h:0345h 1000h:2345h 1232h:0025h … Thông thường khi nói “địa chỉ”, ngầm hiểu là địa chỉ logic, mà thường là địa chỉ gần. RAM..Physicaladdress00000h00001hFFFFFh0000Fh00010h00011h0001Fh00020h00002h..0FFFFh10000h..1000Fh10010h..1001Fh10020h....Segment 0000Segment 000116 bytes..Segment 000216 bytes0000h:0020h0001h:0010h0002h:0000hSegment : OffsetVì mỗi ô nhớ có thể thuộc nhiều segment khác nhau, một địa chỉ vật lí 00020h có thể ứng với nhiều địa chỉ logic khác nhau, tùy vào việc lựa chọn segment.F0000h..F000Fh..FFFF0hSegment F000hF0010hSegment F001hSegment FFFFhMột số địa chỉ logic có thể trở nên không hợp lệ. Ví dụ, ở segment FFFFh, chỉ có các offset từ 0000h đến 000Fh mới tạo thành một địa chỉ hợp lệ, bởi vì địa chỉ vật lí chỉ có đến FFFFFh là hếtLogicaladdress Hình 1. Tổ chức bộ nhớ kiểu segment - offset Một chương trình khi đã được nạp vào bộ nhớ để thực hiện thông thường chiếm 3 phân đoạn. Một phân đoạn dành cho mã lệnh (code segment), một phân đoạn dành cho dữ liệu (data segment), và một phân đoạn ngăn xếp (stack segment) dành để lưu các giá trị trung gian hoặc các địa chỉ trở về dùng khi gọi hàm. Địa chỉ của 3 phân đoạn tương ứng được nạp vào 3 thanh ghi CS, DS, SS. Thanh ghi IP chứa địa chỉ offset của lệnh sắp được thực hiện. Như vậy, cặp CS:IP sẽ cho biết địa chỉ logic của lệnh. Thanh ghi SP chứa địa chỉ offset của ô nhớ cuối cùng được lưu vào stack. Các phép truy xuất đến phân đoạn ngăn xếp sẽ dùng cặp SS:SP. Các lệnh truy xuất dữ liệu trong phân đoạn dữ liệu sẽ dùng đến DS để kết hợp với offset được tính toán từ mã lệnh để có được địa chỉ logic của ô nhớ cần truy xuất.

Intel-8086 là một CPU 16 bit (bus dữ liệu ngoại có 16 dây). Nó được dùng để chế tạo các máy vi tính PC-AT đầu tiên của hãng IBM vào năm 1981. Trong thực tế, hãng IBM đã dùng CPU 8088 (là một dạng của CPU 8086 với bus số liệu giao tiếp với ngoại vi là 8 bit) để chế tạo máy vi tính cá nhân đầu tiên gọi là PC-XT.

Cho đến nay CPU 8086 đã không ngừng cải tiến và đã trải qua các phiên bản 80186, 80286, 80386, 80486, Pentium (80586), Pentium Pro, Pentium MMX, Pentium II, III, 4. Các CPU trên tương thích từ trên xuống (downward compatible) nghĩa là tập lệnh của các CPU mới chế tạo gồm các tập lệnh của CPU chế tạo trưóc đó được bổ sung thêm nhiều lệnh mạnh khác.

Cấu trúc tổng quát của CPU-8086 có dạng như hình 1.1, gồm 2 bộ phận chính là: Bộ thực hiện lệnh và bộ phận giao tiếp bus.

1. Bộ phận thực hiện lệnh (EU):

Thi hành các tác vụ mà lệnh yêu cầu như: Kiểm soát các thanh ghi (đọc/ghi), giải mã và thi hành lệnh. Trong EU có bộ tính toán và luận lý (ALU) thực hiện được các phép toán số học và luận lý. Các thanh ghi đa dụng là các ô nhớ bên trong CPU chứa dữ liệu tương tự như ô nhớ trong bộ nhớ. Cờ cũng là một thanh ghi dùng để ghi lại trạng thái hoạt động của ALU. Thanh ghi lệnh chứa nội dung lệnh hiện tại mà CPU đang thực hiện.

Các thanh ghi và bus trong EU đều là 16 bit. EU không kết nối trực tiếp với bus hệ thống bên ngoài. Nó lấy lệnh từ hàng chờ lệnh mà BIU cung cấp. Khi có yêu cầu truy xuất bộ nhớ hay ngoại vi thì EU yêu cầu BIU làm việc. BIU có thể tái định địa chỉ để cho phép EU truy xuất đầy đủ 1 MB (8086 có 20 đường địa chỉ ngoại).

2. Bộ giao tiếp bus (BIU):

BIU thực hiện chức năng giao tiếp giữa EU với bên ngoài (Bộ nhớ, thiết bị ngoại vi …) thông qua hệ thống BUS ngoại (bus dữ liệu và bus địa chỉ). BIU thực hiện tất cả các tác vụ về bus mỗi khi EU có yêu cầu. Khi EU cần trao đổi dữ liệu với bên ngoài, BIU sẽ tính toán địa chỉ và truy xuất dữ liệu để phục vụ theo yêu cầu EU.

Trong BIU có 5 thanh ghi CS, DS, ES, SS và IP chứa địa chỉ. Thanh ghi IP chứa địa chỉ của lệnh sẽ được thi hành kế tiếp nên gọi là con trỏ lệnh.

EU và BIU liên lạc với nhau thông qua hệ thống bus nội. Trong khi EU đang thực hiện lệnh thì BIU lấy lệnh từ bộ nhớ trong nạp đầy vào hàng chờ lệnh (6 bytes). Do đó EU không phải đợi lấy lệnh từ bộ nhớ. Đây là một dạng đơn giản của cache để tăng tốc độ đọc lệnh.

Trong tập thanh ghi của cpu8086 – thanh ghi nào dưới đây không phải nhóm thanh ghi đa dụng?

Hình 1.1: Sơ đồ khối của CPU 8086

Thanh ghi (register) là thành phần lưu trữ dữ liệu bên trong CPU, mỗi thanh ghi có độ dài nhất định (16 bit hoặc 8 bit) và được nhận biết bằng một tên riêng. Tùy vào độ dài và chức năng mà thanh ghi có công dụng chứa dữ liệu hoặc kết quả của phép toán, hoặc là các địa chỉ dùng để định vị bộ nhớ khi cần thiết.

Nội dung của thanh ghi được truy xuất thông qua tên riêng của nó, do đó tên thanh ghi là từ khóa quan trọng cần phải lưu ý trong lập trình.

CPU-8086 có 16 thanh ghi, mỗi thanh ghi là 16 bit, có thể chia 4 nhóm sau:

  1. Thanh ghi đoạn: Gồm 4 thanh ghi 16 bit: CS, DS, ES, SS. Đây là những thanh ghi dùng để chứa địa chỉ đoạn của các ô nhớ khi cần truy xuất. Mỗi thanh ghi đoạn quản lý 1 đoạn tối đa 64K ô nhớ trong bộ nhớ trong. Người sử dụng chỉ được phép truy xuất ô nhớ dựa vào địa chỉ tương đối. CPU (cụ thể là BIU) có nhiệm vụ chuyển đổi địa chỉ tương đối thành địa chỉ tuyệt đối để truy xuất vào ô nhớ tuyệt đối tương ứng trong bộ nhớ. (Xem phần tổ chức bộ nhớ)

CS: Thanh ghi đoạn mã lệnh, lưu địa chỉ đoạn chứa mã lệnh chương trình của người sử dụng

DS: Thanh ghi đoạn dữ liệu, lưu địa chỉ đoạn chứa dữ liệu (các biến) trong chương trình.

ES: Thanh ghi đoạn dữ liệu thêm, lưu địa chỉ đoạn chứa dữ liệu thêm trong chương trình.

SS: Thanh ghi đoạn ngăn xếp, lưu địa chỉ đoạn của vùng ngăn xếp.

15 0
CS Code Segment
DS Data Segment
ES Extra data Segment
SS Stack Segment

Thông thường bốn thanh ghi này có thể chứa những giá trị khác nhau, do đó chương trình có thể được truy cập trên bốn đoạn khác nhau và chương trình chỉ có thể truy cập cùng 1 lúc tối đa bốn đoạn. Mặc khác, đối với những chương trình nhỏ, chỉ sử dụng 1 đoạn duy nhất, khi đó cả bốn thanh ghi đều chứa cùng giá trị địa chỉ đoạn, gọi là đoạn chung.

  1. Thanh ghi đa dụng (General Register): Bao gồm bốn thanh ghi đa dụng 16 bit (AX, BX, CX, DX). Mỗi thanh ghi đa dụng có thể được sử dụng với nhiều mục đích khác nhau, tuy nhiên từng thanh ghi có công dụng riêng của nó.
15 8 7 0
AH AL AX (Accumulator)
BH BL BX (Base register)
CH CL CX (Count register)
DH DL DX (Data register)

AX : Là thanh ghi tích lũy cơ bản. Mọi tác vụ vào/ra đều dùng thanh ghi này, tác vụ dùng số liệu tức thời, một số tác vụ chuỗi ký tự và các lệnh tính toán đều dùng thanh AX.

BX: Thanh ghi nền dùng để tính toán địa chỉ ô nhớ.

CX: Là thanh ghi đếm, thường dùng để đếm số lần trong một lệnh vòng lặp hoặc lệnh xử lý chuổi ký tự.

DX: Thanh ghi dữ liệu, thường chứa địa chỉ của một số lệnh vào/ra, lệnh tính toán số học (kể cả lệnh nhân và chia).

Mỗi thanh ghi 16 bit có thể chia đôi thành 2 thanh ghi 8 bit. Do đó, CPU-8086 có 8 thanh ghi 8 bit là: AH, AL; BH, BL; CH, CL; DH, DL (thanh ghi AH và AL tương ứng với byte cao và byte thấp của thanh ghi AX, tương tự cho các thanh ghi 8 bit còn lại).

Ví dụ: AX = 1234h => AH = 12h, AL = 34h

  1. Thanh ghi con trỏ và chỉ số (Pointer & Index register): Chức năng chung của nhóm thanh ghi này là chứa địa chỉ độ dời của ô nhớ trong vùng dữ liệu hay ngăn xếp.

SI : Thanh ghi chỉ số nguồn

DI : Thanh ghi chỉ số đích

BP: Thanh ghi con trỏ nền dùng để lấy số liệu từ ngăn xếp.

SP : Thanh ghi con trỏ ngăn xếp luôn chỉ vào đỉnh ngăn xếp.

15 0
SI Source Index Reg.
DI Destination Index Reg.
BP Base Pointer Reg.
SP Stack Pointer Reg.

SI và DI chứa địa chỉ độ dời của ô nhớ tương ứng trong đoạn có địa chỉ chứa trong DS hoặc ES (dữ liệu, còn gọi là Biến). Còn BP và SP chứa địa chỉ độ dời của ô nhớ tương ứng trong đoạn có địa chỉ chứa trong SS, dùng để thâm nhập số liệu trong ngăn xếp.

  1. Thanh ghi Đếm chương trình và thanh ghi trạng thái (Cờ):
15 0
F Flag Register.
IP Intrucstion Pointer Reg.
  • Thanh ghi con trỏ lệnh IP (còn gọi là PC – đếm chương trình) là thanh ghi 16 bit chứa địa chỉ của lệnh kế tiếp mà CPU sẽ thực hiện trong. Các lệnh của chương trình có địa chỉ đoạn trong CS.
  • Thanh ghi Cờ (F) dài 16 bit, mỗi bit là một cờ. Mỗi cờ có giá trị 1 (gọi là SET –Đặt) hoặc 0 (gọi là CLEAR – Xóa). Hình 1.2 mô tả 9 bit trong số 16 bit tương ứng với 9 cờ trạng thái (các bit còn lại dùng cho dự trữ mở rộng khi thiết kế các CPU khác)

Thanh ghi cờ được chia thành hai nhóm:

  • Nhóm cờ điều khiển (bảng 1.1) bao gồm các cờ dùng để điều khiển sự hoạt động của CPU và giá trị của cờ được thiết lập bằng các lệnh phần mềm.
  • Nhóm cờ trạng thái (bảng 1.2) bao gồm các cờ phản ánh kết quả thực hiện lệnh cũng như trạng thái của CPU
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
O D I T S Z A P C

Dự trữ

Hình 1.2: Cấu trúc thanh ghi Cờ

KÝ HIỆU TÊN Ý NGHĨA
Nhóm cờ điều khiển
TF Bẩy (Trap) TF = 1: cho phép chương trình chạy từng bước
IF Ngắt (Interrupt) IF = 1: cho phép ngắt phần cứng
DF Hướng (Direction) DF = 1: thì SI và DI giảm 1 cho mỗi vòng lặp
Nhóm cờ trạng thái
CF Số giữ(Carry) CF = 1: khi có số nhớ hoặc mượn từ MSB trong phép cộng hoặc trừ.(Có tthể bị thay đổi theo lệnh ghi dịch và quay)
PF Chẳn lẻ (Parity) PF = 1: khi byte thấp của thanh ghi kết quả một phép tính có số lượng bit 1 chẳn
AF Số giữ phụ (Hafl) AF = 1: khi có nhớ hoặc mượn từ bit 3 trong phép cộng hoặc trừ. Dùng trong các lệnh với số BCD
ZF Zero ZF = 1: khi kết quả của một phép tính bằng 0
SF Dấu (Sign) SF = 1 khi kết quả phép tính là âm (MSB=1).SF = 0 khi kết quả dương (MSB=0)
OF Tràn (Overflow) OF = 1: nếu kết quả vượt quá khả năng tính toán của CPU

Bảng 1.1: Ý nghĩa cờ

Trạng thái tràn có thể không xảy ra (nếu không tràn) hoặc xảy ra (nếu tràn có dấu, tràn không dấu, đồng thời tràn có dấu và không dấu). Nói chung là có 2 trạng thái tràn: Tràn không dấu và Tràn có dấu.

Lưu ý: Nếu một giá trị có MSB=1 (bit dấu) thì CPU luôn luôn cho đó là số có dấu.

a. Tràn không dấu: CF=1

Ví dụ: ADD AX, BX ; với AX = 0FFFFh, BX = 1

  • Nếu xem đây là các số không dấu thì AX không đủ chứa kết quả nên TRÀN không dấu, vậy CF = 1
  • Nếu xem đây là các số có dấu thì kết quả sẽ là 0 (vì AX = -1) nên không tràn, do đó OF = 0

b. Tràn có dấu: OF = 1

Ví dụ: ADD AX, BX ; với AX = BX = 7FFFh = 32767

  • Nếu xem đây là các số không dấu thì AX = 7FFFh + 7FFFh = 0FFFEh = 65534 nên không tràn.
  • Nếu xem đây là các số có dấu thì tràn vì kết quả vượt quá phạm vi cho phép đối với số có dấu (cộng 2 số dương, kết quả lại là số âm). Thật sự trong trường hợp này, CPU sẽ làm cho OF = 1 theo qui tắc "Nhớ ra và vào MSB xảy ra không đồng thời” nghĩa là có nhớ vào MSB nhưng không có nhớ ra hoặc ngược lại thì tràn và không có hoặc có nhớ ra và vào MSB thì không tràn.