Существует ли функция MAKELONGLONG?

Я должен объединить два 32-разрядных значения для создавания 64-разрядной стоимости. Я ищу что-то аналогичное MAKEWORD и MAKELONG. Я могу легко определить свой собственный макрос или функцию, но если бы API уже обеспечивает один, я предпочел бы использовать это.

9
задан skaffman 12 August 2010 в 21:00
поделиться

1 ответ

Я не могу найти ничего в 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, но они уже там!

3
ответ дан 5 December 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: