2

私はIDA Proをいじり、自分の製品を分解しようとしています。

アセンブリ言語の知識が乏しいので、いくつかわからないことがあります。以下はCGContextSetRGBStrokeColorを呼び出すコードの一部です。

CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);

IDA では、次のようになります。

IDA出力

私は多くのことを理解していません:

  1. 0x3F800000は数字の 1 とどのように関連していますか? 私はそれが参照であると思いますが、それが何を参照しているのかわかりませんでした。
  2. MOVSが 4 回ではなく 3 回呼び出されるのはなぜですか(引数が 4 つあるため)。
  3. R0、R1、R2などはCPUレジスタですか?
  4. 誰かがこれらを説明できますか:

いくつかのテキスト行 http://a.imageshack.us/img836/4018/gah.png

このファイルはフレームワーク(したがって、Mach-Oファイル) です。その関数は CoreGraphics から来ています。

4

1 に答える 1

10

0x3F800000は番号1とどのように関連していますか?参考だと思いますが、何を言っているのかわかりませんでした。

0x3F800000は、IEEE単精度表現では1.0です。その0x3F800000を右クリックし、浮動小数点表現を選択して1.0に変換できます。

なぜMOVSは4回ではなく3回呼び出されるのですか(4つの引数があるため)?

標準のARM呼び出し規約では、最初の4つの引数はそれぞれR0からR3に格納されます。命令はldr r1, =0x3f800000すでに2番目の引数を格納しています。

R0、R1、R2などはCPUレジスタですか?

はい。

誰かがこれらを説明できますか?

2番目の命令のr3と3番目の命令のr3は異なるため、連続していない命令を分解しないでください。

関数全体を確認すると、「var_4C」がctxスタック上の変数のアドレスであることがわかります。したがって、

add r3, sp, #0x50+var_4c
ldr r2, [r3]

ただ意味しr2 = ctxます。命令はmovs r0, r2ずっと後にコンテキストを最初の引数として置きました。

また、ARMではvar _ ?? 値-0x??と同等です。ARMでは、5番目以降の引数は、スタックの[sp、#0]、[sp、#4]などに格納されます。したがって、命令は

ldr r3, =0x3f800000
str r3, [sp, #0]     ;// #0x50+var_50 = 0x50 - 0x50 = 0

5番目の引数に1.0を付けます。

于 2010-08-12T17:02:07.943 に答える