2009-11-03 45 views

Trả lời

15

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 DS0300h, do đó phần đáy của đoạn được trỏ đến bởi DS03000h. Đ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ã

6

Nó chỉ có nghĩa là địa chỉ của biểu tượng đó. Nó giống như toán tử & trong C, nếu bạn quen thuộc với điều đó.

1

Ở chế độ 16 bit x86, không gian địa chỉ không bằng phẳng; thay vào đó, các địa chỉ bao gồm một phần bù và một "phân đoạn". Các "phân đoạn" điểm đến một không gian 64K, bù đắp là trong không gian đó.

Xem http://en.wikipedia.org/wiki/Memory_segmentation

3

offset nghĩa là si đăng ký sẽ bằng offset của biến value1 (không có giá trị thực tế của nó). Offset là địa chỉ từ đầu phân đoạn bộ nhớ, nơi biến được lưu trữ. Giá trị bù trừ thường tương ứng với phân đoạn ds (trong trường hợp của bạn là dscs sổ đăng ký đang trỏ đến cùng một phân đoạn).

1

Bù đắp về cơ bản là khoảng cách từ điểm phân đoạn (còn gọi là điểm mốc). ví dụ địa chỉ phân đoạn là 0000 và địa chỉ offset hoặc địa chỉ logic là 0100 thì địa chỉ thực có thể được tính bằng cách thêm hai cặp. Physical Address = 0000 + 0100 = 0100 nghĩa là vị trí đòi hỏi của chúng tôi là trên địa chỉ của 0100. Tương tự, nếu địa chỉ bộ phận là 1DDD và bù đắp là 0100 thì: địa chỉ vật lý là: 1DDD + 0100 = 1EDD

Phương tiện điểm đến của chúng tôi là 1EDD.

Các vấn đề liên quan