Ассемблерные патчи сравнивают иструкции и ветки - PullRequest
0 голосов
/ 21 февраля 2012

Как я могу сделать "истинным" это иструкция?

CMP             R0, #0

Что я хочу сделать, например, сделать так:

CMP R0,R0 or CMP #0, #0

00 28 - это код операции.Я пытаюсь сделать 28 28 безрезультатно!Другой вопрос, что за istructions BNE.W?какой это финал W?Как я могу изменить это в BE?Код операции: 40 F0 65 85

ПРИМЕЧАНИЕ. Все коды операции находятся в режиме большого пальца!

* РЕДАКТИРОВАТЬ Существует ли компилятор armv7 для Mac?

1 Ответ

1 голос
/ 22 февраля 2012

Вы можете просто собрать CMP R0, R0 или CMP #0, #0 и извлечь таким образом необходимый код операции из этих инструкций.


Другой способ - посмотреть справочное руководство по ARM и вручную создать код операции. Это - руководство по ARMv5, которое я быстро нашел, и под 7.1.22 у вас есть CMP <Rn>, <Rm> с подробностями построения кода операции для сравнения двух регистров. Детали, похоже, совпадают с руководством по ARMv7, которое я также нашел непосредственно перед тем, как собирался опубликовать.

Он имеет биты 15-6, являющиеся 0 1 0 0 0 0 1 0 1 0, тогда биты 5-3 являются номером первого регистра (число 0 представлено 3 битами для R0), а биты 2-0 являются вторым регистром (также R0). Итак, ваш код операции теперь будет:

0 1 0 0 0 0 1 0 1 0 (CMP) 000 (R0) 000 (R0)

100001010000000 в шестнадцатеричном виде - 4280, поэтому в порядке с прямым порядком байтов вам понадобятся два байта 80 42.

Как вы можете видеть, было бы намного проще просто позволить ассемблеру решить эту проблему за вас.

...