2014-03-05 52 views
3

下面是thumb-2指令的w後綴,它如何在沒有它的情況下更改指令的語義?搜索結果非常嘈雜,我沒有得到答案。拇指2指令後綴W的含義是什麼?

addw r0, r1, #0

+0

它可以幫助彙編程序選擇thumb2可以做的那個拇指不能。也許不是這種情況,但是你可能有一條可以用thumb或者thumb2編碼的指令,通過使用類似這樣的東西,你可以基本上要求一定的編碼。一個較短的答案是「試一試」,寫下一行代碼,然後進行彙編和反彙編。 –

回答

3

我看到ADDW在Cortex-M3 TRM表2-5

Data operations with large immediate 
ADDW and SUBW have a 12-bit immediate. This means they can replace many from memory literal loads. 

也正是在Quick Reference

add wide T2 ADD Rd, Rn, #<imm12> 

提到看起來像彙編器將識別立即數< = 12位,並做需要。

在您看到它的上下文中,它是一個普通的「添加」。

+2

爲了解釋這一點,歷史的16位大拇指添加/子只支持8位常量。 ARM模式始終支持12位。根據dwelch,這將是一個32位的thumb2操作碼。你不想爲'addw r0,r0,#1'使用它,但是需要它用於'addw r0,r0,#257'。我認爲這是因爲* unified * assembler可以在你有一個不在傳統的拇指範圍內的常量時自動選擇正確的編碼。我的2cents。順便說一句,我覺得* thumb2 *混淆。它不是一種模式,但更像是一堆額外的* thumb *指令,如armv6,armv7擴展了常規ARM的操作碼。 –

+0

@artlessnoise您可以使用'add r0,#257'。彙編程序只會創建編碼T4。所以你不需要使用它,除非你想明確地指定你出於某種原因需要它。 ARM ARM也以這種方式講述了這個故事。 – auselen

+0

@auselen我的觀點是'addw' 32位編碼僅適用於大於255的常量。我知道彙編器會自動選擇;其他用途是試圖理解'objdump'或* disassembled * source的人。通常這些程序將是明確的。因此,對於彙編程序,您應該使用'add'(我沒有問這個問題......);我懷疑常量小於256的'addw'可能會在某些時候被棄用來擴展指令範圍。這些信息可能僅用於查看反彙編程序輸出......對於該用例,這是一個**好**問題。 –

3

指令的不同編碼應該有區別語法,所以當你反彙編一個二進制文件時,你應該注意到使用了哪種編碼。這也有助於組裝回反彙編的二進制文件,因此生成的二進制文件應該是您開始使用的二進制文件。

在你的情況下,使用addw而不是add不會改變指令的語義,因爲它是一個添加操作。然而,它肯定會強制彙編程序生成add指令的Encoding T4(32位),因爲這是由規範規定的。

彙編彙總時只能使用add助記符和彙編將選擇正確的編碼,你可以看到在對象轉儲。

int f1(int i) { 
    asm volatile("add r0, #0"); 
    asm volatile("add r0, #257"); 
} 

00000000 <f1>: 
    0: f100 0000 add.w r0, r0, #0 
    4: f200 1001 addw r0, r0, #257 ; 0x101 
    8: 4770  bx lr 
    a: bf00  nop 
+2

如果你知道ARM ARM,那麼'T [1-4]'編碼是有道理的,但我不知道是否每個人都知道T1-T4編碼。有四種編碼; cc設置爲'添加rx,ry,#imm3','添加rx,#imm8'設置cc,'add.w rx,ry,#special'(條件是或否),最後是'addw rx,ry,#imm12 '你可能沒有設定條件。另外,如果在「IT」塊中,你會得到不同的編碼。對於大多數人來說,除了條件設定之外,他們都做同樣的事情。嘗試'添加r0,#0xabababab'以瞭解奇怪的T3是多少。有多種方法可以做一些補充,這就是反彙編器顯示額外內容的原因。 –

2

簡而言之,W表示「寬」。它是指令的32位版本,而大多數Thumb指令是16位寬。廣泛的指令通常具有更大的立即數或可以處理更多的寄存器。

編輯:一些評論似乎對addwadd.w之間的區別感到困惑。唯一的本質區別是直接編碼。

add.w: imm32 = ThumbExpandImm(i:imm3:imm8); 
addw: imm32 = ZeroExtend(i:imm3:imm8, 32); 
+0

現在繼續解釋add.w和addw之間的區別 – auselen

+0

正如@auselen所提到的,您正在解釋.w,而不是w後綴。 – Thomson