首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

汇编 关于获取 标志寄存器 状态的有关问题

2012-03-29 
汇编 关于获取 标志寄存器 状态的问题我传入x0,y0,相乘返回的结果判断ZF是否为1,为什么没用,哪里有问题

汇编 关于获取 标志寄存器 状态的问题
我传入x=0,y=0,相乘返回的结果判断ZF是否为1,为什么没用,哪里有问题吗
__MATHTOOL int AsmMul( const int& x, const int& y, int& result )
{
  int flag = 0;

  _asm
  {
  mov eax,dword ptr [x] 
  mov ecx,dword ptr [y] 
  mov edx,dword ptr [eax] 
  imul edx,dword ptr [ecx] 

  pushfd
  pop eax
  mov dword ptr[flag],eax

  mov eax,dword ptr [result] 
  mov dword ptr [eax],edx 
  }
  return flag;
}
而相减的有效
int AsmSub( const int& x, const int& y, int& result )
{
  int flag = 0;

  _asm
  {
  mov eax,dword ptr [x] 
  mov ecx,dword ptr [y] 
  mov edx,dword ptr [eax] 
  sub edx,dword ptr [ecx] 

  pushfd
  pop eax
  mov dword ptr[flag],eax

  mov eax,dword ptr [result] 
  mov dword ptr [eax],edx 


  }
  return flag;
}
enum ASMPSWFlag
{
FLAG_PSW_BEGIN = 1,
  FLAG_PSW_CF = FLAG_PSW_BEGIN, //!< 进位
  FLAG_PSW_PF = 1<<2, //!< 奇偶 ,奇则为1
  FLAG_PSW_AF = 1<<4, //!< 辅助进位标志
  FLAG_PSW_ZF = 1<<6, //!< 零标志,0则为1
  FLAG_PSW_SF = 1<<7, //!< 符号标志,负则为1
  FLAG_PSW_TF = 1<<8, //!< 陷阱标志
  FLAG_PSW_IF = 1<<9, //!< 中断标志
  FLAG_PSW_DF = 1<<10, //!< 方向标志, 减少则为1
  FLAG_PSW_OF = 1<<11, //!< 溢出标志, 溢出则为1
FLAG_PSW_END
};

int x = 0,y = 0, z=0;
cout << !!((AsmMul(x, y, z)) &FLAG_PSW_ZF) << "\n"; //输出的是0
cout << !!((AsmSub(x, y, z)) &FLAG_PSW_ZF) << "\n"; //1


[解决办法]
IMUL 指令会修改的标志寄存器为OSZAPC,但是仅OF及CF是文档确定的,其它几个标志寄存器的影响是 undefined 的
ref:http://ref.x86asm.net/ (X86 Opcode and Instruction Reference)

热点排行