如何获取栈指针的值? (MIPS 海湾合作委员会)
How to get the value of stack pointer? (MIPS GCC)
我正在尝试获取调用堆栈,出于某种原因,以下代码 returns 错误的堆栈指针:
unsigned int stack_pointer = 0;
__asm("la , %[spAddr]\n\t"
"or , [=10=], $sp\n\t"
"sw , 0()\n\t"
"nop"::[spAddr] "m" (stack_pointer));
return stack_pointer;
我在这里错过了什么?
要获取堆栈指针,请使用正确的输出约束,如下所示:
register unsigned sp asm("29");
asm("" : "=r" (sp));
请注意,mips 使用寄存器作为 return 地址,但非叶函数当然可以将其存储在堆栈中。
要实现回溯,您可以使用内置函数 __builtin_return_address
和 __builtin_extract_return_addr
,如 gcc manual.
中所述
此外,如果 glibc 可用,它已经具有 backtrace
功能,参见 man backtrace。
我正在尝试获取调用堆栈,出于某种原因,以下代码 returns 错误的堆栈指针:
unsigned int stack_pointer = 0;
__asm("la , %[spAddr]\n\t"
"or , [=10=], $sp\n\t"
"sw , 0()\n\t"
"nop"::[spAddr] "m" (stack_pointer));
return stack_pointer;
我在这里错过了什么?
要获取堆栈指针,请使用正确的输出约束,如下所示:
register unsigned sp asm("29");
asm("" : "=r" (sp));
请注意,mips 使用寄存器作为 return 地址,但非叶函数当然可以将其存储在堆栈中。
要实现回溯,您可以使用内置函数 __builtin_return_address
和 __builtin_extract_return_addr
,如 gcc manual.
此外,如果 glibc 可用,它已经具有 backtrace
功能,参见 man backtrace。