Advertisement
Guest User

Untitled

a guest
May 27th, 2011
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1. void test_computed() {
  2.   struct COP {
  3.     void *label;
  4.     WORD uop;
  5.     BYTE iduop;
  6.     BYTE delta_PC;
  7.     DWORD optional;
  8.     DWORD ops;
  9.   };
  10.  
  11.   static COP rgcop[] = {
  12.     &&GenEA_EDI_Disp,  0, 0, 0, 0, -8,
  13.     &&Load_ECX_Mem32,  0, 0, 0, 0, 0,
  14.     &&Add_ECX_Op,      0, 0, 0, 0, +5,
  15.     &&Mov_EBX_ECX,     0, 0, 0, 0, 0,
  16.     &&GenEA_EDI_Disp,  0, 0, 0, 0, -8,
  17.     &&Store_ECX_Mem32, 0, 0, 0, 0, 0,
  18.     &&Cmp_EBX_Op,      0, 0, 0, 0, -1,
  19.     &&Load_Displac,    0, 0, 0, 0, 0,
  20.     &&Jeq,             0, 0, 0, 0, 0,
  21.  
  22.     &&GenEA_EBP_Disp,  0, 0, 0, 0, -8,
  23.     &&Load_EAX_Mem32,  0, 0, 0, 0, 0,
  24.     &&Add_EAX_Op,      0, 0, 0, 0, -3,   // net result is 5-3 = +2
  25.     &&Mov_EDX_EAX,     0, 0, 0, 0, 0,
  26.     &&GenEA_EBP_Disp,  0, 0, 0, 0, -8,
  27.     &&Store_EAX_Mem32, 0, 0, 0, 0, 0,
  28.     &&Cmp_EDX_Op,      0, 0, 0, 0, INSTR * LOOPS,
  29.     &&Load_Displac,    0, 0, 0, 0, 0,
  30.     &&Jne,             0, 0, 0, 0, 0,
  31.   };
  32.  
  33.   const COP *copNext = NULL, *pc = rgcop;
  34.   DWORD temp = 0;
  35.  
  36.   v_TS.EDX    = 0xFFFFFFFF;
  37.   v_TS.EBP    = 8 + (ULONG_PTR)(void *)&temp;
  38.   v_TS.EDI    = 8 + (ULONG_PTR)(void *)&temp;
  39.  
  40.   printf("", &temp);  // gcc needs this reference to work
  41.  
  42.   do {
  43.   GenEA_EBP_Disp:
  44.     v_TS.RegEA = v_TS.EBP + pc->ops;
  45.     goto *(++pc)->label;
  46.  
  47.   GenEA_EDI_Disp:
  48.     v_TS.RegEA = v_TS.EDI + pc->ops;
  49.     goto *(++pc)->label;
  50.  
  51.   Load_EAX_Mem32:
  52.     v_TS.EAX = *(DWORD *)v_TS.RegEA;
  53.     goto *(++pc)->label;
  54.  
  55.   Load_ECX_Mem32:
  56.     v_TS.ECX = *(DWORD *)v_TS.RegEA;
  57.     goto *(++pc)->label;
  58.  
  59.   Store_EAX_Mem32:
  60.     *(DWORD *)v_TS.RegEA = v_TS.EAX;
  61.     goto *(++pc)->label;
  62.  
  63.   Store_ECX_Mem32:
  64.     *(DWORD *)v_TS.RegEA = v_TS.ECX;
  65.     goto *(++pc)->label;
  66.  
  67.   Add_EAX_Op:
  68.     v_TS.EAX += pc->ops;
  69.     goto *(++pc)->label;
  70.  
  71.   Add_ECX_Op:
  72.     v_TS.ECX += pc->ops;
  73.     goto *(++pc)->label;
  74.  
  75.   Mov_EDX_EAX:
  76.     v_TS.EDX = v_TS.EAX;
  77.     goto *(++pc)->label;
  78.  
  79.   Mov_EBX_ECX:
  80.     v_TS.EBX = v_TS.ECX;
  81.     goto *(++pc)->label;
  82.  
  83.   Load_Constant:
  84.     v_TS.RegConst = pc->ops;
  85.     goto *(++pc)->label;
  86.  
  87.   Cmp_EDX_Const:
  88.     v_TS.RegLastRes = (v_TS.EDX - v_TS.RegConst);
  89.     goto *(++pc)->label;
  90.  
  91.   Cmp_EBX_Const:
  92.     v_TS.RegLastRes = (v_TS.EBX - v_TS.RegConst);
  93.     goto *(++pc)->label;
  94.  
  95.   Cmp_EDX_Op:
  96.     v_TS.RegLastRes = (v_TS.EDX - pc->ops);
  97.     goto *(++pc)->label;
  98.  
  99.   Cmp_EBX_Op:
  100.     v_TS.RegLastRes = (v_TS.EBX - pc->ops);
  101.     goto *(++pc)->label;
  102.  
  103.   Load_Displac:
  104.     v_TS.RegDisp = &rgcop[0];
  105.     goto *(++pc)->label;
  106.  
  107.   FireEscape:
  108.     if (!copNext)
  109.       break;
  110.     pc = copNext;
  111.     goto *(pc)->label;
  112.  
  113.   Jeq:
  114.     v_TS.RegEA = v_TS.EBP;
  115.     if (v_TS.RegLastRes == 0)
  116.       copNext = (COP*)v_TS.RegDisp;
  117.     else
  118.       copNext = pc + 1;
  119.     goto FireEscape;
  120.  
  121.   Jne:
  122.     v_TS.RegEA = v_TS.EBP;
  123.     if (v_TS.RegLastRes != 0)
  124.       copNext = (COP*)v_TS.RegDisp;
  125.     else
  126.       copNext = NULL;
  127.     goto FireEscape;
  128.   } while(1);
  129.  
  130.   if (v_TS.EDX != (INSTR * LOOPS))
  131.     printf("ERROR in simulate loop, wrong value = %d\n", v_TS.EDX);
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement