Как сгенерировать данные для инструкции mov?

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

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

Где ниже указан тип данных, определяемый пользователем, а именно 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), она увеличивается, но я не могу сделать вывод, как она увеличивается....? Мне нужно сгенерировать эту инструкцию, чтобы каким бы ни был объект, каким бы ни был его размер и какие бы данные он ни содержал... он должен пройти, вызвав его с написанием инструкции по сборке, как написано выше.

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


person Hassan    schedule 30.09.2010    source источник
comment
ПОЖАЛУЙСТА, отформатируйте код!   -  person Aaron Klotz    schedule 30.09.2010


Ответы (1)


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

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

person Aaron Klotz    schedule 30.09.2010
comment
Количество двойных слов, на самом деле. Если бы указатели были BYTE PTR или инструкция была MOVSB, то это было бы количество байтов. Но текущий asm будет собираться так же, как MOVSD. - person cHao; 30.09.2010
comment
Ах да, не заметил в инструкции наличие DWORD PTR. Фиксированный. - person Aaron Klotz; 01.10.2010