Delphi XE2 64bit: встроенный ассемблер в GraphicEx - PullRequest
3 голосов
/ 08 октября 2011

Как это превратится из асма в чистый дельфи?Я не могу скомпилировать компонент, для которого требуется GraphicEx, из-за чего в модуле JPG выдается ошибка, из-за которой встроенная сборка не поддерживается для 64-разрядных систем.

function __ftol: Integer;
var
  f: double;
begin
  asm
    lea    eax, f             //  BC++ passes floats on the FPU stack
    fstp  qword ptr [eax]     //  Delphi passes floats on the CPU stack
  end;
  Result := Trunc(f);
end;

1 Ответ

1 голос
/ 08 октября 2011
function __ftol( f : double) : Integer;
begin
  Result := Trunc(f);
end;

Обновление: извините, я ошибаюсь. Двойник сохраняется в FPU при входе в эту функцию. Двойник затем помещается в локальную переменную f и усекается до целого числа. Так что забудь мой ответ.

Эта подпрограмма не используется в GraphicEx, поэтому попробуйте закомментировать ее.

Обновление 2.

Как говорит Дэвид, его можно использовать по ссылкам в файлах .obj. Предполагая, что это 64-битные объектные файлы, выполняющие одинаковую передачу параметров (удваивается в стеке FPU), вот функция, которую можно использовать (в 64-битном режиме):

function __ftol : Integer;
// Assumes double value is in FPU stack on entry
// Make a truncation to integer and put it into function result
var
  TmpVal: Int64;
  SaveCW, ScratchCW: word;

asm
  .NOFRAME 

  fnstcw word ptr [SaveCW]
  fnstcw word ptr [ScratchCW]
  or word ptr [ScratchCW], 0F00h  ;// trunc toward zero, full precision
  fldcw word ptr [ScratchCW]
  fistp qword ptr [TmpVal]
  fldcw word ptr [SaveCW]
  mov rax, TmpVal
end;
...