在MIPS反编译代码中的“加载字”指令中,负偏移意味着什么

时间:2012-08-30 19:27:14

标签: reverse-engineering mips disassembly

我正在对C MIPS应用程序进行逆向工程,在某些地方我可以在 lw 操作码中看到负偏移,例如:

80032910                 lw      $v0, -4($s4)

正偏移通常表示某种结构,其中一个成员正在被访问,但是哪些代码可以导致负偏移?

2 个答案:

答案 0 :(得分:1)

例如,如果您读取指针的先前值,例如,可以生成它。遍历从末尾到开头的数组

int *myDataEnd;

... code ...

while(*myDataEnd > *(myDataEnd-1))
  myDataEnd--;

引用myDataEnd-1指向的整数可能会生成该指令。

答案 1 :(得分:1)

位置无关代码使用$ gp作为指向64K全局数据区域中间的指针,因此您经常会在代码中看到lw $t0, -nnn($gp)。如果堆栈帧的深度在编译时是不可预测的,则可以使用帧指针来标记堆栈帧的开始,从而导致存在对帧指针具有负偏移的存储器引用。

手动优化代码也可以使用负偏移来保存将地址重新加载到寄存器中。