したがって、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
コンパイラがこれを行う理由を知りたいと思っていました...それは、ある種の最適化または欠落している可能性のあるオプションでしょうか?
前もって感謝します