汇编指令sar与shr
首先说下理论:
汇编语言中SAR和SHR指令都是右移指令,SAR是算数右移指令(shift arithmetic right),而SHR是逻辑右移指令(shift logical right)。
两者的区别在于SAR右移时保留操作数的符号,即用符号位来补足,而SHR右移时总是用0来补足。
例如10000000算数右移(SAR)一位是11000000,而逻辑右移(SHR)一位是01000000。
那么:
#include "stdio.h"
int main()
{
// int a=10;
// printf("%d\n",a>>2);
__asm
{
mov al,0xD5
sar al,2
}
return 0;
}
中的我们的内嵌汇编
mov al,0xD5
sar al,2
执行完之后是什么?
0xD5即 16进制D5,换算成二进制为1101 0101;sar右移2位,即相当于右移1次,再右移1次;每次补符号位1,2次右移后结果为二进制1111 0101,即为16进制F5。
执行:
mov al,0xD5
后
再执行:
sar al,2
后
这里一定要清楚,右移2次,相当于右移了2个1次,这样就容易理解为什么左边补了2个1了。