sar eax, 6
...
sar eax, 0x1f
这个算术移位操作让我很困惑。了解它采用eax十六进制中的值,然后将其向右移动 by6并且下一个操作相同0x1f。看看最终结果是什么,但仍然希望更好地了解这些 Shift 操作发生了什么。说 eax was 0x3338e3e0,它究竟是如何0x00cce38f一步一步地完成的?
sar eax, 6
...
sar eax, 0x1f
这个算术移位操作让我很困惑。了解它采用eax十六进制中的值,然后将其向右移动 by6并且下一个操作相同0x1f。看看最终结果是什么,但仍然希望更好地了解这些 Shift 操作发生了什么。说 eax was 0x3338e3e0,它究竟是如何0x00cce38f一步一步地完成的?
如果您以二进制方式工作,则更容易看到发生了什么。
0x3338e3e0 is 0b00110011001110001110001111100000
将此右移 6 位(即删除最后 6 位并在开头添加 6 个零)给出 -
0b00000000110011001110001110001111
最后,将其转回十六进制给出了您问题中的价值。
0b 0000 0000 1100 1100 1110 0011 1000 1111 = 0x00CCE38F
C:\>python -c "print \"{0:8X}={0:b}\n{1:8X}={1:b}\".format(0x3338e3e0,0x3338e3e0>>6)"
3338E3E0=110011001110001110001111100000
CCE38F=110011001110001110001111