按位与操作符,将两个操作数的对应位进行与操作。
与操作,在各种高级编程语言中的符号是&
运算逻辑是:对两个参与&运算的操作数的二进制的每一位数进行一一比对,只有同为1的情况下结果得1,否则得0
举例:
(十进制)10 & 20 == (二进制)0000 1010 &?0001 0100
结果:(二进制)0000 0000 == (十进制)0
(十进制)11 & 22 == (二进制)0000 1011 &?0001 0110
结果:(二进制)0000 0010 == (十进制)2
下面进行汇编演示:

按位或操作符,将两个操作数的对应位进行或操作。
或操作,在各种高级编程语言中的符号是|
运算逻辑是:对两个参与|运算的操作数的二进制的每一位数进行一一比对,只有dec指令同为0的情况下结果得0,否则得1
举例:
(十进制)10 | 20 == (二进制)0000 1010 |?0001 0100
结果:(二进制)0001 1110 == (十进制)30
(十进制)11 |?22 == (二进制)0000 1011 |?0001 0110
结果:(二进制)0001 1111 == (十进制)31
下面进行汇编演示:

将操作数的值取反(按位取反)然后加 1。
dec指令
在各种高级编程语言中,取反的符号是~,但并没有直接取补的符号
取反运算逻辑是:对操作数的二进制形式,将其中的1变为0,0变为1
neg指令就是对操作数先取反再加1,也就是求补码(不清楚的可以去查阅原、反、补码的知识点)的操作
举例:
~(十进制)2 == ~(二进制)0000 0010 == (二进制)1111 1101 == (十六进制)FD
注意,此处只是拿8个比特位的进制数进行演示,如果是16比特位,第9位及其左边的0也该相应变成1,得到的十六进制结果则为FFFD
因此neg ax,当ax的值为2时,
得到的结果应该是FFFD+1==FFFE

将指定的操作数向左移动指定的位数。
将指定的操作数向右移动指定的位数。
位移操作,在各种高级编程语言中的符号是<<(左移),>>(右移)
运算逻辑是:对操作数的二进制形式整体左(右)移指定位数,另外一边补0,最后被移出的一位放在进位标志CF中
举例:
(十进制)11 >> 2 == (二进制)0000 1011 >> 2 == (二进制)0000 0010?== (十进制)2
(十进制)22 << 1 == (二进制)0001 0110?<< 1?== (二进制)0010 1100 == (十进制)44
规律:对于一个十进制数来说,每左移一位相当于乘2,每右移一位相当于整除2,为什么右移是整除?因为右移后末尾如果是1就直接去掉了(当然这是对于直观计算结果来说的,汇编中,如果最后右移末尾是1,它不会被丢弃,而是存放在进位标志CF中(CF标志即carry flag,在上一篇介绍寄存器时有提到过->速通汇编(三)寄存器及汇编mul、div指令_汇编div-CSDN博客)
注意:上面的举例只是为了解释清楚位移运算的逻辑,如果位移数大于1,不能直接写【shr ax,2】,必须将2存放在寄存器cl中,写成【shr ax,al】,否则会报错
下面的汇编演示也将体现这点
下面进行汇编演示:

将操作数的值增加 1。
将操作数的值减去 1。

交换两个操作数的值。
