Chinaunix

标题: 汇编-位运算指令 [打印本页]

作者: _nosay    时间: 2016-01-07 13:16
标题: 汇编-位运算指令
本帖最后由 _nosay 于 2016-01-07 14:41 编辑

1. sal,shl

功能:
sal oprd1[, oprd2],将oprd1向左移动“1”或oprd2位(算术左移);
shl oprd1[, oprd2],将oprd1向左移动“1”或oprd2位(逻辑左移)。
它们分别期望在不溢出时,分别对有符号、无符号数翻倍,都是只需要向左移,最高位送入CF低位补0即可,所以这两条指令其实是等价的,只不过为了与sar/shr对称。


标志寄存器影响:

“OF、CF”迷雾:
OF将参与运算的数当作有符号数,关注计算结果有没有超过范围;CF将参与运算的数当作无符号数,关注计算结果有没有溢出(最高位有没有产生进/借位)。
而一个二进制数是作为正数还是负数,是根据程序的上下文含义来的,比如“1100 0000”,计算机并不知道它是192还是-64,所以就提供了OF、CF两种标志位。
CF可以直接通过最高位得到,是因为1+1肯定会进位,0+0不可能进位,仍然是CF的本质。

使用注意:
Nx2 = N+N,所以sal/shl对OF、CF标志位的影响,可以参考“add指令”,但毕竟是不同的指令,有些区别,可能要通过硬件的实现才能知道。

sar

功能:


标志寄存器影响:


使用注意:
最低位送入CF,可以看出余数的值,最高位维持不变,用于有符号的减番运算。

shr

功能:


标志寄存器影响:


使用注意:
最低位送入CF,可以看出余数的值,最高位补0,用于无符号的减番运算。

opcode:



2. ROL、ROR、RCL、RCR


标志寄存器影响:


使用注意:
据说实际运用于加密算法,或对一些运算过程进行优化,比如写了好几个指令,结果其实就是左循环移位,则可用ROL一条指令替换。

opcode:



3. or、and、xor、test、not

功能:
or oprd1, oprd2,oprd1←oprd1|oprd2;
and oprd1, oprd2,oprd1←oprd1&oprd2;
xor oprd1, oprd2,oprd1←oprd1^oprd2;
test oprd1, oprd2,oprd1&oprd2(与“and指令”区别);
not oprd,oprd←~oprd。

标志寄存器影响:
not:无
or、and、xor、test:


使用注意:
注意对操作数的要求。

opcode:





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2