2009-11-03 21 views

Odpowiedz

15

Jak mówią niektóre inne odpowiedzi, słowo kluczowe offset odnosi się do przesunięcia z segmentu, w którym zostało zdefiniowane. Należy jednak zauważyć, że segmenty mogą się nakładać, a przesunięcie w jednym segmencie może być inne w innym segmencie. Na przykład, załóżmy, że masz następujące segment w trybie rzeczywistym

data SEGMENT USE16 ;# at 02000h 

    org 0100h 
    foo db 0 

    org 01100h 
    bar db 0 

data ENDS 

Spójrz na poniższy kod:

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 

Assembler widzi, że foo jest przesunięcie 0100h od podstawy data SEGMENT, więc gdziekolwiek widzi offset foo będzie wstawiać wartość 0100h, niezależnie od wartości DS w tym czasie.

W drugim przykładzie DS jest 0300h, więc podstawą segmentu wskazywanego przez DS jest . Oznacza to, że ds:[offset foo] wskazuje na adres 03000h + 0100h, który jest taki sam jak 02000h + 01100h, co wskazuje na bar.

edit: poprawione błąd logiczny w kodzie

6

To po prostu adres tego symbolu. To trochę jak operator & w C, jeśli dobrze o tym wiesz.

1

W trybie 16-bitowym x86 przestrzeń adresowa nie jest płaska; zamiast tego adresy składają się z przesunięcia i "segmentu". "Segment" wskazuje na przestrzeń 64K, przesunięcie znajduje się w tej przestrzeni.

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

3

offset oznacza, że ​​si rejestr będzie równa offset zmiennej VALUE1 (nie do jego rzeczywistej wartości). Przesunięcie to adres od początku segmentu pamięci, w którym zapisana jest zmienna. Przesunięcie jest zwykle związane z segmentem ds (w twoim przypadku rejestry ds i cs wskazują ten sam segment).

1

offset jest zasadniczo taka odległość od punktu segmentu (zwany także punkt odniesienia). np. Adres segmentu to 0000, a adres przesunięcia lub logiczny to 0100, wtedy adres fizyczny można zliczyć, dodając dwie pary. Adres fizyczny = 0000 + 0100 = 0100 oznacza, że ​​nasz wymagana jest lokalizacja na adres 0100. Podobnie jeśli adres segment jest 1DDD i przesunięcie jest 0100 wtedy: adres fizyczny jest: 1DDD + 0100 = 1EDD

Środki naszym celem jest 1EDD.