知识点: (NOT)按位取反指令 逻辑取反(!) 按位取反(~) SETZ(SETE) 取ZF位值保存 SETNZ(SETNE)将ZF位值取反后保存 一、逻辑取反(!) !111 =0; !0=1; SETZ(SETE) //取ZF标志位值 放到寄存器里 SETNZ(SETNE) 二、按位取反NOT指令 VC中提供运算符为(~) 11111111111111111111111111011110 //取反运算后 00000000000000000000000000100001 // asm_NOT.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int i,j; i=0x8877; j=!i; //0; __asm mov edx,edx j=~i;//00000000000000001000100001110111 //11111111111111110111011110001000 //FFFF7788 // 11011 // 00100 //00401000 /$ 55 PUSH EBP //00401001 |. 8BEC MOV EBP,ESP //00401003 |. 83EC 08 SUB ESP,8 //00401006 |. C745 FC 77880>MOV DWORD PTR SS:[EBP-4],8877 //0040100D |. 33C0 XOR EAX,EAX ; eax=0; //0040100F |. 837D FC 00 CMP DWORD PTR SS:[EBP-4],0 ; i>0 //00401013 |. 0F94C0 SETE AL ; AL=ZF //00401016 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX //00401019 |. 8BD2 MOV EDX,EDX ; __asm mov edx,edx //0040101B |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] //0040101E |. F7D1 NOT ECX ; ecx=~i; 按位与 //00401020 |. 894D F8 MOV DWORD PTR SS:[EBP-8],ECX //00401023 |. 33C0 XOR EAX,EAX //00401025 |. 8BE5 MOV ESP,EBP //00401027 |. 5D POP EBP //00401028 . C3 RETN return 0; } 小结: NOT: 取反运算,0变成1,1变成0 , 如二进制 NOT 1011=0100 AND: 按位与运算,有0为0,全1为1,如二进制 1011 AND 1101 = 1001 OR : 按位或运算, 有1为1,全0为0,如二进制 101100 OR 110101 =111101