① arm匯編跟匯編、C語言的區別
不一樣,匯編主要是要了解CPU指令及用法。
我們常說的是PC機的x86匯編,指令是x86的復雜指令集。
arm匯編是arm的精簡指令集,比x86容易學,程序格式倒是和x86匯編差不多。你下載一份arm的手冊就可以了解了。
C語言ARM的和x86的差不多,除了對硬體寄存器操作不同,其它語法和流程都一樣。
回答補充:
arm匯編程序每一行是指定arm
core執行一條指令,每條指令都是硬體相關。
如
LDR
R3,
#1
;用LDR指令將數值1放入R3寄存器准備參與運算
C語言與arm指令無關,只與邏輯運算有關,指定硬體地址的操作才與硬體相關;如果用arm編譯器來編譯,每行可能編譯出1到多條arm指令。
如
i++;
//變數
i
遞增1
等效於
LDR
R3,#1
;用LDR指令將數值1放入R3寄存器准備參與運算
ADD
R2,
R2,
R3
;用ADD指令將R2、R3寄存器里的數值相加後放回R2寄存器
以上等效匯編的R2、R3寄存器只是為了舉例,C語言不像匯編,不需要由程序員指定用哪個寄存器參與運算,編譯器編譯時會根據程序結構自動判斷選擇。
強調mcuos有錯,「c語言被編譯器編譯的時候會最終解釋為匯編語言的」,無論是c語言還是匯編語言,編譯器編譯後的結果是機器執行碼,很多人因為匯編語言比較難懂及指令相關,所以以為它就是機器語言,其實它仍是人類設計的編寫程序的語言,仍需要編譯器編譯成機器碼才能執行,它只是比C語言更接近硬體而已。
② 源程序到可執行程序的編譯過程
源代碼到可執行程序的編譯過程涉及四個關鍵步驟:預處理、編譯、匯編和鏈接。
預處理是程序編譯的第一步,由獨立的預編譯器處理,不屬於編譯器的直接工作。它主要負責處理預處理指令,如條件編譯,但並不涉及運行時間。
編譯階段將源代碼轉換成特定硬體平台的匯編語言,比如X86的x86匯編或ARM的ARM匯編,生成.s/.asm文件。這個過程涉及語法、詞法、語義分析等六大部分,以確保變數、函數等的正確使用和錯誤檢測。
編譯過程中,符號表管理至關重要,記錄了標識符及其屬性,如類型、內存佔用和地址,而錯誤管理則用於識別並報告語法錯誤(如拼寫錯誤、括弧匹配問題)和語義錯誤(如類型不匹配、作用域錯誤)。
從源程序到目標程序,可能會進行多次遍歷以優化代碼,但過多遍歷會增加編譯時間。最終,匯編階段將匯編語言轉換為機器語言的可重定位目標文件,如.o/.obj。
鏈接是編譯的最後一步,將目標文件、啟動代碼和庫文件結合,形成可執行的.exe文件。鏈接分為靜態和動態兩種,靜態鏈接時所有庫代碼會直接嵌入程序,而動態鏈接則依賴運行時查找庫。
③ 熟悉又陌生的arm 編譯器詳解(armcc/armclang)
深入探討 arm 編譯器的使用與特性
在理解編譯器的工作機制之前,讓我們先對編譯器這一核心軟體組件有一個大致的了解。編譯器一般由三部分組成:前端、優化器和後端。它們協同工作,將源代碼轉換為可執行程序,具體過程包括源代碼->預處理->編譯->目標代碼->鏈接->可執行程序。
關於編譯器的歷史,我們提及了 GCC、LLVM、Clang 等知名編譯器,以及 ARM 公司自主研發的 armcc 和 armclang。這兩款編譯器被集成在 ARM 的 IDE 和開發工具中,用戶可通過 ARM 官網獲取相關文檔。
armcc 編譯器是 ARM 公司的主力產品,主要負責編譯.c/.cpp 源文件生成目標文件。使用 armcc 時,通過 command-line 參數,用戶可以靈活配置編譯選項,以支持各種特性。下面列出一些常用的編譯選項:
-o 參數用於指定輸出文件名稱。-D 參數用於定義宏名稱,例如 -DLOG, -DUART=1 或 -U 移除已定義的宏名稱。在嵌入式物聯網項目中,正確使用編譯選項至關重要,以避免錯誤的路線和內容導致工資增長瓶頸。
armcc 編譯器提供多種優化級別,如下:
-O0:最小優化,關閉大多數優化。適合調試,因為生成的代碼結構直觀對應源代碼。
-O1:受限優化,執行調試信息可描述的優化。刪除未使用的內聯函數和未使用的靜態函數。在與 -debug 一同使用時,提供良好的代碼密度與清晰的調試視圖。
-O2:高度優化,調試視圖可能不如 -O1 清晰,但生成的代碼更加緊湊。是默認的優化級別。
-O3:最大優化,可能在調試時提供較差的視圖,但生成代碼性能最佳。與 -Otime 一同使用時,編譯器執行額外優化,如更積極的代碼優化。
armasm 匯編器用於處理匯編語言文件,而 armclang 編譯器則在後續版本中加入,以支持 C++11 標准和其他現代 C++ 功能。了解 armclang 的具體功能和使用方法將有助於掌握更先進的編譯技術。
要獲取 armcc 和 armclang 的完整文檔和資源,可訪問 ARM 官網,或參考相關技術教程和文檔。在學習過程中,確保掌握正確的編譯選項和優化策略,以高效地編寫和優化 C/C++ 程序。