J'écris en assembleur x86 32 bits, et je ne suis pas sûr de savoir comment traiter les données qui ont toujours la même relation avec le code. Dois-je utiliser EIP pour calculer l'adresse absolue, ou y a-t-il un meilleur moyen?Adressage de données à l'aide de pointeurs relatifs (assembleur x86-32)
0
A
Répondre
0
En fonction du système d'exploitation. Normalement, le segment enregistre les valeurs DS (segment de données) et CS (segment de code) différentes. Vous pouvez donc utiliser le préfixe cs comme:
mov edx, cs:[eax]
Dans ce cas, le préfixe par défaut est ds registre de segment.
1
Vous pouvez utiliser la position indépendante code:
call @f
dd 42 ; data
@@:
pop eax ; eax contains offset of data
mov eax, cs:[eax]
ou utiliser le même avec delta décalages
call base
base:
pop ebp
sub ebp, base ; to use small offsets, -128 to +127, and smaller instruction size
;....
mov eax, cs:[ebp+dataN-base] ; dataN-base is called "delta-offset"
;....
data1:
dd 100
;....
dataN:
dd 200
Je ne suis pas en utilisant un système d'exploitation. Je suis en mode protégé, donc il y a un descripteur de segment, pas un numéro de segment réel. Et dans mon cas il n'y a que deux descripteurs de segment, pour les données et le code (sans compter le null). –