Как генерировать данные для инструкции "mov"? - PullRequest
1 голос
/ 30 сентября 2010

Мне нужно понять только одну единственную инструкцию и, соответственно, мне нужно обобщить вещи.

Мне нужно передать структуры (объекты пользовательских типов данных) во время выполнения, используя следующий код сборки.

Где ниже указан пользовательский тип данных, а именно 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;

Я создал блок достаточного размера WESContext и заполнил его образцами данных.

      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...............

Если я вызываю это, передавая это как объект:

Вызов Нормалы: MyCallableMethodUDT ( ((CWESContext ) pWESContext));

Теперь, после сборки, я только что вытащил из представления Dissasembly Visual Studio во время отладки.

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

Мне просто нужно понять 3-ю строку ..

КАК я увеличиваю количество членов в моей пользовательской структуре (т. Е. Здесь WESContext), она увеличивается, но я не могу понять, как она увеличивается ....? Мне нужно сгенерировать эту инструкцию так, чтобы независимо от того, каким был бы Объект, каким бы ни был размер и какие бы данные он ни содержал ... он должен пройти, вызвав его с записью инструкции сборки, как написано выше.

С уважением, Усман

1 Ответ

1 голос
/ 30 сентября 2010

ecx используется в качестве числа для количества слов, которые будут скопированы инструкциями rep movs в строке 5. Он копирует данные со начального адреса, на который указывает esi, в местоположение, начинающееся с edi.

Значение в ecx будет размером копируемых данных.

...