2010-09-30 5 views
1

J'ai besoin de comprendre juste une seule instruction et en conséquence je dois généraliser les choses.Comment générer des données pour l'instruction "mov"?

Je dois passer des structures (objets de types de données définis par l'utilisateur) à l'exécution en utilisant le code d'assemblage suivant.

Où suivant est le type de données défini par l'utilisateur à savoir WESContext:

typedef struct CWESContext 
{ 

    BSTR UserName; 
    BSTR MachineIP; 
    BSTR Certificate; 
    BSTR BrowserClienthandle;//Its the handle of the BrowserClient or Java Application Level Object 
    BSTR SessionID; 
    BSTR TaskID;// name of the original task 

    long LocaleID;//The location of the ultimate Caller 
    long FeatureID;//The feature ID mapping to some feature available in WESFW 
    long SessionTypeID;//Itmay be; Browser CLient Session, OPC Client Session,    Authenticated OPC Clients session(as they have more rights), WESFWSystemClient. 

    SYSTEMTIME TimeStamp;//the time the original task was executed 
    DWORD Priority; //task priority of the original task 

    struct WESProductCategory 
    { 
     BSTR ProductCategoryName; 
     int serialNo; 

     struct WESDimensions 
     { 
      int weight;   
      struct WESVolume 
      { 
       int length; 
       int heigth; 
       int width; 
      } oVolume; 

      BSTR tempHeight; 
      BSTR otherUnknownDimensions; 
     } oDimensions;  
    } oWESProductCategory; 
} CWESContext; 

J'ai créé le bloc assez de taille WESContext et rempli avec les données de l'échantillon.

 int sizeOfWESContext = sizeof(CWESContext); 

     void *pWESContext = malloc(sizeOfWESContext); 
     void *pGenericPtr = pWESContext; 
     memset(pWESContext,0,sizeOfWESContext); 

     BSTR *bstrUserName = (BSTR*)pGenericPtr; 
     *bstrUserName = SysAllocString(CT2OLE(CA2T(results.at(0).c_str()))); 
     bstrUserName++; 

     pGenericPtr = bstrUserName; 

     BSTR *bstrMachineIp = (BSTR*)pGenericPtr; 
     *bstrMachineIp = SysAllocString(CT2OLE(CA2T(results.at(1).c_str()))); 
     bstrMachineIp++; 

     pGenericPtr = bstrMachineIp; 

     BSTR *bstrCertificate = (BSTR*)pGenericPtr; 
    *bstrCertificate = SysAllocString(CT2OLE(CA2T(results.at(2).c_str()))); 
     bstrCertificate++; 

     pGenericPtr = bstrCertificate; 

      ..................... 
      so on so forth............... 

Si je l'appelle en passant cela comme objet:

Appel Normaly: MyCallableMethodUDT (((CWESContext) pWESContext));

Maintenant, après l'assemblage je viens de tirer de la vue de désassemblage de Visual Studio pendant le débogage.

 mov   esi,dword ptr [pWESContext] 
     sub   esp,58h 
     mov   ecx,16h 
     mov   edi,esp 
     rep movs dword ptr es:[edi],dword ptr [esi] 

J'ai juste besoin de comprendre la 3e ligne ..

AS J'augmente membres à l'intérieur ma structure définie par l'utilisateur (i.e. ici WESContext) augmente, mais je ne peux pas conclure comment elle augmente ....? J'ai besoin de généraliser cette instruction de sorte que quel que soit l'objet et quelle que soit la taille et le type de données qu'il contient ... il devrait passer en l'appelant avec l'instruction d'assemblage comme écrit ci-dessus.

Cordialement, Usman

+0

VEUILLEZ formater votre code! –

Répondre

1

ecx est utilisé comme le compte pour le nombre de dwords à copier par les rep movs instructions ligne 5. Il est la copie des données à partir de l'adresse de départ pointée par esi à l'emplacement à partir de edi. La valeur de ecx correspond à la taille des données en cours de copie.

+0

Nombre de dwords, en fait. Si les ptrs étaient 'BYTE PTR', ou si l'instruction était' MOVSB', alors ce serait le nombre d'octets. Mais l'asm actuel se réunirait au même que "MOVSD". – cHao

+0

Ah, oui, je n'ai pas remarqué la présence de DWORD PTR dans l'instruction. Fixé. –

Questions connexes