Я всегда предпочитаю быть явным о регистрах, используемых для передачи параметров при записи asm. Это значительно облегчает выявление неправильного использования регистра.
Так что я бы написать так:
function Test64(const Val: Int64; var Len: Integer): Integer;
asm
mov dword ptr [rdx], $1
end;
Я подозреваю, что вы на самом деле компиляции для x86, так как x64 компилятор Delphi не поддерживает смесительный Паскаль и ассемблер, как вы делаете в этом вопросе. Итак, как я понимаю, код в вопросе не компилируется в компиляторе Delphi x64.
Вы можете видеть, что в моем коде выше я не смешиваю Pascal и asm. Это чистая функция asm. Мой совет всегда кодировать таким образом, даже на x86. Это позволит вам убедиться, что компилятор не мешает вашему стеку и использует регистр.
В x86 код будет:
function Test64(const Val: Int64; var Len: Integer): Integer;
asm
mov dword ptr [edx], $1
end;
В Windows x64 Microsoft определить ABI, и есть только одно соглашение о вызовах. Здесь задокументировано: https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx
Платформа x64 для других платформ Microsoft (System V x64 ABI) отличается. Я предположил, что вы нацелены на Windows.
The Delphi x86 ABI описано здесь: http://docwiki.embarcadero.com/RADStudio/en/Program_Control
я получаю 'Неизвестный идентификатор: "RDX"' с этим. Откуда вы знаете, что Len установлен в RDX? – IamIC
Эта ошибка возникает как в Delphi, так и в Lazarus. – IamIC
Это rdx, потому что x64 Windows abi указывает это. Если rdx не распознается, я думаю, что вы компилируете для x86. –