IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Lire la valeur d'une adresse mémoire


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 43
    Points
    43
    Par défaut Lire la valeur d'une adresse mémoire
    Salam,

    J'utilise une matrice déclarée dynamiquement avec C++. J'arrive à l'initialiser avec l 'assembleur mais je n'arrive pas à lire la valeur de m[i][j] même si j 'ai son adresse mémoire dans ECX, par exemple.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov eax, [ecx]
    mov eax,  dword ptr[ecx]
    Comment dois-je faire ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    normalement ça devrait fonctionner comme ça (pour peu que tu ais la bonne adresse dans ecx...). C'est peut être un problème d'initialisation de la matrice ou de récupération de la valeur suivant la taille du type (i.e *4 pour un int!).

    Un exemple (vite codé):

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
     
    #define ROW 10
    #define COLUMN 25 
     
    int GetMatrixValue(int** pMatrix, int i, int j)
    {
    	int ret_val;
     
    	__asm{
    		; preserve regs
    		push esi 
    		push ebx
    		push edx
     
    		; get matrix pointer in source reg.
    		mov esi, pMatrix
     
    		; load indice
    		mov ebx, i
    		mov edx, j
     
    		; get address of row depending on i
    		mov esi, [esi+ebx*4]
    		; get value in row i column j
    		mov eax, [esi+edx*4]
     
    		; restore regs
    		pop edx
    		pop ebx
    		pop esi
     
    		mov ret_val, eax
    	}
     
    	return ret_val;
    }
     
    int main(void)
    {
    	int** pMatrix = NULL;
    	int i, j, count;
     
    	pMatrix = (int**)malloc(ROW * sizeof(int*));
     
    	for(i = 0; i < ROW; i++)
    		pMatrix[i] = (int*)malloc(COLUMN * sizeof(int));
     
    	count = 0;
    	for(i = 0; i < ROW; i++)
    	{
    		for(j = 0; j < COLUMN; j++)
    		{
    			pMatrix[i][j] = count;
    			count++;
    		}
    	}
     
    	//TODO: free columns and rows
     
    #if _DEBUG
    	assert( GetMatrixValue(pMatrix, 0, 0) == 0 );
    	assert( GetMatrixValue(pMatrix, 1, 0) == 25 );
    	assert( GetMatrixValue(pMatrix, 2, 1) == 51 );
    	printf("test passed!");
    #else
    	printf("matrix[0][0] = %d (expected: 0)\n", GetMatrixValue(pMatrix, 0, 0)); 
    	printf("matrix[1][0] = %d (expected: 25)\n", GetMatrixValue(pMatrix, 1, 0));
    	printf("matrix[2][1] = %d (expected: 51)\n", GetMatrixValue(pMatrix, 2, 1));
    #endif
     
    	return 0;
    }

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 43
    Points
    43
    Par défaut
    Merci pour votre réponse

    mon problème été avec le coefficient de décalage; ma matrice était de type short (*2) et moi j 'utilisais (*2) pour les deux indice alors que le premier indice doit être (*4) puisque c'est un pointeur qui est toujours codé sur 4 octets.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] lecture d'une valeur dans une adresse mémoire
    Par pixigol dans le forum C#
    Réponses: 4
    Dernier message: 29/04/2013, 20h54
  2. Comment modifier la valeur d'une adresse mémoire ?
    Par copterkill dans le forum Windows
    Réponses: 6
    Dernier message: 08/02/2009, 22h18
  3. lire le contenu d'une adresse mémoire avec VB Script
    Par pierre.zelb dans le forum VBScript
    Réponses: 2
    Dernier message: 13/12/2006, 13h32
  4. lire la valeur d'une adresse mémoire
    Par ilimo dans le forum Windows
    Réponses: 17
    Dernier message: 11/04/2006, 15h21
  5. Récupérer la valeur d'une adresse hexa 300.
    Par Cochman dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 04/06/2005, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo