汇编 关于获取 标志寄存器 状态的问题
我传入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)