0

したがって、EXTENDED(拡張倍精度、80ビット精度倍精度)を読み取り、通常のINTとして出力する次の関数があります

int read_ld( int addr )
{
    int result;
    asm volatile
    (
        "mov eax, %[addr];"
        "fld qword ptr [eax];"
        "fistp dword ptr %[result]"
        : [addr] "=m" (addr)
        : [result] "m" (result)
    );
 return result;
}

これは別の関数(任意の関数)によって呼び出されますが、エラーが発生する実際のコードをここに配置します

extern "C" __declspec(dllexport) void funca()
{
    if( key(VK_PRIOR) ) //Fast
            fps_control( 0 );
    else if( key(VK_NEXT) ) //Slow
        fps_control( fps * 2 );
    else
        fps_control( fps ); //Normal
    char a[255];
    if( key(VK_HOME) )
    {
        int k = read_ld( 0x5080EC ); //This is just for testing <<
    }
}

特別なフラグなしで mingw でコンパイルされたこの正確なコードは、 funca() で次のアセンブリを提供します

  SUB     ESP, 2C
  MOV     DWORD PTR SS:[ESP], 21
  CALL    nakaeru.6FF01540           << Notice these are calls to key(), normal
  TEST    EAX, EAX
  JE L017
  MOV     DWORD PTR SS:[ESP], 0
  CALL    nakaeru.6FF014E0           << Notice these are calls to key(), normal
L007:
  MOV     DWORD PTR SS:[ESP], 24
  CALL    nakaeru.6FF01540           << Notice these are calls to key(), normal
  TEST    EAX, EAX
  JE L014
  MOV     EAX, DWORD PTR SS:[ESP+18] <<| This is my code and it is not a call
  FLD     QWORD PTR DS:[EAX]           |
  FISTP   DWORD PTR SS:[ESP+1C]        |
L014:
  ADD     ESP, 2C
  RETN
  LEA     ESI, DWORD PTR DS:[ESI]
L017:
  MOV     DWORD PTR SS:[ESP], 22
  CALL    nakaeru.6FF01540           
  TEST    EAX, EAX
  MOV     EAX, DWORD PTR DS:[6FF08000]
  JE L026
  ADD     EAX, EAX
  MOV     DWORD PTR SS:[ESP], EAX
  CALL    nakaeru.6FF014E0          
  JMP L007
L026:
  MOV     DWORD PTR SS:[ESP], EAX
  CALL    nakaeru.6FF014E0           
  JMP L007

コンパイラがこれを行う理由を知りたいと思っていました...それは、ある種の最適化または欠落している可能性のあるオプションでしょうか?

前もって感謝します

4

0 に答える 0