代码之家  ›  专栏  ›  技术社区  ›  Paul

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

  •  6
  • Paul  · 技术社区  · 6 年前

    执行以下代码:

    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;
    

    导致运行时错误:

    项目HexFloat.exe引发异常类$C0000092,消息为“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
    
    1 回复  |  直到 6 年前
        1
  •  13
  •   David Heffernan    6 年前

    function ABCD32(Value: Cardinal): Single; register;
    asm
      BSWAP  EAX
      PUSH   EAX
      FLD    [ESP]
      ADD    ESP,4
    end;