x64 和 x32 汇编中的 Mul(乘法)

逆向工程 二元分析 x86 恶意软件 amd64
2021-07-10 19:28:56

我是恶意软件逆向工程的新手。我陷入了一种困惑,

我研究了在 x32 中,mul 指令将源与 eax 寄存器相乘,并将结果存储为跨两个寄存器的 64 位值,即 EDX:EAX。EDX 存储 32 位操作的最高有效位,而 EAX 也是如此。所以,我的问题是 x64 中会发生什么?乘法后值如何存储在 RAX:RDX 中。我也 ping 谷歌,但不太明白。希望大家踊跃回答。

1个回答

根据文档第 1320 页

结果存储在寄存器 AX、寄存器对 DX:AX 或寄存器对 EDX:EAX(取决于操作数大小)中,乘积的高位分别包含在寄存器 AH、DX 或 EDX 中。如果乘积的高位为0,则清除CF和OF标志;否则,设置标志。在 64 位模式下,指令的默认操作大小为 32 位。使用 REX.R 前缀允许访问附加寄存器 (R8-R15)。使用 REX.W 前缀将操作提升到 64 位。有关编码数据和限制,请参阅本节开头的摘要图表。

多表

用这个指令序列可以看出

mov rdx, 0x1234567890abcdef
mov rax, 0x100
mul rdx

在最后一条指令之后

$rax   : 0x34567890abcdef00
$rdx   : 0x12

RDX 具有预期的高 64 位。