2016-10-04 2 views
-2

Мой проект в Delphi 10.1 имеет некоторые функции сборки, как это:Дельфи ASM код win32 против Win64

function MyFunc: Word; 
    asm 
    PUSH 0 
    FNSTCW [ESP].Word 
    POP EAX 
    end; 

Мне нужно скомпилировать проект в Win64, но некоторые линии, как POP EAX имеет E2116 Invalid combination of opcode and operands Error.

+1

Используйте функцию Get8087CW из системного блока, она должна работать нормально для обеих платформ (Win32/Win64). –

+0

x86_64 не поддерживает 32-битный push/pop –

+0

Обратите внимание, что x86 и x64 используют разные имена регистров в своем соглашении о вызове и часто разные коды операций. Строго рассмотрите совет @ Андрея Галатына, потому что вам придется (по крайней мере) дублировать все функции. – Caleth

ответ

3

Вместо того, чтобы переводить сборку в x64, вы должны использовать функцию Get8087CW() в блоке System. Он должен работать нормально для обеих платформ (Win32/Win64):

function MyFunc: Word; 
begin 
    Result := Get8087CW; 
end; 

Для того, чтобы перевести любой другой код сборки (который вы не обеспечили здесь) от x86 до x64, я предлагаю вам узнать х64 монтажника программирование ,

+3

Это правда, но, возможно, не хватает смысла. Код x64 не использует блок 8087. Он использует SSE-модуль. –

+0

@David: Я думаю, что часть кода в вопросе является просто примером, и для этого примера ему не нужно использовать asm. Если он начнет переписывать код на x64, функция все равно не будет использоваться. Но вы правы, доступ к регистру управления FPU совершенно бесполезен в режиме x64. –

+2

ОК, но как только он удалил код, который читает 8087 CW, в этом вопросе ничего не осталось. Вопрос не очень полезен в его нынешнем виде. –

Смежные вопросы