为何执行shr eax, 32指令未清空eax寄存器?
为什么
shr eax, 32没有清零EAX寄存器? 先看你运行的代码:
mov eax, 0x12345678 shr eax, 32
核心原因
x86架构的移位指令(shr/shl/sar/sal等)对移位计数值有取模规则:
- 当操作目标是32位寄存器时,计数值会自动对32取模;64位寄存器则对64取模。
- 所以
shr eax, 32等价于shr eax, 0——也就是没有执行任何移位操作,EAX的值自然保持不变。
正确的清零方式
如果需要清零EAX寄存器,推荐用以下两种高效且直观的写法:
xor eax, eax ; 最优写法,字节数更少,不占用立即数 mov eax, 0 ; 更直观的写法
补充验证
你提到“其他移位数值符合预期”,比如shr eax, 1会右移1位,shr eax, 31会右移31位;而如果写shr eax, 33,实际效果和shr eax, 1完全一致,因为33对32取模结果是1,这也印证了上述规则。
内容的提问来源于stack exchange,提问作者grandioseplayer
相关产品推荐
相关产品推荐

