Mingw C ++没有调用函数

时间:2013-10-08 20:45:18

标签: c++ assembly mingw

所以,我有以下函数来读取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;
}

Wich被另一个函数调用,(任何函数)但是我会把这里的实际代码放到我得到错误

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编译的这个EXACT代码,没有特殊标志,在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

我想知道为什么编译器会这样做......它可能是某种优化还是某种我可能会遗漏的选项?

提前致谢

0 个答案:

没有答案