如何将x86的eax与edx寄存器视为整体进行移位且不丢失位?
针对EDX:EAX整体移位的x86汇编解决方案
好问题!在x86汇编里确实有现成的指令能帮你把EDX:EAX当成一个64位整体来完成移位操作,完全不用自己手动处理位的转移逻辑,省了不少麻烦。
核心指令:SHLD(左移)和SHRD(右移)
x86指令集提供了**SHLD(Shift Left Double)和SHRD(Shift Right Double)**这两个专门处理双寄存器对移位的指令,完美适配你把EDX:EAX作为64位操作数的需求。
针对你举的左移23位的例子
你需要执行的指令序列非常简洁:
SHLD EDX, EAX, 23 ; 把EAX的高23位转移到EDX的低位,完成64位整体左移的高位部分 SHL EAX, 23 ; EAX自身左移23位,补0,完成64位整体左移的低位部分
指令效果验证
对应你给出的初始值:
- EDX初始为
0x00000000,EAX初始为0x6F4F6F4F(即你写的二进制0110 1111 0100 1111 0110 1111 0100 1111)
- 执行
SHLD EDX, EAX, 23:EDX会被填充为EAX的高23位,得到0x0037A7B7(对应你期望的二进制0000 0000 0011 0111 1010 0111 1011 0111) - 执行
SHL EAX, 23:EAX左移23位后补0,得到0xA7800000(对应你期望的二进制1010 0111 1000 0000 0000 0000 0000 0000)
完全和你预期的结果一致!
右移场景的处理
如果之后需要对EDX:EAX做整体右移操作,只需要用对应的SHRD指令,比如要右移n位,指令序列是:
SHRD EAX, EDX, n ; 把EDX的低n位转移到EAX的高位,完成64位整体右移的低位部分 SHR EDX, n ; EDX自身右移n位,补0,完成64位整体右移的高位部分
额外说明
如果是在64位x86模式下,你可以直接使用64位寄存器RAX,用SHL RAX, 23这样的单指令一步完成移位,但从你的描述来看你是在32位模式下用EDX:EAX模拟64位操作,那SHLD/SHRD就是最直接高效的选择。
内容的提问来源于stack exchange,提问作者Guy Sudai
相关产品推荐
相关产品推荐

