2015-02-06 4 views

ответ

2

Я всегда предпочитаю быть явным о регистрах, используемых для передачи параметров при записи 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

+0

я получаю 'Неизвестный идентификатор: "RDX"' с этим. Откуда вы знаете, что Len установлен в RDX? – IamIC

+0

Эта ошибка возникает как в Delphi, так и в Lazarus. – IamIC

+2

Это rdx, потому что x64 Windows abi указывает это. Если rdx не распознается, я думаю, что вы компилируете для x86. –