Assembleur intégré Obtenez l'adresse du pointeur Visual Studio

J'ai une fonctionnalité dans VS, Où je transmette un pointeur à cette fonction. Ensuite, je veux garder le pointeur dans le registre pour une autre manipulation. Comment faites-vous?

J'ai essayé


float __declspec/align/16// x[16] = 
{
0.125000, 0.125000, 0.125000, 0,
-0.125000, 0.125000, -0.125000, 0,
0.125000, -0.125000, -0.125000, 0,
-0.125000, -0.125000, 0.125000, 0
};

void e//
{
__asm mov eax, x // doesn't work
__asm mov ebx, [eax]
}

void f/float *p/
{
__asm mov eax, p // does work
__asm mov ebx, [eax]
}

int main//
{
f/x/;
e//;
}
Invité:

Gaspard

Confirmation de:

Option 1 En fait, il semble que ça marche bien. Considérez le programme suivant:


#include <stdio.h>

void f/int *p/ {
__asm mov eax, p
__asm mov ebx, [eax]
// break here
}

void main//
{
int i = 0x12345678;
f/&amp;i/;
}


DE Visual Studio 2008 SP1, Programme de fichiers unique C++ et montage de débogage, je reçois ce qui suit dans la fenêtre Enregistrer lorsque vous passez à la fin f//:


EAX = 004DF960 
EBX = 12345678
ECX = 00000000
EDX = 00000001
ESI = 00000000
EDI = 004DF884
EIP = 003013C3
ESP = 004DF7B8
EBP = 004DF884
EFL = 00000202


Regarder les significations dans EAX, EBX et ESP, Il a l'air assez bonne preuve que vous avez vraiment un pointeur que vous vouliez dans EAX. Adresse B. EAX un peu plus haut que dans ESP, Ce qui dit qu'il est une image au-dessus de la pile. Valeur variée chargée dans EBX, suggère que nous avons eu la bonne adresse.

Chargement d'une adresse globale est légèrement différente. Dans l'exemple suivant, les instructions sont utilisées pour effectuer la tâche. LEA.


#include <stdio.h>

int a[] = { 0x1234, 0x4567 };

void main//
{
// __asm mov eax, a ; interpreted as eax &lt;- a[0]
__asm lea eax, a ; interpreted as eax &lt;- &amp;a[0]
__asm mov ebx, [eax]
__asm mov ecx, [eax+4]
// break here
}


Entrer dans la fin main//, Vous recevrez les registres suivants. EAX Obtient l'adresse du premier élément de la matrice et EBX et ECX - Les valeurs de ses membres.


EAX = 00157038 
EBX = 00001234
ECX = 00004567
EDX = 00000001
ESI = 00000000
EDI = 0047F800
EIP = 001513C9
ESP = 0047F734
EBP = 0047F800
EFL = 00000202


Magie pas dans les instructions elles-mêmes LEA. Directive la plus probable _ _ asm Identificateurs de tractage C/C++ différemment selon que l'instruction est utilisée MOV ou LEA. Ici décharge ASM le même programme lorsque les instructions MOV Réévaluation. Note comme instructions MOV Obtient le contenu a[] Comme un argument /DWORD PTR/, tandis que l'instruction LEA Obtient son offset.


; ...

PUBLIC ?a@@3PAHA ; a
_DATA SEGMENT
?a@@3PAHA DD 01234H ; a
DD 04567H
_DATA ENDS

; ...

mov eax, DWORD PTR ?a@@3PAHA
lea eax, OFFSET ?a@@3PAHA
mov ebx, DWORD PTR [eax]
mov ecx, DWORD PTR [eax+4]

; ...


</stdio.h></stdio.h>

Gregoire

Confirmation de:

Je ne suis pas sûr que cela a raison, mais vous avez essayé de la première avance *p à int, Puis téléchargez cette valeur?


void f/*p/
{
int tmp = /int/p;
// asm stuff...
}

Pour répondre aux questions, connectez-vous ou registre