2013-02-20 2 views
-6

У меня есть постановка на сборку вопрос. Что такое шестнадцатеричный двоичный вывод следующего кода сборки armv7?какой-либо рука встроенный сборка

LDR r3, #0xaabbccdd 
BLX r3 

Мне нужен выход на ассемблере этого фрагмента кода , но у меня плохое компьютерная среда

Спасибо заранее

+0

Это не скомпилируется. Вы не можете иметь «LDR r3, # 0xaabbccdd» в одной команде, так как команда рычага может быть 16 или 32 бит, это не позволит вам одновременно загружать 32-битное значение. – auselen

+0

Пожалуйста, укажите вопрос в форме, которая либо «у меня есть эта проблема, и вы хотите знать, как ее лучше всего решить». или «почему этот подход не работает?». Ваш текущий вопрос находится где-то посередине, давая мало уверенности в том, что любой ответ, который я дал, действительно будет для вас практическим. – unixsmurf

+0

@unixsmurf Я думал, что он просто хотел получить двоичное кодирование этих двух инструкций, и я проголосовал близко. – auselen

ответ

2

Как отметил комментаторами LDR r3,#0xaabbccdd не является допустимым инструкция. Immediates в кодах операций ARM находятся на форме ZeroExtend(imm8) ROR (imm4*2), что позволит вам представлять, например, 0xaa000000, 0x00bb0000 и даже 0xd000000d - но не, например. 0xaabb0000 или 0xaabbccdd.

Ассемблеры обычно предоставляют псевдо-инструкцию для загрузки 32-разрядных непосредственных сообщений, например. в ГАС вы можете сделать:

ldr r3,=0xaabbccdd 

Какой будет закодировано как PC-относительной нагрузки - т.е. ldr r3,[pc,#offset]. Смещение (и, следовательно, точное кодирование команд) зависит от расстояния от инструкции до literal pool, где значение сохраняется.

+0

спасибо, что он очень полезен. Я знаю, что одна команда ARM не может загрузить 32-битное значение imm в регистр. Мне было интересно, как ассемблер будет обрабатывать эту псевдо-инструкцию. – daehee