有MAKELONGLONG功能吗?

Rob*_*edy 9 windows winapi

我需要组合两个32位值来创建64位值.我正在寻找类似于MAKEWORD和的东西MAKELONG.我可以轻松定义自己的宏或函数,但如果API已经提供了一个,我宁愿使用它.

And*_*and 3

我在 Windows API 中找不到任何内容。然而,我确实知道您主要(或者至少是很多)使用 Delphi,所以这里有一个快速的 Delphi 函数:

function MAKELONGLONG(A, B: cardinal): UInt64; inline;
begin
  PCardinal(@result)^ := A;
  PCardinal(cardinal(@result) + sizeof(cardinal))^ := B;
end;
Run Code Online (Sandbox Code Playgroud)

甚至更快:

function MAKELONGLONG(A, B: cardinal): UInt64;
asm
end;
Run Code Online (Sandbox Code Playgroud)

说明:在正常的register调用约定中,前两个参数(如果是基数大小)分别存储在 EAX 和 EDX 中。(基数大小的)结果存储在 EAX 中。现在,64位结果存储在EAX(较低有效位,低地址)和EDX(较高有效位,高地址)中;因此我们需要转移A到 EAX 和BEDX,但它们已经在那里了!

  • 感谢您考虑我的背景,但事实证明,我现在正在使用 C 和 C++ 工作。你的 asm 技巧很聪明。我将变量命名为“H”和“L”,以便代码完成会提醒我它们的顺序。我的 Delphi 实现与 C 实现相当:“Result := (UInt64(H) shl 32)或 L`。 (2认同)