Như một số câu trả lời khác cho biết, từ khóa offset
đề cập đến chênh lệch từ phân đoạn mà nó được xác định. Tuy nhiên, lưu ý rằng các phân đoạn có thể trùng lặp và chênh lệch trong một phân đoạn có thể khác nhau trong một phân đoạn khác. Ví dụ, giả sử bạn có các phân đoạn sau trong chế độ thực
data SEGMENT USE16 ;# at 02000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
Và nhìn vào đoạn mã sau:
mov ax, 2000h
mov ds, ax
mov bx, offset foo ; bx = 0100h
mov byte ptr [bx], 10 ; foo = 10
mov ax, 3000h
mov ds, ax
mov bx, offset foo; bx = 0100h
mov byte ptr [bx], 10 ; bar = 10
Các lắp ráp thấy rằng foo
là bù đắp 0100h
từ cơ sở của data SEGMENT
, vì vậy bất cứ nơi nào nó thấy offset foo
nó sẽ đặt giá trị 0100h
, bất kể giá trị của DS
vào thời điểm đó.
Trong ví dụ thứ hai DS
là 0300h
, do đó phần đáy của đoạn được trỏ đến bởi DS
là 03000h
. Điều này có nghĩa là ds:[offset foo]
trỏ đến địa chỉ 03000h + 0100h
giống với địa chỉ 02000h + 01100h
, trỏ đến bar
.
chỉnh sửa: lỗi hợp lý đã sửa trong mã
Nguồn
2009-11-03 20:02:43