回答
我看到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位,並做需要。
在您看到它的上下文中,它是一個普通的「添加」。
爲了解釋這一點,歷史的16位大拇指添加/子只支持8位常量。 ARM模式始終支持12位。根據dwelch,這將是一個32位的thumb2操作碼。你不想爲'addw r0,r0,#1'使用它,但是需要它用於'addw r0,r0,#257'。我認爲這是因爲* unified * assembler可以在你有一個不在傳統的拇指範圍內的常量時自動選擇正確的編碼。我的2cents。順便說一句,我覺得* thumb2 *混淆。它不是一種模式,但更像是一堆額外的* thumb *指令,如armv6,armv7擴展了常規ARM的操作碼。 –
@artlessnoise您可以使用'add r0,#257'。彙編程序只會創建編碼T4。所以你不需要使用它,除非你想明確地指定你出於某種原因需要它。 ARM ARM也以這種方式講述了這個故事。 – auselen
@auselen我的觀點是'addw' 32位編碼僅適用於大於255的常量。我知道彙編器會自動選擇;其他用途是試圖理解'objdump'或* disassembled * source的人。通常這些程序將是明確的。因此,對於彙編程序,您應該使用'add'(我沒有問這個問題......);我懷疑常量小於256的'addw'可能會在某些時候被棄用來擴展指令範圍。這些信息可能僅用於查看反彙編程序輸出......對於該用例,這是一個**好**問題。 –
指令的不同編碼應該有區別語法,所以當你反彙編一個二進制文件時,你應該注意到使用了哪種編碼。這也有助於組裝回反彙編的二進制文件,因此生成的二進制文件應該是您開始使用的二進制文件。
在你的情況下,使用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
如果你知道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是多少。有多種方法可以做一些補充,這就是反彙編器顯示額外內容的原因。 –
- 1. {$ C PRELOAD}指令的含義是什麼?
- 2. 類指針*的含義是什麼?
- 3. Ionic2 - 關於導入指令的At symbol @的含義是什麼?
- 4. Linux內核中的指令{interrupt do_IRQ}的含義是什麼?
- 5. 非法指令4在Docker-compose上的含義是什麼?
- 6. freemarker @standalone指令在戶外分享中的含義是什麼?
- 7. Intel 8080指令...「DAD」字母的含義是什麼?
- 8. A64指令結束時,感嘆號的含義是什麼?
- 9. Angular2 HTML指令中#的含義是什麼
- 10. 這些ARM彙編指令的含義是什麼?
- 11. 這條指令的含義是什麼(subl $ 20,%esp)?
- 12. 爲mov指令選擇後綴(l-b-w)
- 13. x86指令含義
- 14. Angular 2自定義指令的工作原理是什麼?
- 15. 運行lsof後,ESTABLISHED指示器的含義是什麼
- 16. 自定義UISilder的拇指
- 17. 指針指針的意義是什麼?
- 18. 拇指指令與arm指令集相比如何增加?
- 19. 爲什麼納克級的指令被我的自定義指令後,編譯
- 20. 什麼是序言指令?
- 21. 這是什麼指令?
- 22. 什麼是JVM指令?
- 23. 什麼是指令? dojo dstore
- 24. 這是什麼movsbl指令?
- 25. 什麼是ng-app指令
- 26. 什麼是callq指令?
- 27. 什麼是每秒指令?
- 28. 什麼是特權指令?
- 29. 什麼是版本指令?
- 30. 錯誤:無效的`cmpxchg'指令後綴
它可以幫助彙編程序選擇thumb2可以做的那個拇指不能。也許不是這種情況,但是你可能有一條可以用thumb或者thumb2編碼的指令,通過使用類似這樣的東西,你可以基本上要求一定的編碼。一個較短的答案是「試一試」,寫下一行代碼,然後進行彙編和反彙編。 –