You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:53:12