【问题标题】:How can I extract the upper 32 bits and lower 32 bits of a 64 bit integer in assembly?如何在汇编中提取 64 位整数的高 32 位和低 32 位?
【发布时间】:2020-02-14 06:28:24
【问题描述】:

我想将一个 64 位整数的上半部分和下半部分分开,并将它们放入两个寄存器中。

【问题讨论】:

标签: assembly x86 cpu-registers


【解决方案1】:

您的问题确实不清楚。您至少应该说明您使用的是 x86 还是 x64,以及源是在寄存器中还是在内存中。

来自内存中的变量

        ; .u64 --> EDI:ESI
.u64    DQ      0x0123456789ABCDEF
        MOV     ESI, [.u64]
        MOV     EDI, [.u64 + 4]

x64,来自寄存器

        ; RBX --> EDI:ESI
        MOV     ESI, EBX
        MOV     RDI, RBX
        SHR     RDI, 32

x86,来自一对寄存器

        ; 64-bit numbers are stored in register pairs, usually EDX:EAX
        ; EDX:EAX --> EDI:ESI
        MOV     EDI, EDX
        MOV     ESI, EAX

【讨论】:

  • 您的最后一个示例是将 EDX:EAX 复制到 ESI:EDI 而不是 EDI:ESI。 (即它交换高/低两半,例如旋转 32)。
  • 另外请注意,您的 x86-64 示例不需要 mov esi, ebx,您可以评论下半部分在 ebx 中可用。使用 BMI2,如果您也不需要零扩展至 64 位,您可以rorx rdi, rbx, 32 将高半部分放入 EDI。
  • @Peter Cordes 感谢您指出粗心的错误。我做了更正。对于您的第二条评论,这实际上取决于ESI 是否会被修改。如果是这样,整个RBX 将被销毁。
  • 对,你提取高半部分,然后你可以使用EBX作为低半部分。但是,是的,如果你需要零扩展的一半,你确实需要 mov。如果您不需要保留原始 RBX,您可以 mov esi, ebx / shr rbx, 32 将 RBX 转换为 EBX:ESI。
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2019-04-15
  • 2015-06-14
  • 1970-01-01
相关资源
最近更新 更多