Делать простые инструкции ARM? - PullRequest
2 голосов
/ 12 августа 2010

Я возился с IDA Pro и пытался разобрать мои собственные продукты ради этого.

Я заметил пару вещей, которые я не понимаю, потому что мое знание ассемблера ужасно.Вот небольшой фрагмент кода, который вызывает CGContextSetRGBStrokeColor .

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

В IDA это выглядит так:

IDA Output

Я надеваюНе понимаю несколько вещей:

  1. Как 0x3F800000 относится к числу 1?Я предполагаю, что это ссылка, однако я не понял, к чему это относится.
  2. Почему MOVS вызывается три раза вместо четырех (потому что есть четыре аргумента)?
  3. Являются ли регистры процессора R0, R1, R2 и т. Д.?
  4. Может кто-нибудь объяснить это:

Некоторые строки текста http://a.imageshack.us/img836/4018/gah.png

Этот файл является Framework (следовательно, файл Mach-O ).Эта функция взята из CoreGraphics.

1 Ответ

10 голосов
/ 12 августа 2010

Как 0x3F800000 относится к числу 1?Я предполагаю, что это ссылка, однако я не понял, к чему это относится.

0x3F800000 - 1,0 в представлении IEEE с одинарной точностью.Вы можете щелкнуть правой кнопкой мыши на этом 0x3F800000 и выбрать представление с плавающей запятой, чтобы преобразовать его в 1.0.

Почему MOVS вызывается три раза вместо четырех (потому что есть четыре аргумента)?

В стандартном соглашении о вызовах ARM первые 4 аргумента хранятся в R0-R3 соответственно.Инструкция ldr r1, =0x3f800000 уже хранит второй аргумент.

Являются ли регистры ЦП R0, R1, R2 и т. Д.?

Да.

Может ли кто-нибудь объяснить это:

Пожалуйста, не разбирайте непоследовательные инструкции, так как r3 в 2-й инструкции и в 3-й отличаются,

Если вы проверитеВо всей функции вы должны увидеть, что «var_4C» - это адрес переменной ctx в стеке.Следовательно,

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

просто означает r2 = ctx.Инструкция movs r0, r2 намного позже поместила контекст в качестве 1-го аргумента.

Также в ARM var_ ??эквивалентно значению -0x ??.В ARM 5-й аргумент и выше хранятся в стеке в [sp, # 0], [sp, # 4] и т. Д. Следовательно, инструкция

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

помещает 1.0 в 5-е числоаргумент.

...