Advertisement
fastman92

x86 argument encoding

Jul 28th, 2015
416
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. // Documentation created by fastman92
  2.  
  3.  
  4. movsx
  5.  
  6.        
  7. struct COperand
  8. {
  9.     bool bIsMemoryOperand;
  10.    
  11.     union
  12.     {
  13.         int iCPUregister;
  14.        
  15.         struct
  16.         {
  17.             int registerUnmultiplied;
  18.             int registerMultiplied;
  19.             int registerMultipliedShift;
  20.             int addValue;
  21.         } memoryOperand;
  22.     };
  23. };
  24.        
  25. int type = argData[0] bits 7 to 5
  26.  
  27. int addValueOffset;
  28.  
  29. COperand op[2];
  30.  
  31. if(type == 0)
  32.     op[0].iCPUregister = argData[0] bits 3 to 5
  33.     op[1].memoryOperand.registerUnmultiplied = -1;
  34.     op[1].memoryOperand.registerMultiplied = -1;
  35.     op[1].memoryOperand.addValue = 0;
  36.    
  37.     int registerUnmultiplied = argData[0] bits 0 to 2
  38.    
  39.     // example
  40.     // second operand, related to registerUnmultiplied
  41.     // default: [ecx], can't be [esp] and [ebp], but [esp * 1] or [ebp * 1]
  42.     // on value 4: [ecx*4+eax]
  43.     // on value 5: [535353h]
  44.    
  45.     if registerUnmultiplied == 4
  46.         op[1].memoryOperand.registerUnmultiplied = argData[1] bits 0 to 2
  47.         op[1].memoryOperand.registerMultiplied = argData[1] bits 3 to 5
  48.         op[1].memoryOperand.registerMultipliedShift = argData[1] bits 6 to 7
  49.     else if registerUnmultiplied == 5
  50.         op[1].bIsMemoryOperand = true;
  51.         op[1].memoryOperand.addValue = *(__int32*)argData + 1;
  52.     else
  53.         op[1].memoryOperand.registerUnmultiplied = registerUnmultiplied;
  54.    
  55. else if(type == 1 || type == 2)     // adding __int8 or __int32 value
  56.     op[0].iCPUregister = argData[0] bits 3 to 5;
  57.     op[1].memoryOperand.registerUnmultiplied = -1;
  58.     op[1].memoryOperand.registerMultiplied = -1;
  59.     op[1].memoryOperand.addValue = 0;
  60.    
  61.     int registerUnmultiplied = argData[0] bits 0 to 2
  62.    
  63.     // example
  64.     // second operand, related to registerUnmultiplied
  65.     // default: [ecx+24]
  66.     // on value 4: movsx eax,word ptr [eax+edx*2-70] or movsx eax,word ptr [eax-70]
  67.    
  68.     if registerUnmultiplied == 4
  69.         op[1].memoryOperand.registerUnmultiplied = argData[1] bits 0 to 2
  70.         op[1].memoryOperand.registerMultiplied = argData[1] bits 3 to 5
  71.        
  72.             if(op[1].memoryOperand.registerMultiplied != 4)
  73.                 op[1].memoryOperand.registerMultipliedShift = argData[1] bits 6 to 7
  74.             else
  75.                 op[1].memoryOperand.registerMultiplied -1;
  76.        
  77.         addValueOffset = 2;
  78.         op[1].memoryOperand.addValue = *(__int8*)argData + 2;
  79.     else
  80.         op[1].memoryOperand.registerUnmultiplied = registerUnmultiplied;       
  81.         addValueOffset = 2;
  82.        
  83.     if(type == 1)
  84.         op[1].memoryOperand.addValue = *(__int8*)argData + addValueOffset;
  85.     else
  86.         op[1].memoryOperand.addValue = *(__int32*)argData + addValueOffset;
  87. else if(type == 3)
  88.    
  89.     // example: movsx eax, cx
  90.     op[0].iCPUregister = argData[0] bits 3 to 5;
  91.     op[1].iCPUregister = argData[0] bits 0 to 2;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement