Question

Je vais par exemple un certain code assembleur en mode réel 16 bits.

Je suis venu à travers les lignes:

    mov    bx, cs
    mov    ds, bx
    mov    si, OFFSET value1
    pop    es
    mov    di, OFFSET value2

Quel est ce fait? Qu'est-ce que le fait d'avoir « OFFSET » il faire?

Était-ce utile?

La solution

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

data SEGMENT USE16 ;# at segment 0200h, linear address 2000h

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS

L'assembleur voit que foo est à 0100h décalée par rapport à la base de data SEGMENT, donc partout où il voit offset foo il mettra la 0100h valeur, quelle que soit la valeur de DS à l'époque.

Par exemple, si nous changeons DS autre chose que la base du segment data l'assembleur est en supposant:

mov ax, 200h            ; in some assemblers you can use @data for the seg base
mov ds, ax

mov bx, offset foo          ; bx = 0100h
mov byte ptr [bx], 10       ; foo = 10


mov ax, 300h
mov ds, ax

mov bx, offset foo          ; bx = 0100h
mov byte ptr [bx], 10       ; bar = 10, not foo, because DS doesn't match what we told the assembler

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

Autres conseils

Cela signifie simplement l'adresse de ce symbole. Il est un peu comme l'opérateur & C, si vous êtes au courant.

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

MASM 6.1 Guide du programmeur (Microsoft Macro assembleur)

  

OFFSET opérateur

     

Une constante d'adresse est un type spécial d'opérande immédiat qui se compose d'une valeur de décalage ou de segment. L'opérateur retourne OFFSET le décalage d'un emplacement de mémoire, comme indiqué ici:

    mov     bx, OFFSET var  ; Load offset address
     

Pour plus d'informations sur les différences entre le comportement MASM 5.1 et le comportement MASM 6.1 lié à OFFSET, voir l'annexe A.

     

Comme les données dans différents modules peuvent appartenir à un seul segment, l'assembleur ne peut pas savoir pour chaque module, les vrais décalages au sein d'un segment. Ainsi, le décalage pour var, bien qu'une valeur immédiate, n'est pas déterminé jusqu'à l'heure du lien.

Si vous lisez attentivement, la valeur finale est déterminée après vous « lien » votre code objet pour créer une DLL / EXE. Avant de relier, tout ce que vous avez est une valeur immédiate qui représente le décalage de l'adresse de base du segment.

En mode x86 16bit, l'espace d'adressage est pas plat; à la place, les adresses sont composées d'un décalage et un « segment ». Les points « segment » un espace à 64K, le décalage se situe dans cet espace.

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

offset est essentiellement la distance entre le point de segment (également appelé point de référence). par exemple adresse de segment est 0000 et le décalage d'adresse ou logique est 0100, puis l'adresse physique peut être prise en compte par l'addition des deux paires. Adresse physique = 0000 + 0100 = 0100 Signifie que notre emplacement est nécessaire sur l'adresse de 0100. De même, si l'adresse de segment est 1DDD et le décalage est 0100 alors: Adresse physique est: 1DDD + 0100 = 1EDD

signifie que notre destination est 1EDD.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top