C MIPS アプリケーションをリバース エンジニアリングしています。いくつかの場所で、 lwオペコードに負のオフセットが見られます。
80032910 lw $v0, -4($s4)
正のオフセットは通常、メンバーの 1 つがアクセスされている何らかの構造体を示しますが、どのコードが負のオフセットにつながる可能性がありますか?
C MIPS アプリケーションをリバース エンジニアリングしています。いくつかの場所で、 lwオペコードに負のオフセットが見られます。
80032910 lw $v0, -4($s4)
正のオフセットは通常、メンバーの 1 つがアクセスされている何らかの構造体を示しますが、どのコードが負のオフセットにつながる可能性がありますか?
位置に依存しないコードは、$gp をグローバル データの 64K 領域の中央へのポインターとして使用するためlw $t0, -nnn($gp)
、コードでよく見かけます。スタック フレームの深さがコンパイル時に予測できない場合、フレーム ポインターを使用してスタック フレームの開始をマークし、フレーム ポインターへの負のオフセットを持つメモリ参照が発生する可能性があります。
手作業で最適化されたコードでは、負のオフセットを使用してアドレスをレジスタに再ロードする手間を省くこともできます。
たとえば、ポインターの前の値を読み取った場合に生成できます。たとえば、配列を最後から最初にトラバースする場合などです。
int *myDataEnd;
... code ...
while(*myDataEnd > *(myDataEnd-1))
myDataEnd--;
が指す整数を参照するmyDataEnd-1
と、その命令が生成される場合があります。