Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void test_computed() {
- struct COP {
- void *label;
- WORD uop;
- BYTE iduop;
- BYTE delta_PC;
- DWORD optional;
- DWORD ops;
- };
- static COP rgcop[] = {
- &&GenEA_EDI_Disp, 0, 0, 0, 0, -8,
- &&Load_ECX_Mem32, 0, 0, 0, 0, 0,
- &&Add_ECX_Op, 0, 0, 0, 0, +5,
- &&Mov_EBX_ECX, 0, 0, 0, 0, 0,
- &&GenEA_EDI_Disp, 0, 0, 0, 0, -8,
- &&Store_ECX_Mem32, 0, 0, 0, 0, 0,
- &&Cmp_EBX_Op, 0, 0, 0, 0, -1,
- &&Load_Displac, 0, 0, 0, 0, 0,
- &&Jeq, 0, 0, 0, 0, 0,
- &&GenEA_EBP_Disp, 0, 0, 0, 0, -8,
- &&Load_EAX_Mem32, 0, 0, 0, 0, 0,
- &&Add_EAX_Op, 0, 0, 0, 0, -3, // net result is 5-3 = +2
- &&Mov_EDX_EAX, 0, 0, 0, 0, 0,
- &&GenEA_EBP_Disp, 0, 0, 0, 0, -8,
- &&Store_EAX_Mem32, 0, 0, 0, 0, 0,
- &&Cmp_EDX_Op, 0, 0, 0, 0, INSTR * LOOPS,
- &&Load_Displac, 0, 0, 0, 0, 0,
- &&Jne, 0, 0, 0, 0, 0,
- };
- const COP *copNext = NULL, *pc = rgcop;
- DWORD temp = 0;
- v_TS.EDX = 0xFFFFFFFF;
- v_TS.EBP = 8 + (ULONG_PTR)(void *)&temp;
- v_TS.EDI = 8 + (ULONG_PTR)(void *)&temp;
- printf("", &temp); // gcc needs this reference to work
- do {
- GenEA_EBP_Disp:
- v_TS.RegEA = v_TS.EBP + pc->ops;
- goto *(++pc)->label;
- GenEA_EDI_Disp:
- v_TS.RegEA = v_TS.EDI + pc->ops;
- goto *(++pc)->label;
- Load_EAX_Mem32:
- v_TS.EAX = *(DWORD *)v_TS.RegEA;
- goto *(++pc)->label;
- Load_ECX_Mem32:
- v_TS.ECX = *(DWORD *)v_TS.RegEA;
- goto *(++pc)->label;
- Store_EAX_Mem32:
- *(DWORD *)v_TS.RegEA = v_TS.EAX;
- goto *(++pc)->label;
- Store_ECX_Mem32:
- *(DWORD *)v_TS.RegEA = v_TS.ECX;
- goto *(++pc)->label;
- Add_EAX_Op:
- v_TS.EAX += pc->ops;
- goto *(++pc)->label;
- Add_ECX_Op:
- v_TS.ECX += pc->ops;
- goto *(++pc)->label;
- Mov_EDX_EAX:
- v_TS.EDX = v_TS.EAX;
- goto *(++pc)->label;
- Mov_EBX_ECX:
- v_TS.EBX = v_TS.ECX;
- goto *(++pc)->label;
- Load_Constant:
- v_TS.RegConst = pc->ops;
- goto *(++pc)->label;
- Cmp_EDX_Const:
- v_TS.RegLastRes = (v_TS.EDX - v_TS.RegConst);
- goto *(++pc)->label;
- Cmp_EBX_Const:
- v_TS.RegLastRes = (v_TS.EBX - v_TS.RegConst);
- goto *(++pc)->label;
- Cmp_EDX_Op:
- v_TS.RegLastRes = (v_TS.EDX - pc->ops);
- goto *(++pc)->label;
- Cmp_EBX_Op:
- v_TS.RegLastRes = (v_TS.EBX - pc->ops);
- goto *(++pc)->label;
- Load_Displac:
- v_TS.RegDisp = &rgcop[0];
- goto *(++pc)->label;
- FireEscape:
- if (!copNext)
- break;
- pc = copNext;
- goto *(pc)->label;
- Jeq:
- v_TS.RegEA = v_TS.EBP;
- if (v_TS.RegLastRes == 0)
- copNext = (COP*)v_TS.RegDisp;
- else
- copNext = pc + 1;
- goto FireEscape;
- Jne:
- v_TS.RegEA = v_TS.EBP;
- if (v_TS.RegLastRes != 0)
- copNext = (COP*)v_TS.RegDisp;
- else
- copNext = NULL;
- goto FireEscape;
- } while(1);
- if (v_TS.EDX != (INSTR * LOOPS))
- printf("ERROR in simulate loop, wrong value = %d\n", v_TS.EDX);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement