Cách định địa chỉ trực tiếp thì sử dụng rất tiện lợi cho các trường hợp truy cập bộ nhớ không thường xuyên vùng dữ liệu truy cập chỉ có 1 hoặc 2 byte hoặc word. Trong trường hợp vùng dữ liệu nhiều và liên tục thì cách dùng địa chỉ trực tiếp là không hiệu quả ví dụ copy dữ liệu từ vùng nhớ này sang vùng nhớ khác với dung lượng dữ liệu là vài trăm byte.
Cách thực hiện tốt nhất là kiểu định địa chỉ gián tiếp dùng thanh ghi, trong đó địa chỉ của nguồn dữ liệu do 1 thanh ghi quản lý và địa chỉ đích của nguồn dữ liệu do 1 thanh ghi khác quản lý và dĩ nhiên là phải kết hợp với thanh ghi đoạn. Ngoài ra độ dời bù 2 có thể được cộng vào thanh ghi pointer và thanh ghi index để dời đi so với vị trí được chỉ đến. Bảng sau trình bày nhiều kết hợp có thể sử dụng:
Cách định địa chỉ Địa chỉ hiệu dụng
Độ dời Thanh ghi nền Thanh ghi chỉ số Gián tiếp thanh ghi Không có +
Không có +
BX hoặc BP + Không có +
Không có SI hoặc DI
Có chỉ số -128 đến 127 + Không có + SI hoặc DI
Có nền -128 đến 127 + BX hoặc BP + Không có
Có nền và có chỉ số Không có + BX hoặc BP + SI hoặc DI Có nền, có chỉ số với độ dời -128 đến 127 + BX hoặc BP + SI hoặc DI Bảng 3-6. Tính toán địa chỉ hiệu dụng cho các cách định địa chỉ gián tiếp.
Tổng quát thì một độ dời có thể được cộng vào thanh ghi nền và cộng với thanh ghi index để tạo ra địa chỉ thật hay địa chỉ hiệu dụng EA (effective address).
Trong lập trình ta có thể sử dụng cách định địa chỉ gián tiếp dưới dạng như sau: MOV AX,TABLE[SI]
Trong đó SI là nhãn cho trước của vùng dữ liệu lưu trong bộ nhớ. Định địa chỉ gián tiếp thanh ghi
Cách định địa chỉ dùng thanh ghi giống như cách định địa chỉ trực tiếp tuy nhiên địa chỉ offset được lưu trong thanh ghi.
Địa chỉ offset có thể lưu trữ ở các thanh ghi BP, BX, Di hoặc SI. Các dấu ngoặc vuông [ ] dùng để chỉ cách định địa chỉ gián tiếp.
Ví dụ lệnh MOV AX, [SI]
Lệnh có chức năng “copy dữ liệu trong ô nhớ có địa chỉ offset lưu trong thanh ghi SI trong data segment hiện tại vào thanh ghi AX” và quá trình được thực hiện như hình 3-16a và 3- 16b.
Trong lệnh này thì địa chỉ offset lưu trong SI bằng 1234H nằm trong vi xử lý. Địa chỉ offset này được cộng thêm địa chỉ của thanh ghi DS hiện hành sau khi dịch sang phải 4 bit như sau:
Truong DH SPKT TP. HCM http://www.hcmute.edu.vn
PA = 02000H + 1234H = 03234H Chính là địa chỉ của ô nhớ cần truy xuất dữ liệu.
Hình 3-16a. Trước khi thực hiện lệnh MOV AX,[SI].
Hình 3-16b. Sau khi thực hiện lệnh MOV AX,[SI].
Sau khi thực hiện lệnh thì thanh ghi IP tăng lên 2 đơn vị vì mã của lệnh này bằng 2 byte, dữ liệu trong 2 ô nhớ liên tiếp có địa chỉ 03234H và 03235H được copy vào thanh ghi AX theo thứ tự byte thấp trước byte cao sau.
Chương 3: Cấu trúc vi xử lý 8086/8088. SPKT Ví dụ: lệnh MOV [DI],10H là lệnh không rõ ràng và có thể hiểu là cất dữ liệu 10H vào ô nhớ byte hay word. Để tránh hiểu nhầm ta phải thêm chỉ dẫn BYTE PTR hay WORD PTR như sau:
MOV BYTE PTR [DI], 10H MOV WORD PTR [DI], 10H
Cách định địa chỉ gián tiếp thanh ghi thường được dùng để truy xuất bảng dữ liệu trong bộ nhớ.
Định địa chỉ nền (base addressing):
Trong cách định địa chỉ này thì địa chỉ thật của ô nhớ chứa toán hạng được tính toán bằng cách cộng độ dời gián tiếp hoặc trực tiếp với nội dung của thanh ghi BX hoặc thanh ghi BP và cộng với nội dung thanh ghi đoạn DS hoặc SS theo thứ tự.
Ví dụ lệnh MOV [BX] + BETA, AL
Lệnh có chức năng “copy dữ liệu trong thanh ghi AL sang ô nhớ có địa chỉ offset bằng giá trị lưu trong thanh ghi BX với hằng số BETA trong data segment hiện tại” và quá trình được thực hiện như hình 3-17a và 3-17b.
Trong lệnh này thì giá trị lưu trong thanh ghi BX bằng 1000H nằm trong vi xử lý, giá trị BETA bằng 1234H nên địa chỉ offset bằng 2234H. Địa chỉ offset này được cộng thêm địa chỉ của thanh ghi DS hiện hành sau khi dịch sang phải 4 bit như sau:
PA = 02000H + 2234H = 04234H Chính là địa chỉ của ô nhớ cần truy xuất dữ liệu.
Hình 3-17a. Trước khi thực hiện lệnh MOV [BX] +BETA,AL.
Truong DH SPKT TP. HCM http://www.hcmute.edu.vn
Hình 3-17b. Sau khi thực hiện lệnh MOV [BX] +BETA,AL.
Sau khi thực hiện lệnh thì thanh ghi IP tăng lên 4 đơn vị vì mã của lệnh này bằng 4 byte, dữ liệu trong ô nhớ có địa chỉ 04234H mang giá trị bằng EDH.
Độ dời 8 bit hay 16 bit phải xuất hiện trong vùng toán hạng và được xem là số nhị phân có dấu. Với số nhị phân 8 bit thì độ dời phải nằm trong tầm từ -128 ÷ +127, với số nhị phân 16 bit thì độ dời phải nằm trong tầm từ -32768 ÷ +32767.
Định địa chỉ chỉ số (index addressing):
Giống như kiểu định địa chỉ nền nhưng thanh ghi sử dụng là thanh ghi SI hoặc DI. Toán hạng có địa chỉ là tổng của độ dời của số nhị phân có dấu 8 bit hay 16 bit với thanh ghi SI hoặc DI và kết hợp với thanh ghi đoạn (mặc nhiên là DS).
Ví dụ lệnh MOV AL, [SI] + ARRAY
Lệnh có chức năng “copy dữ liệu trong ô nhớ có địa chỉ offset bằng giá trị lưu trong thanh ghi SI với hằng số ARRAY trong data segment hiện tại sang thanh ghi AL” và quá trình được thực hiện như hình 3-18a và 3-18b.
Trong lệnh này thì giá trị lưu trong thanh ghi SI bằng 2000H nằm trong vi xử lý, giá trị ARRAY bằng 1234H nên địa chỉ offset bằng 3234H. Địa chỉ offset này được cộng thêm địa chỉ của thanh ghi DS hiện hành sau khi dịch sang phải 4 bit như sau:
PA = 02000H + 3234H = 05234H Chính là địa chỉ của ô nhớ cần truy xuất dữ liệu.
Chương 3: Cấu trúc vi xử lý 8086/8088. SPKT
Hình 3-18a. Trước khi thực hiện lệnh MOV AL,[SI] +ARRAY.
Hình 3-18b. Sau khi thực hiện lệnh MOV AL,[SI] +ARRAY.
Sau khi thực hiện lệnh thì thanh ghi IP tăng lên 4 đơn vị vì mã của lệnh này bằng 4 byte, dữ liệu trong ô nhớ có địa chỉ 04234H mang giá trị bằng EDH được copy sang thanh ghi AL.
Cách định địa chỉ nền và cách định địa chỉ chỉ số còn được gọi là cách định địa chỉ tương đối dùng thanh ghi.
Định địa chỉ nền – chỉ số với độ dời :
Truong DH SPKT TP. HCM http://www.hcmute.edu.vn
Các thanh ghi nền và thanh ghi chỉ số được cộng vào để tạo địa chỉ offset. Thanh ghi nền BX hay BP được cộng với thanh ghi chỉ số SI hoặc DI.
Ví dụ lệnh MOV AH, [BX][SI] + BETA
Lệnh có chức năng “copy dữ liệu trong ô nhớ có địa chỉ offset bằng giá trị lưu trong thanh ghi BX cộng với giá trị lưu trong thanh ghi BX với hằng số ARRAY trong data segment hiện tại sang thanh ghi AH” và quá trình được thực hiện như hình 3-19a và 3-19b.
Trong lệnh này thì giá trị lưu trong thanh ghi BX bằng 12000H, cộng với giá trị lưu trong thanh ghi SI bằng 2000H nằm trong vi xử lý, giá trị ARRAY bằng 1234H nên địa chỉ offset bằng 4234H. Địa chỉ offset này được cộng thêm địa chỉ của thanh ghi DS hiện hành sau khi dịch sang phải 4 bit như sau:
PA = 02000H + 4234H = 065234H Chính là địa chỉ của ô nhớ cần truy xuất dữ liệu.
Hình 3-19a. Trước khi thực hiện lệnh MOV AX,[BX] [SI] +BETA.
Chương 3: Cấu trúc vi xử lý 8086/8088. SPKT
Hình 3-19b. Sau khi thực hiện lệnh MOV AX,[BX] [SI] +BETA.
Sau khi thực hiện lệnh thì thanh ghi IP tăng lên 4 đơn vị vì mã của lệnh này bằng 4 byte, dữ liệu trong ô nhớ có địa chỉ 04234H mang giá trị bằng BEH được copy sang thanh ghi AH.