dec指令(Dec指令)

按位与操作符,将两个操作数的对应位进行与操作。

 

与操作,在各种高级编程语言中的符号是&

运算逻辑是:对两个参与&运算的操作数的二进制的每一位数进行一一比对,只有同为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。

 


交换两个操作数的值。

 

                

转载请说明出处 内容投诉内容投诉
九幽软件 » dec指令(Dec指令)