Qu'est-OFFSET en code assembleur 16 bits signifie?
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?
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.
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.