0

背景: 特定のクラスに属する Obj-C インスタンス メソッドを逆にしています。これがクラスのインターフェースです

@interface myClass : NSObject
    { 
            // aStructure contains a lot of function pointers

         struct aStructure **_myStruct;     // ivar offset: 0x14  
         int                             _integer;             // ivar offset: 0x20
    }

   - (void)aMethod;

@end

問題:

aMethodここに分解のスニペットがあります

[0x0]      mov   edi,    [ebp+arg_0]     ## put self into edi
[0x2]      mov   edx,   [edi+20h]        ## put  self._integer into edi
[0x3]      cmp   edx,   1
[0x4]      jl       end_of_method       ## if (self._integer < 1) return;
[0x5]      lea     eax,   [edx-0Ch]       ## put &self._myStruct into eax
[0x6]      cmp   eax,   3
[0x7]      ja      end_of_method       ## if (&self._myStruct > 3) return;
// other stuff

6 行目は、メモリアドレス ( &self._myStruct) との比較を示してい3ます。

質問: なぜメモリ アドレスを int と比較するのですか? メモリアドレスは常に> 3になるため、この場合、メソッドは常に終了するため、私にはあまり意味がありません。

4

2 に答える 2

3

lea eax, [edx-0Ch]単に。を意味しeax = edx - 12ます。命令が「有効アドレスのロード」と呼ばれるということは、それが使用できる唯一のことを意味するわけではありません。コンパイラは、その命令が計算を行うためのより短い/より速い方法である場合、//の代わりleaに出力することがよくあります。addsubmul

スニペット全体が1から15の間であるかどうかをチェックします。おそらく、メソッドの後半で使用されるため、_integerに格納_integer - 12されます。eax

于 2012-08-24T21:32:43.510 に答える
2

self._integerは2行目にロードされedx、5行目までそこに残ります。

5行目で、 ()と-0xCeaxの合計に割り当てます。したがって、6行目で-0xCと3を比較することになります。提示された分解が不完全または不正確でない限り、アドレスの比較はどこにもありません。edxself._integerself._integer

もともとアドレス演算を目的としたこのlea命令は、ここで見ているのと同様に、他の目的にも使用できます。

于 2012-08-24T21:32:33.847 に答える