2012-01-29 46 views
3

我當前正試圖理解movw指令如何在ARM上工作,以便能夠編輯一個庫並更改正在使用所述指令設置的值。arm movw指令如何映射到機器碼?

庫呈現代碼如下(從objdump的輸出):

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

我試圖換句話說要做的,就是弄清楚如何在裏面「f44f 71f0」代表0x1e0/480。我一直在閱讀網絡上的東西,包括http://blogs.arm.com/software-enablement/251-how-to-load-constants-in-assembly-for-arm-architecture/,我想我明白movw是如何工作的,這是有限的;但我仍然不明白指令中顯示的值如何映射到實際的二進制代碼。任何文件或您可能能提供有關此問題非常感謝:)

回答

2

對於arm的說明在ARM ARM,ARM架構參考手冊中描述。轉到http://infocenter.arm.com,然後沿着左邊的find架構找到你感興趣的架構。這是一個thumb2指令,所以你需要armv7-m。

這看起來是編碼T2

11110i00010S11110... 

我和S是零您的指示。 imm3是位12至14的imm8是位7 - 0

0 111 0001 11110000 

所以你imm3是0b111和的imm8是0b11110000

,那麼你看看Thumb指令部分修改後的立即數

我... imm3 ... abcdefgh其中abcdefgh是imm8位你的我:imm3:一個位,5位是0b11111

所以你看起來在表中,你得到imm8在右側向左移動1

00000000 00000000 00000001 bcdefgh0 
00000000 00000000 00000001 11100000 

這是0x000001E0

手臂做記錄他們的指示,最要好的一個不錯的工作。

+0

非常感謝!隨着你的解釋和一些關於建築參考手冊的閱讀,我知道了它,我可以編輯我需要的東西:) – user1176415 2012-01-29 18:48:41

1

這裏的MOV T2編碼(從ARM體系結構參考手冊

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
我們的價值觀將通過線(一)和(b ),因爲最高2位[11,10]是'11'

ZeroExtend('1':imm1 2 < 6:0>,32)表示您必須將「1」預置爲[6..0]位。所以該值變爲1:1110000 = 11110000的(a)
ROR_C(unrotated_value,UINT(imm12可< 11:7>)):= 11111 = 31這是same as rotate left by 1不會由[7 11]向右旋轉。 (二)

因此所得到的值是1 1110 0000 (a shifted by b) = 0x1e0