一、創建一個新工程
1.創建工程
①點擊Project,選擇New uvison Project
選擇文件保存的路徑以及文件的名稱
2.環境配置
選擇對應的芯片,文中使用了STM32F103C8T6
運行環境配置,主要是CMSIS下選擇CORE;Device下Startup,其中包含了啟動文件
二、添加文件
1.鼠標右鍵單擊Source Group 1,選擇Add New Item to Group
2.選擇 Asm File (.s) ,設置源文件的名稱,點擊Add(.s后綴的為匯編文件)
三、匯編程序
AREA MYDATA, DATA AREA MYCODE, CODE ENTRY EXPORT __main __main MOV R0, #10 MOV R1, #11 MOV R2, #12 MOV R3, #13 ;LDR R0, =func01 BL func01 ;LDR R1, =func02 BL func02 BL func03 LDR LR, =func01 LDR PC, =func03 B . func01 MOV R5, #05 BX LR func02 MOV R6, #06 BX LR func03 MOV R7, #07 MOV R8, #08 BX LR
- 在仿真運行程序過程中遇到的一些需要注意的問題
如果直接運行程序不可以仿真運行,此時我們需要打開Options of target ,選擇Debug
Debug中 左上角有Use simulator 選項勾上 才可以進行仿真,不選擇該選項程序無法進行仿真。
之后 我們進行仿真器的選擇。
設置硬件仿真器為J_Link(根據實際情況選擇),仿真器的模式設置為JTAG接口或者SW(根據實際情況選擇)。設置完成,連接相應的仿真器會有對應信息顯示。
仿真調試(斷點設置是在代碼行前點擊,出現紅點,即表明斷點設置成功)
四、分析編譯生成的Hex文件

關於HEX文件的一些解析
Code:代碼域,它指的是編譯器生成的機器指令,這些內容被存儲到ROM區。
RO-data: Read Only data,只讀數據域,它指程序中用到的只讀數據,這些數據被存儲在ROM區,因而程序不能修改其內容。C語言中const關鍵字定義的變量就是典型的RO-data。
RW-data: Read Write data,可讀寫數據域,它指初始化為“非0值”的可讀寫數據,程序剛運行時,這些數據具有非0的初始值,且運行的時候它們會常駐在RAM區,因而應用程序可以修改其內容。C語言中定義的全局變量,且定義時賦予“非0值”給該變量進行初始化。
ZI-data: Zero Initialie data,即0初始化數據,它指初始化為“0值”的可讀寫數據域。它與RW-data的區別是程序剛運行時這些數據初始值全都為 0,而后續運行過程與RW-data的性質一樣,它們也常駐在RAM區,因而應用程序可以更改其內容。例如C語言中使用定義的全局變量,且定義時賦予“ 0 值”給該變量進行初始化(若定義該變量時沒有賦予初始值,編譯器會把它當ZI-data來對待,初始化為 0);
ZI-data 的棧空間(Stack)及堆空間(Heap):在C語言中,函數內部定義的局部變量屬於棧空間,進入函數的時候會向棧空間申請內存給局部變量,退出時釋放局部變量,歸還內存空間。而使用malloc動態分配的變量屬於堆空間。在程序中的棧空間和堆空間都是屬於ZI-data區域的,這些空間都會被初始值化為0值。編譯器給出的ZI-data占用的空間值中包含了堆棧的大小(經實際測試,若程序中完全沒有使用malloc動態申請堆空間,編譯器會優化,不把堆空間計算在內)。
第一行內容分別是0x02,0x00,0x00,0x04,0x08,0x00,0xF2。
- 0x02
- 該行數據中有兩個數據
- 0x00 0x00
- 本行數據的起始地址位
- 0x04
- 用來標識擴展線性地址的記錄
- 該字節還可以是其他值,下面是其他值的含義
- 00:用來記錄數據,HEX文件的大部分記錄都是數據記錄
- 01:用來標識文件結束,放在文件的最后,標識HEX文件的結尾
- 02:用來標識擴展段地址的記錄
- 03:開始段地址記錄
- 05:開始線性地址記錄
- 0x08 0x00
- 該行兩個字節的數據
- 數據類型是 04 ,即該行記錄的是一個拓展地址(0x08 0x00 是地址信息,用法是將該地址(0x0800<<16) 后作為基地址
- 0xF2
- 校驗和,校驗和= 0x100 - 累加和
五、實驗心得
通過對於匯編語言的初步學習,理解了匯編語言不像是高級程序設計語言一樣具有很強的可讀性,要有很強的層次性和邏輯性,對於晦澀不容易懂得匯編語言還需要進行加強一步的學習,才可以利用匯編語言進行程序的設計,而不是簡單的Ctrl+C寫代碼的過程。
雖然匯編語言晦澀難懂,但是學習起來還是挺有樂趣,希望在接下來的學習過程中可以提高寫代碼的水平,同時利用匯編開發更高效的程序。
參考博客鏈接如下:https://blog.csdn.net/qq_43279579/article/details/111717607
https://blog.csdn.net/tyustli/article/details/86061856