加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 调用汇编语言函数会导致“浮点堆栈检查”异常

发布时间:2020-12-15 04:26:17 所属栏目:大数据 来源:网络整理
导读:执行以下代码: function ABCD32(Value: Cardinal): Single; register;asm BSWAP EAXend;function HexToFloat(hexValue: string; fmt: THexFloatFormat): Single;var c: Cardinal; Err: Integer;begin Result := NaN; c := HexToCardinal(hexValue,Err); //D
执行以下代码:
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 raised exception class $C0000092 with message ‘floating point stack check at 0x004e9903’.

这是什么以及如何处理它?

更新

这是CPU窗口输出:

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

解决方法

您的功能不尊重ABI.浮点值应在x87单元的ST(0)中返回.
function ABCD32(Value: Cardinal): Single; register;
asm
  BSWAP  EAX
  PUSH   EAX
  FLD    [ESP]
  ADD    ESP,4
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读