我正在尝试在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文档:


使处理器能够确定当前的ISA(MIPS32 ISA或
microMIPS ISA),地址的最低有效位(位0)为
用作ISA模式位(0 = MIPS32 ISA,1 = microMIPS ISA)。这个
该机制允许通过JALR调用microMIPS或MIPS32函数
通过将寄存器值设置为奇数(对于microMIPS)或偶数来进行指令
(对于MIPS32)来自地址。


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

09-10 19:44