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