示例#1
0
void BX_CPP_AttrRegparmN(1) BX_CPU_C::NOT_EqM(bxInstruction_c *i)
{
  Bit64u op1_64;

  BX_CPU_CALL_METHODR(i->ResolveModrm, (i));

  op1_64 = read_RMW_virtual_qword_64(i->seg(), RMAddr(i));
  op1_64 = ~op1_64;
  write_RMW_virtual_qword(op1_64);
}
示例#2
0
void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_EqIdM(bxInstruction_c *i)
{
  Bit64u op1_64, op2_64 = (Bit32s) i->Id();

  BX_CPU_CALL_METHODR(i->ResolveModrm, (i));

  op1_64 = read_RMW_virtual_qword_64(i->seg(), RMAddr(i));
  op1_64 &= op2_64;
  write_RMW_virtual_qword(op1_64);

  SET_FLAGS_OSZAPC_LOGIC_64(op1_64);
}
示例#3
0
void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_EqGqM(bxInstruction_c *i)
{
  Bit64u op1_64, op2_64;

  BX_CPU_CALL_METHODR(i->ResolveModrm, (i));

  op1_64 = read_RMW_virtual_qword_64(i->seg(), RMAddr(i));
  op2_64 = BX_READ_64BIT_REG(i->nnn());
  op1_64 ^= op2_64;
  write_RMW_virtual_qword(op1_64);

  SET_FLAGS_OSZAPC_LOGIC_64(op1_64);
}
示例#4
0
文件: stack64.cpp 项目: iver6/BA
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::ENTER64_IwIb(bxInstruction_c *i)
{
  Bit8u level = i->Ib2();
  level &= 0x1F;

  Bit64u temp_RSP = RSP, temp_RBP = RBP;

  temp_RSP -= 8;
  write_virtual_qword_64(BX_SEG_REG_SS, temp_RSP, temp_RBP);

  Bit64u frame_ptr64 = temp_RSP;

  if (level > 0) {
    /* do level-1 times */
    while (--level) {
      temp_RBP -= 8;
      Bit64u temp64 = read_virtual_qword_64(BX_SEG_REG_SS, temp_RBP);
      temp_RSP -= 8;
      write_virtual_qword_64(BX_SEG_REG_SS, temp_RSP, temp64);
    } /* while (--level) */

    /* push(frame pointer) */
    temp_RSP -= 8;
    write_virtual_qword_64(BX_SEG_REG_SS, temp_RSP, frame_ptr64);
  } /* if (level > 0) ... */

  temp_RSP -= i->Iw();

  // ENTER finishes with memory write check on the final stack pointer
  // the memory is touched but no write actually occurs
  // emulate it by doing RMW read access from SS:RSP
  read_RMW_virtual_qword_64(BX_SEG_REG_SS, temp_RSP);

  RBP = frame_ptr64;
  RSP = temp_RSP;

  BX_NEXT_INSTR(i);
}