Chế độ địa chỉ (addressing mode) là cách để CPU tìm thấy toán hạng cho các lệnh của nó khi hoạt động. Một bộ vi xử lý có thể có nhiều chế độ địa chỉ. Các chế độ địa chỉ này được xác định ngay từ khi chế tạo ra bộ bi xử lý và sau này không thể thay đổi được. Bộ vi xử lý 8088 và cả họ 80x86 nói chung đều 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).
Chương II. Bộ vi xử lý Intel 8086
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).
II.3.2.1 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ụ II-1
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 II.3.2.2 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à vị trí của toán hạng này ở ngay sau mã lệnh. Chế độ địa chỉ này có thể được dùng để nạp dữ liệu cần thao tác vào bất kỳ thanh ghi nào (ngoại 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ụ II-2
MOV CL, 100 ; chuyển 100 vào CL.
MOV AX, 0FF0H ; chuyển 0FF0H vào AX để rồi đưa
MOV DS, AX ; vào DS (vì không thể chuyểntrực tiếp vào thanh ghi đoạn)
MOV [BX], 10 ; chỉ DS:BX.
II.3.2.3 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án hạ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.
Ví dụ II-3
MOV AL, [1234H] ;chuyển ô nhớ DS:1234 vào AL.
MOV [4320H], CX ;chuyển CX vào 2 ô nhớ liên tiếp DS:4320 và DS:4321 II.3.2.4 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ớ (8086/8088 không cho phép quy chiếu bộ nhớ 2 lần đối với một lệnh).
Ví dụ II-4
Chương II. Bộ vi xử lý Intel 8086
-25-
MOV AL, [BX] ; chuyển ô nhớ có địa chỉ DS:BX vào AL.
MOV [SI], CL ; chuyển CL vào ô nhớ có địa chỉ DS:SI.
MOV [DI], AX ; chuyển AX vào 2 ô nhớ liên tiếp tại DS:DI và DS: (DI + 1).
II.3.2.5 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 của địa chỉ so với địa chỉ cơ sở.
Ví dụ II-5
MOV CX, [BX] +10 ; chuyển 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 ô nhớ SS: [BP+5] vào AL.
ADD AL, Table [BX] ; cộng AL với ô 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.
Trong ví dụ trên:
10 và 5 là các giá trị cụ thể cho biết mức dịch chuyển của các toán hạng. Table là tên mả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 [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.
II.3.2.6 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 tạ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 hai chiều.
Ví dụ II-6
MOV AX, [ BX ] [SI ]+8 ;chuyển 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
Chương II. Bộ vi xử lý Intel 8086
MOV CL, [BP+DI+5] ; chuyển ô nhớ SS:[BP+DI+5] vào CL.
II.3.2.7 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 II-1.
Bảng II-1. Tóm tắt các chế độ địa chỉ
Chế độ địa chỉ Toán hạng Thanh ghi đoạn ngầm định
Thanh ghi Reg
Tức thì Data
Trực tiếp [offset] DS
Gián tiếp qua thanh ghi
[BX]
[SI]
[DI]
DS DS DS
Tương đối cơ sở [BX]+disp
[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
DS DS SS SS
II.3.2.8 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è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 II-2 chỉ ra các 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 định này nên trong các lệnh ta chỉ cần viểt các thanh ghi lệch là đủ cơ sở để tính ra được đia chỉ của toán hạng.
Tuy nhiên, ngoài các tổ hợp ngầm định đã kể, 8086/8088 còn cho phép ta làm việc với các tổ hợp ngầm định đã kể, 8086/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 vỏ 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.
Bảng II-2. Các cặp thanh ghi đoạn và thanh ghi lệch ngầm định
Thanh ghi đoạn CS DS ES SS
Thanh ghi lệch IP SI, DI, BX DI SP, BP
Ví dụ:
Chương II. Bộ vi xử lý Intel 8086
-27-
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 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 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 này bây giờ là ES.