2012-01-29 1 views
3

В настоящее время я пытаюсь понять, как инструкция movw работает на ARM, чтобы иметь возможность шестнадцатеричного редактирования библиотеки и изменения значения, которое устанавливается с указанной инструкцией.Как команда управления движением руки на машинный код?

библиотека представляет код следующим образом (выход из objdump):

[...] 
29c4: f44f 71f0 mov.w r1, #480 ; 0x1e0 
[...] 

То, что я пытаюсь сделать, другими словами, это выяснить, как это 0x1e0/480 представлена ​​в «f44f 71f0». Я читал материал по сети, включая http://blogs.arm.com/software-enablement/251-how-to-load-constants-in-assembly-for-arm-architecture/, и я думаю, что понимаю, как работает movw и его ограничения; но я все еще не понимаю, как значение, показанное на карте команд, соответствует фактическому двоичному коду. Любая документация или insignt, которую вы могли бы предоставить по этому вопросу, очень ценится :)

ответ

2

Для руководства инструкции описаны в ARM ARM, ARM Architectural Reference manual (s). Перейдите к http://infocenter.arm.com, затем по левой архитектуре найдите, затем найдите интересующую вас архитектуру. Это инструкция thumb2, поэтому вы хотите armv7-m.

Это выглядит кодировать T2

11110i00010S11110... 

я и S равны нулю в вашей инструкции. imm3 является битом 12 до 14 и imm8 является битом 7 - 0.

0 111 0001 11110000 

так что ваш imm3 является 0b111 и imm8 является 0b11110000

, то вы смотрите на модифицированные немедленные константах в инструкции накатанной разделе

i ... imm3 ... abcdefgh, где abcdefgh - это imm8 бит вашего i: imm3: бит, 5 бит: 0b11111

так что вы посмотрите, что в таблице, и вы получите imm8 с правой стороны сдвинутый влево 1

00000000 00000000 00000001 bcdefgh0 
00000000 00000000 00000001 11100000 

который 0x000001E0

Arm делает очень хорошую работу по документированию их инструкции, лучше, чем большинство.

+0

Большое спасибо! С вашим объяснением и немного чтения в Справочном руководстве по архитектуре я выяснил, что я смог отредактировать то, что мне нужно :) – user1176415

1

Вот MOV T2 кодирование (от ARM Architecture Reference Manual)

11110 i 0 0010 S 1111 0 imm3 rd imm8 

d = UInt(Rd); 
setflags = (S == ‘1’); 
(imm32, carry) = ThumbExpandImm_C(i:imm3:imm8, APSR.C); 
if d IN {13,15} then UNPREDICTABLE; 

Потому что ваша картина

 i  S  imm3 rd imm8 
11110 1 0 0010 0 1111 0 111 0001 11110000 

Вы i=1, S=0, imm3=111, imm8=11110000



Проверив , что делает, вы поймете ThumbExpandImm_C(), как значения стали 0x1e0

// ThumbExpandImm_C() 
// ================== 
(bits(32), bit) ThumbExpandImm_C(bits(12) imm12, bit carry_in) 
if imm12<11:10> == ‘00’ then 
    case imm12<9:8> of 
     when ‘00’ 
      imm32 = ZeroExtend(imm12<7:0>, 32); 
     when ‘01’ 
      if imm12<7:0> == ‘00000000’ then UNPREDICTABLE; 
      imm32 = ‘00000000’ : imm12<7:0> : ‘00000000’ : imm12<7:0>; 
     when ‘10’ 
      if imm12<7:0> == ‘00000000’ then UNPREDICTABLE; 
      imm32 = imm12<7:0> : ‘00000000’ : imm12<7:0> : ‘00000000’; 
     when ‘11’ 
      if imm12<7:0> == ‘00000000’ then UNPREDICTABLE; 
      imm32 = imm12<7:0> : imm12<7:0> : imm12<7:0> : imm12<7:0>; 
      carry_out = carry_in; 
else 
    unrotated_value = ZeroExtend(‘1’:imm12<6:0>, 32);     <--- a 
    (imm32, carry_out) = ROR_C(unrotated_value, UInt(imm12<11:7>)); <--- b 
return (imm32, carry_out); 



Наш imm12 = i:imm3:imm8 (1:111:11110000) = 1111 1111 0000
Наши ценности будут проходить линии (а) и (б), поскольку самые высокие 2 бита [11,10] являются «11»

ZeroExtend ('1': imm1 2 < 6: 0>, 32) означает, что вы должны добавить «1» в [6..0] бит. Таким образом, значение становится 1:1110000 = 11110000 (а)
ROR_C (unrotated_value, UInt (imm12 < 11: 7>)) ли повернуть вправо на [11: 7] = 11111 = 31, которая является same as rotate left by 1. (Б)

Таким образом, результирующее значение 1 1110 0000 (a shifted by b) = 0x1e0