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