Дизассемблировать простые инструкции ARM?

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

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

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

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

Вывод IDA

Я не понимаю ряд вещей:

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

http://a.imageshack.us/img836/4018/gah.png

Этот файл представляет собой Framework (поэтому файл Mach-O). Эта функция исходит от CoreGraphics.


person Kristina Brooks    schedule 12.08.2010    source источник
comment
Это сборка ARM; это не имеет никакого отношения к Маха. Mach-O — это просто формат файла, содержащий машинный код.   -  person Gabe    schedule 12.08.2010
comment
Ваш заголовок вводит в заблуждение - этот вопрос не имеет ничего общего с Mach-O. Я отредактирую, чтобы исправить это через несколько минут, если нет возражений.   -  person Carl Norum    schedule 12.08.2010
comment
-1 Не могли бы вы опубликовать текст как текст, а не как изображения. Эти изображения, вероятно, исчезнут через месяц или два.   -  person starblue    schedule 13.08.2010


Ответы (1)


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

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

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

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

Являются ли 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-й аргумент.

person kennytm    schedule 12.08.2010
comment
+1. Последний аргумент помещается в стек инструкцией STR. - person Carl Norum; 12.08.2010
comment
Двоичный интерфейс приложений ARM (ABI) определяет соглашение о вызовах. Спецификацию ABI можно загрузить с собственного веб-сайта ARM: infocenter.arm.com/help/index.jsp?topic=/ Имейте в виду, что GNU/Linux использует EABI (расширенный ABI), который является реализацией GNU ARM ABI. В основном эти два теперь совместимы. Исторически это было не так. - person RobM; 12.08.2010
comment
На самом деле EABI означает Embedded ABI и определяется ARM. Старый ABI — это ADS (ARM Developer Suite) ABI. ADS был заменен на RVCT, который использует новый ABI и (по большей части) совместим с GCC. - person tc.; 12.08.2010
comment
Отличный ответ. Большое спасибо. - person Kristina Brooks; 12.08.2010