【问题标题】:How to get the value of stack pointer? (MIPS GCC)如何获取堆栈指针的值? (MIPS 海合会)
【发布时间】:2017-08-20 08:53:53
【问题描述】:

我正在尝试获取调用堆栈,由于某种原因,以下代码返回了错误的堆栈指针:

        unsigned int stack_pointer = 0;
        __asm("la  $26,  %[spAddr]\n\t"
              "or  $27,  $0,  $sp\n\t"
              "sw  $27,  0($26)\n\t"
              "nop"::[spAddr] "m" (stack_pointer));
        return stack_pointer;

我在这里错过了什么?

【问题讨论】:

  • 您没有声明任何输出参数(在第一个冒号之后声明)。您期望在哪里退货?请参阅docs

标签: c gcc assembly mips inline-assembly


【解决方案1】:

要获取堆栈指针,请使用正确的输出约束,如下所示:

register unsigned sp asm("29");
asm("" : "=r" (sp));

请注意,mips 使用寄存器作为返回地址,但当然非叶函数可能会将其存储在堆栈中。

要实现回溯,您可以使用内置函数 __builtin_return_address__builtin_extract_return_addr,如 gcc manual 中所述。

另外,如果 glibc 可用,它已经有backtrace 功能,见man backtrace

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2010-12-23
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多