Вызов функции на ассемблере вызывает исключение «проверка стека с плавающей запятой» - PullRequest
0 голосов
/ 10 сентября 2018

Выполнение следующего кода:

function ABCD32(Value: Cardinal): Single; register;
asm
  BSWAP  EAX
end;

function HexToFloat(hexValue: string; fmt: THexFloatFormat): Single;
var
  c: Cardinal;
  Err: Integer;
begin
  Result := NaN;
  c := HexToCardinal(hexValue, Err); //DCBA format
  if Err <> 0 then Exit();
  case fmt of
    hfABCD: Result := ABCD32(c); //Here, after return from ABCD32
    hfBADC: Result := BADC32(c);
    hfCDAB: Result := CDAB32(c);
    hfDCBA: Result := DCBA32(c);
  end;
end;

вызывает ошибку во время выполнения:

Project HexFloat.exe поднял класс исключения $ C0000092 с сообщением «проверка стека с плавающей запятой в 0x004e9903».

Что это такое и как с этим справиться?

Обновление

Вот вывод окна процессора:

HexFloat.dpr.162: hfABCD: Result := ABCD32(c);
004E98F8 8B45F0           mov eax,[ebp-$10]
004E98FB E894FFFFFF       call ABCD32
004E9900 D95DF4           fstp dword ptr [ebp-$0c] //WTF?
004E9903 9B               wait //Exception happens here
004E9904 EB28             jmp $004e992e

1 Ответ

0 голосов
/ 10 сентября 2018

Ваша функция не соответствует ABI. Значения с плавающей точкой должны быть возвращены в ST (0) на модуле x87.

function ABCD32(Value: Cardinal): Single; register;
asm
  BSWAP  EAX
  PUSH   EAX
  FLD    [ESP]
  ADD    ESP,4
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...