一個基於STM32匯編程序的編寫


一、創建一個新工程

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM