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