2009-11-03 12 views

Répondre

15

Comme le disent certaines réponses, le mot-clé offset fait référence au décalage du segment dans lequel il est défini. Notez toutefois que les segments peuvent se chevaucher et que le décalage d'un segment peut être différent dans un autre segment. Par exemple, supposons que vous avez le segment suivant en mode réel

data SEGMENT USE16 ;# at 02000h 

    org 0100h 
    foo db 0 

    org 01100h 
    bar db 0 

data ENDS 

Et regardez le code suivant:

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 

L'assembleur voit que foo est à l'offset 0100h de la base de data SEGMENT, de sorte que chaque fois il voit offset foo il mettra la valeur 0100h, indépendamment de la valeur de DS à l'époque.

Dans le second exemple DS est 0300h, de sorte que la base du segment pointé par DS est 03000h. Cela signifie que ds:[offset foo] points à l'adresse 03000h + 0100h qui est le même que 02000h + 01100h, qui indique bar.

edit: erreur corrigée dans le code logique

6

Cela signifie simplement l'adresse de ce symbole. C'est un peu comme l'opérateur & en C, si vous êtes familier avec ça.

1

En mode x86 16 bits, l'espace adresse n'est pas plat; à la place, les adresses sont composées d'un décalage et d'un "segment". Le "segment" pointe vers un espace de 64K, le décalage est dans cet espace.

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

3

offset signifie que si registre sera égal au décalage de la variable valeur1 (pas à sa valeur réelle). Décalage est l'adresse du début du segment de mémoire où la variable est stockée. Le décalage est généralement relatif au segment ds (dans votre cas, les registres ds et cs pointent vers le même segment).

1

offset est essentiellement la distance entre le point de segment (point de référence appelé aussi). par exemple, l'adresse de segment est 0000 et le décalage ou l'adresse logique est 0100, puis l'adresse physique peut être comptée en ajoutant les deux paires. Adresse physique = 0000 + 0100 = 0100 signifie que notre emplacement requis est sur l'adresse de 0100. De même, si l'adresse de segment est 1DDD et OFFSET est 0100 alors: adresse physique est: 1DDD + 0100 = 1EDD

moyens que notre destination est 1EDD.