我正在对 C MIPS 应用程序进行逆向工程,在某些地方我可以在lw操作码中看到负偏移,例如:
80032910 lw $v0, -4($s4)
正偏移量通常表示某种结构,其中一个成员正在被访问,但是什么代码会导致负偏移量?
我正在对 C MIPS 应用程序进行逆向工程,在某些地方我可以在lw操作码中看到负偏移,例如:
80032910 lw $v0, -4($s4)
正偏移量通常表示某种结构,其中一个成员正在被访问,但是什么代码会导致负偏移量?
例如,如果你读取一个指针的前一个值,就可以生成它,例如从一个数组的末尾遍历到开头
int *myDataEnd;
... code ...
while(*myDataEnd > *(myDataEnd-1))
myDataEnd--;
引用 所指向的整数myDataEnd-1
可能会生成该指令。
位置无关代码使用 $gp 作为指向全局数据 64K 区域中间的指针,因此您会经常lw $t0, -nnn($gp)
在代码中看到。如果在编译时堆栈帧的深度是不可预测的,则可以使用帧指针来标记堆栈帧的开始,从而导致内存引用与帧指针的负偏移量。
手动优化的代码也可以使用负偏移来节省将地址重新加载到寄存器中。