0
unsigned long start, stop;
register unsigned long sp asm ("sp");
start = sp;
這行代碼聲明變量sp
沒有初始值設定項。如何用c語言初始化寄存器無符號長
unsigned long start, stop;
register unsigned long sp asm ("sp");
start = sp;
這行代碼聲明變量sp
沒有初始值設定項。如何用c語言初始化寄存器無符號長
不同的體系結構對堆棧指針使用不同的寄存器。這裏是一個示例(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
}
您的代碼發佈在我的GCc(4.9.1)中正常工作。你使用什麼編譯器? – 2015-02-10 04:47:47
我使用gcc 4.4.7版本的GCC(Red hat 4.4.7-4) – user3269606 2015-02-10 05:00:03
我使用GCC 4.4.3進行測試,它仍然沒有抱怨地編譯。也許錯誤是你沒有向我們展示過的代碼?嘗試僅編譯您在'main()'內部顯示的代碼,而沒有其他內容。 – 2015-02-10 05:05:18