汇编指令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与shr

再执行:

sar al,2

汇编指令sar与shr

这里一定要清楚,右移2次,相当于右移了2个1次,这样就容易理解为什么左边补了2个1了。