c - 如何获取栈指针的值? (MIPS 海湾合作委员会)

标签 c gcc assembly mips inline-assembly

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

        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;

我在这里错过了什么?

最佳答案

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

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

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

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

此外,如果 glibc 可用,它已经具有 backtrace 功能,参见 man backtrace .

关于c - 如何获取栈指针的值? (MIPS 海湾合作委员会),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45780271/

相关文章:

c++ - 具有大量案例的 Switch 语句

c++ - GCC __attribute__((constructor)) 在对象构造函数之前被调用

python - 错误 : command 'x86_64-linux-gnu-gcc' failed with exit status 1 while installing pygsr,

c++ - 如何强制 GCC 将常量放入内存而不是生成它们?

c - 非阻塞套接字被 fgets 阻塞

c - 循环迭代的次数与输入中的字符数相同

c++ - g++ 和 boost 中 regex_replace() 替换字符串中 '\' 的不同处理

无法将此 C 代码转换为 MIPS 汇编

c - 汇编中的递归插入排序

c - 释放可能的内存泄漏