Example #1
0
void SeniorVMHandle::d_sub(long _register1,long _register2)
{
  d_not(_register1);
  pop(T_INVALID);
  pop(T_TMP_REGISTER8);
  d_add(T_TMP_REGISTER8,_register2);
  //  pop(T_INVALID);
  pop(T_TMP_REGISTER6); //eflag 1
  d_copy_stack();
  d_not_and();
  pop(T_TMP_REGISTER7); //eflag 2 
  //pop(T_TMP_REGISTER8); //结果

  d_not(T_TMP_REGISTER6);
  pop(T_INVALID);
  w_push_imm_sx(0xf7ea);
  d_not_and();
  pop(T_INVALID);
  pop(T_TMP_REGISTER6);
  
  d_not(T_TMP_REGISTER7);
  pop(T_INVALID);
  w_push_imm_sx(0x815);
  d_not_and();
  pop(T_INVALID);
  pop(T_TMP_REGISTER7);
  d_add(T_TMP_REGISTER6,T_TMP_REGISTER7);
  pop(T_INVALID);
}
Example #2
0
void SeniorVMHandle::w_sub(long _register1,long _register2)
{
  w_not(_register1);  //sub eax,ebx = add((not eax),ebx) 
  pop(T_INVALID);
  pop(T_TMP_R16_8);
  b_add(T_TMP_R16_8,_register2);
  //  pop(T_INVALID);
  pop(T_TMP_REGISTER6); //eflag 1
  w_copy_stack();
  w_not_and();
  pop(T_TMP_REGISTER7); //eflag 2 
  //pop(T_TMP_REGISTER8); //结果

  d_not(T_TMP_REGISTER6);
  pop(T_INVALID);
  w_push_imm_sx(0xf7ea);
  d_not_and();
  pop(T_INVALID);
  pop(T_TMP_REGISTER6);
  
  d_not(T_TMP_REGISTER7);
  pop(T_INVALID);
  w_push_imm_sx(0x815);
  d_not_and();
  pop(T_INVALID);
  pop(T_TMP_REGISTER7);
  d_add(T_TMP_REGISTER6,T_TMP_REGISTER7);
  pop(T_INVALID);
}
Example #3
0
void SeniorVMHandle::d_and(long _register1,long _register2)
{
  d_not(_register2);
  pop(T_INVALID);
  d_not(_register1);
  pop(T_INVALID);
  db(HANDLE.d_nand.handle);
}
Example #4
0
void SeniorVMHandle::d_and(long _register1,long _register2,bool is_data)
{
  if (is_data)
  {
    d_not( _register2 , true );
    pop( T_INVALID );
    d_not( _register1 );
    pop( T_INVALID );
    db( GET_HANDLE( d_nand ) );
    return;
  }
  d_not(_register2);
  pop(T_INVALID);
  d_not(_register1);
  pop(T_INVALID);
  db(HANDLE.d_nand.handle);
}
Example #5
0
void SeniorVMHandle::d_not(long _register)
{
  if (_register == 0)
  {
    db(HANDLE.d_nand.handle);
    return;
  }
  char n = rand()%101;
  if (n <= 10)
  {
    d_not(_register); //a = nand(_r,_r);
    pop(T_INVALID);
    d_not(_register); //b = nand(_r,_r);
    pop(T_INVALID);
    db(HANDLE.d_nand.handle); //nand(a,b)
    pop(T_INVALID);
    
    d_not(_register); //a = nand(_r,_r);
    pop(T_INVALID);
    d_not(_register); //b = nand(_r,_r);
    pop(T_INVALID);
    db(HANDLE.d_nand.handle); //nand(a,b)
    pop(T_INVALID);
    db(HANDLE.d_nand.handle);
    return;
  }
  push(_register,false);
  db(HANDLE.push_stack_top_base.handle);
  db(HANDLE.d_read_mem.handle);
  //#ifndef PROTECT_X64
  //db(HANDLE.push_stack_top_base.handle);
  //db(HANDLE.d_read_mem.handle);
  //pop(_register);
  //#endif
  db(HANDLE.d_nand.handle);
}
Example #6
0
void SeniorVMHandle::d_add(long _register1,long _register2)
{

  //push(_register1,false);
  //push(_register2,false);
  //db(HANDLE.d_add);
  //return;
  
  /*  db(HANDLE.d_push_imm.handle);
  dd(1<<31);
  pcode->v_pop_register(T_TMP_REGISTER3);
  d_and(_register1,T_TMP_REGISTER3);
  pcode->v_pop_register(T_INVALID);
  db(HANDLE.b_push_imm.handle);
  db(20);
  db(HANDLE.d_shr.handle);
  pcode->v_pop_register(T_INVALID);
  pcode->v_pop_register(T_TMP_EFLAG);*/
  d_xor(_register1,_register2);
  pcode->v_pop_register(T_INVALID);
  pcode->v_pop_register(T_TMP_REGISTER1);
  d_not(T_TMP_REGISTER1);
  pcode->v_pop_register(T_INVALID);
  db(HANDLE.d_push_imm.handle);
  dd(0x80000000);
  pcode->v_pop_register(T_TMP_REGISTER2);
  pcode->v_pop_register(T_TMP_REGISTER3);
  d_and(T_TMP_REGISTER3,T_TMP_REGISTER2);
  pcode->v_pop_register(T_INVALID);
  //  db(HANDLE.b_push_imm.handle);
  //  db(20);
  //  db(HANDLE.d_shr.handle);
  //  pcode->v_pop_register(T_INVALID);
  pcode->v_pop_register(T_TMP_EFLAG);
  
  d_add_d(_register1,_register2);
 for (int i = 0; i < 31; ++i) //6次 留一次填充标志位
 {
    d_add_d(T_TMP_REGISTER2,T_TMP_REGISTER1);
 }
//pcode->v_push_register(T_TMP_R32_2);
// pcode->v_push_register(T_TMP_EFLAG);
 //pcode->v_push_register(T_TMP_REGISTER1);

  ///OF 判断是否溢出


  d_xor(_register2,T_TMP_REGISTER1);
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_REGISTER3);
 db(HANDLE.d_push_imm.handle);
 dd(0x80000000);
 pcode->v_pop_register(T_TMP_REGISTER4);
 d_and(T_TMP_REGISTER4,T_TMP_REGISTER3);
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_REGISTER3);

 d_and(T_TMP_EFLAG,T_TMP_REGISTER3);
 pcode->v_pop_register(T_INVALID);
 
 db(HANDLE.b_push_imm.handle);
 db(20);
 db(HANDLE.d_shr.handle);
 
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_REGISTER4);
 //db(HANDLE.d_push_imm.handle);
 //dd(0x800);
 //pcode->v_pop_register(T_TMP_REGISTER3);
 // d_and(T_TMP_REGISTER3,T_TMP_REGISTER4);
 // pcode->v_pop_register(T_INVALID);
 //pcode->v_pop_register(T_TMP_REGISTER3);
 //d_and(T_TMP_EFLAG,T_TMP_REGISTER3); //这时候的OF还在最高位
 //pcode->v_pop_register(T_INVALID);
 //pcode->v_pop_register(T_TMP_REGISTER3);
 //db(HANDLE.d_push_imm.handle);
 //dd(0xFFFFF7FF);
 //pcode->v_pop_register(T_TMP_REGISTER3);
 //d_or(T_TMP_REGISTER3,T_TMP_REGISTER4);
 //pcode->v_pop_register(T_INVALID);
 //pcode->v_pop_register(T_TMP_REGISTER4);
 
 d_or(T_TMP_EFLAG,T_TMP_REGISTER4);
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_EFLAG);
 /*pcode->v_push_register(T_TMP_EFLAG); 
 db(HANDLE.push_esp.handle);
 db(HANDLE.d_read_mem.handle); 
 pcode->v_pop_register(T_TMP_EFLAG);
 db(HANDLE.b_push_imm.handle);
 db(20);
 db(HANDLE.d_shl.handle);
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_REGISTER3);
 
 d_xor(_register1,T_TMP_REGISTER3);
 pcode->v_pop_register(T_INVALID);
 //pcode->v_pop_register(T_TMP_REGISTER3);
  db(HANDLE.b_push_imm.handle);
 db(20);
 db(HANDLE.d_shr.handle);
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_REGISTER4);
 db(HANDLE.d_push_imm.handle);
 dd(0x800);
 pcode->v_pop_register(T_TMP_REGISTER3);
 d_and(T_TMP_REGISTER3,T_TMP_REGISTER4);
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_REGISTER3);
 d_and(T_TMP_EFLAG,T_TMP_REGISTER3);
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_REGISTER3);
 d_or(T_TMP_EFLAG,T_TMP_REGISTER3);
 pcode->v_pop_register(T_INVALID);
 pcode->v_pop_register(T_TMP_EFLAG);*/
 /////end OF
  d_and(T_TMP_REGISTER1,T_TMP_REGISTER1);
  pcode->v_pop_register(T_TMP_REGISTER2); //EFLAG
  d_or(T_TMP_EFLAG,T_TMP_REGISTER2);
  pcode->v_pop_register(T_INVALID);
  /* 
  pcode->v_push_register(T_TMP_EFLAG);
  db(HANDLE.push_esp.handle);
  db(HANDLE.d_read_mem.handle);
  pcode->v_pop_register(T_TMP_EFLAG);
  db(HANDLE.b_push_imm.handle);
  db(31);
  db(HANDLE.d_shr.handle);
  pcode->v_pop_register(T_INVALID);
  pcode->v_pop_register(T_TMP_REGISTER3);
  d_or(T_TMP_REGISTER3,T_TMP_REGISTER2);
  pcode->v_pop_register(T_INVALID);
  /*  pcode->v_pop_register(T_TMP_REGISTER2);
  
  pcode->v_push_register(T_TMP_EFLAG);
  db(HANDLE.push_esp.handle);
  db(HANDLE.d_read_mem.handle);
  pcode->v_pop_register(T_TMP_EFLAG);
  db(HANDLE.b_push_imm.handle);
  db(3);
  db(HANDLE.d_shr.handle);
  pcode->v_pop_register(T_INVALID);
  pcode->v_pop_register(T_TMP_REGISTER3);
  d_and(T_TMP_REGISTER3,T_TMP_REGISTER2);
  pcode->v_pop_register(T_INVALID);
  pcode->v_pop_register(T_TMP_REGISTER2);

  pcode->v_push_register(T_TMP_EFLAG);
  db(HANDLE.d_push_imm.handle);
  db(1<<11);
  pcode->v_pop_register(T_TMP_REGISTER3);
  d_xor(T_TMP_REGISTER3,T_TMP_REGISTER2);
  pcode->v_pop_register(T_INVALID);
  //pcode->v_push_register(T_TMP_REGISTER3);
  pcode->v_pop_register(T_TMP_REGISTER4);
  d_and(T_TMP_REGISTER3,T_TMP_REGISTER4);
  pcode->v_pop_register(T_INVALID);
  pcode->v_pop_register(T_TMP_REGISTER4);
  d_or(T_TMP_REGISTER4,T_TMP_REGISTER2);
  pcode->v_pop_register(T_INVALID);*/
  
//db(HANDLE.push_esp.handle);
//db(HANDLE.d_read_mem.handle);

//  pcode->v_pop_register(T_EAX);
}