2012-08-17 6 views
3

Je voudrais demander comment puis-je simuler des pointeurs C dans un assemblage 16 bits.Chargement de l'adresse en mode 16 bits

int var = 10; 
int * ptr = &var; 

Dans l'ensemble, il est comme

mov dword ptr [ebp-x], 10 
lea eax, dword ptr [ebp-x] 
mov dword ptr [ebp-x+4], eax 

Est-il possible comment obtenir l'adresse physique de la variable sur [bp-x] dans 16 assemblage. Par exemple: J'ai un programme qui lit un secteur à partir d'une disquette, puis il passe à segment:0 et l'exécute. Le programme en cours de chargement est un simple éditeur de texte. Dans l'éditeur, j'ai besoin d'obtenir l'adresse physique de la variable unique, le convertir en segment:offset et l'utiliser pour le chargement de fichier texte. J'ai essayé de mettre DS:SI avant de sauter à Exitor, mais ce n'est pas très bonne solution. Est-ce que quelqu'un sait comment le résoudre? S'il vous plaît aider.

+1

Il n'y a rien de spécial à propos d'un pointeur C ... voulez-vous dire simuler un pointeur de plus grande portée que 16 bits? –

Répondre

1

Alors ceci est votre exigence: -

mov word ptr [bp-x], 10 
lea ax, word ptr [bp-x] 
mov word ptr [bp-x+4], ax 

Vous pouvez utiliser un vieux compilateur, probablement ce beau TCC (compilateur Turbo C, 16 bits). Et cela va sortir ce dont vous avez besoin. De plus, même si vous voyez un pointeur de 16 bits, c'est juste virtuel, et son adresse réelle sera traduite selon l'architecture (comme un OS 32 bit fonctionnant en mode compatibilité sur une architecture de 64 bits).

Toutefois, si vous êtes vraiment intéressés à faire ce genre de choses, il suffit d'ouvrir cmd -> Type debug -> puis a -> et vous pouvez y écrire un peu de montage.

+0

Dois-je le charger sur eax, ou hache? C'est le mot ptr ... – user35443

+0

ax est la taille d'un mot ... obiviously c'est assez pour stocker l'adresse du mode réel. – perilbrain

+0

OK donc lea fonctionne en mode réel .. – user35443

2

Dans le mode d'adressage réel, l'adresse physique d'un octet de mémoire est égale au segment * 16 + offset.

Lorsque vous faites référence à la mémoire via [(e)bp+...] ou [esp+...], le segment par défaut impliqué est ss. Sinon, c'est ds. Un préfixe de remplacement de segment facultatif modifiera le registre de segment par défaut.

Ainsi, par exemple, si votre variable est traitée comme [bp-8], puis son adresse physique est ss*16+bp-8.