2015-02-10 103 views
0
unsigned long start, stop; 
register unsigned long sp asm ("sp"); 

start = sp; 

這行代碼聲明變量sp沒有初始值設定項。如何用c語言初始化寄存器無符號長

+1

您的代碼發佈在我的GCc(4.9.1)中正常工作。你使用什麼編譯器? – 2015-02-10 04:47:47

+0

我使用gcc 4.4.7版本的GCC(Red hat 4.4.7-4) – user3269606 2015-02-10 05:00:03

+0

我使用GCC 4.4.3進行測試,它仍然沒有抱怨地編譯。也許錯誤是你沒有向我們展示過的代碼?嘗試僅編譯您在'main()'內部顯示的代碼,而沒有其他內容。 – 2015-02-10 05:05:18

回答

0

不同的體系結構對堆棧指針使用不同的寄存器。這裏是一個示例(linux + elf)_start函數來演示:

//unfortunately gcc has no builtin for stack pointer, so we use assembly 
#ifdef __x86_64__ || defined __i386__ 
    #define STACK_POINTER "esp" 
#elif defined __aarch64__ 
    #define STACK_POINTER "x13" 
#elif defined __arm__ 
    #define STACK_POINTER "r13" 
#endif 
char **environ; 
void exit(int); 
int main(); 
void _start(void){ 
    register long *sp __asm__(STACK_POINTER); 
//if you don't use argc, argv or envp/environ, you can just remove them 
    long argc = *sp; 
    char **argv = (char **)(sp + 1); 
    environ = (char **)(sp + argc + 1); 
    exit(main(argc, argv, environ)); 
    __builtin_unreachable(); //or for(;;); to shut up gcc 
}