gpt4 book ai didi

c - ra ($31) 寄存器包含未对齐的返回地址 (MIPS)

转载 作者:行者123 更新时间:2023-12-02 14:13:43 25 4
gpt4 key购买 nike

我正在尝试在 MIPS 上重现调用堆栈,有关更多详细信息,请检查我之前的问题: How to get a call stack backtrace?(GCC,MIPS,no frame pointer)由于 MIPS 没有帧指针,因此我必须在堆栈上找到返回地址。我检查了其中一个函数开头的 ra 寄存器(在将其插入堆栈之前),发现它包含未对齐的返回地址。

   ra = 0x*******5

为什么会发生这种情况?

最佳答案

我怀疑您可能正在链接 microMIPS 目标(16 位指令,GCC 选项 -mmicromips)?

假设这是正确的,来自 microMIPS GCC Toolchain Usage 文档:

To enable processors to determine the current ISA (MIPS32 ISA or microMIPS ISA), the least-significant bit of an address (bit 0) is utilized as the ISA mode bit (0 = MIPS32 ISA, 1 = microMIPS ISA). This mechanism enables calls to microMIPS or MIPS32 functions via the JALR instruction by setting a register value odd (for microMIPS) or even (for MIPS32) from the address.

通过这种方式,为 microMIPS 编译的函数可以调用为 MIPS32 编译的函数,反之亦然,通过将函数的低位地址(或返回地址、跳转目标等)设置为 0(对于 MIPS32)或 1对于 microMIPS。由于所有指令都是 16 位或 32 位并且必须相应对齐,因此要找到真正的返回地址,只需屏蔽掉低位即可。

关于c - ra ($31) 寄存器包含未对齐的返回地址 (MIPS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45921512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com