ARM彙編和X86彙編哪個難?

為什麼有人覺得精簡指令集簡單? 指令集越精簡是不是編程越複雜,複雜指令集一條命令搞定的東西精簡指令集要複雜很多方式才能實現同樣的功能。 那些說精簡指令集簡單的是不是不懂彙編?


x86指令雖然多,但實際上x86彙編比ARM彙編要容易學。

因為x86彙編資料特別多,中文資料也多。

相比之下ARM彙編的國內資料大部分都是渣,所以實際上x86更容易學。

----------------------------------------------------

舉個例子:

保護模式分頁是ARM和x86都有的,也是初學者必須要了解的,要想學x86的,百度上搜索「保護模式 分頁」:https://www.baidu.com/s?ie=utf-8f=8rsv_bp=1rsv_idx=1tn=baiduwd=%E4%BF%9D%E6%8A%A4%E6%A8%A1%E5%BC%8F%20%E5%88%86%E9%A1%B5oq=ARM%E5%88%86%E9%A1%B5rsv_pq=bf5f5557001cb60brsv_t=f849hF2XefLXmSJFbiroQy7FwAoJmCWukcI6qKxERlBPo4Nhd6HiMkJKoOIrsv_enter=1inputT=486rsv_sug3=32rsv_sug1=15rsv_n=2rsv_sug2=0rsv_sug7=100rsv_sug4=514rsv_sug=1

就有一堆的結果,有中文資料,有圖,有樣例,還有Windows驅動編程的例子。

要學ARM,只能以「ARM分頁」作為關鍵字:https://www.baidu.com/s?ie=utf-8f=8rsv_bp=1rsv_idx=1tn=baiduwd=ARM%20%20%E5%88%86%E9%A1%B5oq=ARM%20%E4%BF%9D%E6%8A%A4%E6%A8%A1%E5%BC%8F%20%E5%88%86%E9%A1%B5rsv_pq=df2cc466001cf002rsv_t=e7de%2BZ%2F0stD8fWLm%2Fq5coOjx4DPwxSpiHWyM9lrb3450FKPgrdrUiMeOu%2Fwrsv_enter=1inputT=576rsv_sug3=41rsv_sug1=17rsv_sug2=0rsv_sug7=100rsv_sug4=710rsv_sug=1

大部分都是隨便解釋一下,要代碼樣例?沒有。

----------------------------------------------------

並且開發環境也不一樣,要玩x86彙編,隨便找一個電腦就能開發,想做內核調試還有各種各樣的虛擬機,不管是Windows還是Linux還是自己寫的操作系統隨便調試。

要玩ARM彙編,成本就非常高了,只能用模擬器,要買開發板的話還要自己掏錢,開發板的支持軟體也是個問題,要是不小心把flash寫壞了,可能整個板子就廢了。

很多人學編程的時候忽視了開發工具的學習成本,這是不對的,尤其到工作中,新到一家公司,各種開發工具、項目配置管理工具、版本管理工具、流程工具就需要很長時間去學習。


想學ARMv8匯編可以參考此書:Computer Organization and Design ARM Edition: The Hardware Software Interface 2016


x86彙編對於寫彙編的軟體開發者和編譯器開發者挺簡單的,寄存器少,各個寄存器的用途很好記;指令最多只有2個操作數,常用的指令基本都支持各種定址模式,非常好熟悉,寫起來感覺不比C語言複雜多少。說個不好聽的,我是學習協程開始認真學習x86x64彙編的,1天就搞定了這個語言的核心部分。

x86對於彙編器以及反彙編器開發者就特別麻煩:1是opcode規則特別特別複雜, MOD-REG-R/M 實在反人類,官方的指令手冊也因此變得晦澀難懂 2. 太多可有可無的前綴,人肉反彙編擺脫干擾不容易。 我是開始寫yuanzhubi/local_hook 的時候人肉反彙編(為了保證代碼足夠健壯)才開始學習這個x86二進位指令的。不過話雖這樣說,網上有足夠多的在線x86 彙編反彙編器,如果僅僅是為了實驗一下 或者為了某個事情驗證一下,並不難。此外網上真的有足夠多的大神,居然可以人肉彙編,生成的二進位代碼(把彙編代碼轉化成二進位數據)比GCC的要短,真是佩服,也說明了開發完美的x64彙編器真的不容易。

ARM則恰好相反。寄存器多的像海一樣,記清楚那些彙編器已經很不容易了,還別提那啥立即數使用限制(32位指令你想處理32位立即數?還好天生提供了偽指令來封裝,反正寄存器多的用不完),手寫彙編想要戰勝C語言的編譯結果變得很困難,而且3元操作數指令的確實提供了不少靈異變化和優化空間;而彙編器把彙編代碼變成二進位代碼則太簡單了,簡直是套模版。。


脫離實際情況空談理論都是那啥啥。

x86 指令集是比較複雜,但它的應用面遠比 ARM 廣,可參考的資料文獻相應就多,上機可操作性也高一些,相比之下就不顯得比 ARM 難。


相比而言,僅代表個人意見,一個菜鳥,還是x86要難一些


不清楚arm,但是x86有很多歷史包袱,要先學習一些糟粕(其實也沒什麼)。


ARM有太多指令集了。像ARM Cortex-M0才48條指令,絕對比x86簡單啊。


精簡指令集和複雜指令集的主要區別是精簡指令集的指令一般是定長指令,通常都是4個位元組。也有2個位元組的thumb和mips16等。

所以精簡指令集簡單的多,一條指令一般就opcode,oprand,(condtion)幾部份

opcode常用的也就是load/ store ,branch/jump,add/shift等等

複雜指令集就炫酷多了。。。x86最長一條指令15byte,其實現在cisc也就剩下x86了。 因為要保持前向兼容,所以x86 40多年的精華糟粕全在裡面。。

結合abi看的話,x64已經吸取了很多risc處理器的經驗,更多的寄存器,更合理的abi。比如push/pop指令這種risc上根本看不到的東西也都滾蛋了。。

要說哪個難。x86 絕對在arm/mips之上。而且不光難,總覺得x86的架構放在今天看很ugly。比如io指令。

risc站在cisc的肩膀上誕生的,比x86更簡潔是順順應時代潮流的


RISC機器的彙編一般而言都不是人能寫的……


推薦閱讀:

如何看待李楠《ARM vs X86 之爭塵埃落定》一文?
如何掌握Intel Intrinsic Instruction?
如果說 RISC 的性能不如 CISC,那為什麼很多超算是 RISC 架構的?
x86 結構會被 ARM 結構淘汰嗎?
如何評價微軟在WinHEC 2016大會上演示的基於ARM的完整版Windows 10?

TAG:ARM | x86 | 彙編語言 | Win32彙編 | 反彙編 |