Я должен объединить два 32-разрядных значения для создавания 64-разрядной стоимости. Я ищу что-то аналогичное MAKEWORD
и MAKELONG
. Я могу легко определить свой собственный макрос или функцию, но если бы API уже обеспечивает один, я предпочел бы использовать это.
Я не могу найти ничего в Windows API. Однако я знаю, что вы в основном (или, по крайней мере, много) работаете с Delphi, поэтому вот быстрая функция Delphi:
function MAKELONGLONG(A, B: cardinal): UInt64; inline;
begin
PCardinal(@result)^ := A;
PCardinal(cardinal(@result) + sizeof(cardinal))^ := B;
end;
Еще быстрее:
function MAKELONGLONG(A, B: cardinal): UInt64;
asm
end;
Пояснение: В обычном регистре
соглашение о вызовах, первые два аргумента (если они кардинальные) сохраняются в EAX и EDX соответственно. Результат (кардинального размера) сохраняется в EAX. Теперь 64-битный результат сохраняется в EAX (младшие биты, младший адрес) и EDX (более старшие биты, старший адрес); следовательно, нам нужно переместить A
в EAX и B
в EDX, но они уже там!