2014-01-21 116 views
1

我已經發現了以下功能here並希望得到它的MinGW的下編譯:轉換的Visual C/C++聯彙編代碼到GCC等效代碼

size_t stackavail() 
{ 
    static unsigned StackPtr; 
    __asm mov [StackPtr],esp 
    static MEMORY_BASIC_INFORMATION mbi; 
    VirtualQuery((PVOID)StackPtr,&mbi,sizeof(mbi)); 
    return StackPtr-(unsigned)mbi.AllocationBase; 
} 

我試圖修改上面的代碼和管理,以編譯和運行它:

size_t stackavail() 
{ 
    static unsigned StackPtr; 

    __asm__ ("movl %%esp, %0\n\t" : "=r" (StackPtr)); 
    MEMORY_BASIC_INFORMATION mbi; 
    VirtualQuery((PVOID)StackPtr, &mbi, sizeof(mbi)); 
    return StackPtr-(unsigned)mbi.AllocationBase; 
} 

但我有疑問。這是對的嗎?還有另一種方法可以做到嗎?

+0

找我是正確的,但你應該儘量避免使用'__asm__'對於旨在成爲移植的代碼。 –

+1

此外,使用靜態本地使得這個非常unthreadsafe。 –

+0

如何使用GCC內建['__builtin_frame_address()'](http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html)而不是內聯彙編?這對於其他體系結構(例如x86-64)也是可移植的。 –

回答

0

可以擺脫內聯彙編的,使用

void* StackPtr = &StackPtr;