文章目錄
- 一、stm32彙程式設計式
-
- 1.建立工程
- 2.環境配置
- 3.調試編譯
- 二、分析HEX檔案
- 三、參考資料
一、stm32彙程式設計式
1.建立工程
輕按兩下打開keil,點選菜單欄Project–>New μVision Project,建立項目,在彈窗中設定工程項目的名稱和路徑,在這裡,我建立名為test的工程檔案。
2.環境配置
keil的環境搭建以及調試步驟已經在之前部落格提到
https://blog.csdn.net/qq_52187415/article/details/127121055
添加源檔案
右鍵單擊Source Group 1,選擇Add New Item to Group,添加Asm File (.s)檔案,命名為main并儲存。
加入彙編代碼:
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
3.調試編譯
設定仿真器模式
點選菜單中的Project,找到Options for Target ‘Target 1’并點選,選擇Debug–>Use Simulator,将Dialog DLL以及Parameter處修改為自己選擇的裝置,OK。
編譯調試
選中帶有紅色d的放大鏡開始調試,在②處就是仿真調試所需要的調試工具。
開始調試
可以看見寄存器R5,R6,R7,R8的值和程式設定一樣。
二、分析HEX檔案
:020000040800F2
:1000000000060020ED000008F5000008F7000008D9
:10001000F9000008FB000008FD00000800000000D7
:10002000000000000000000000000000FF000008C9
:10003000010100080000000003010008050100089C
:100040000701000807010008070100080701000870
:100050000701000807010008070100080701000860
:100060000701000807010008070100080701000850
:100070000701000807010008070100080701000840
:100080000701000807010008070100080701000830
:100090000701000807010008070100080701000820
:1000A0000701000807010008070100080701000810
:1000B0000701000807010008070100080701000800
:1000C00007010008070100080701000807010008F0
:1000D00007010008070100080701000807010008E0
:1000E00007010008070100080701000809488047C8
:1000F00009480047FEE7FEE7FEE7FEE7FEE7FEE70A
:10010000FEE7FEE7FEE7FEE704480549054A064B21
:100110007047000061020008C902000800000020CA
:1001200000060020000200200002002070477047F7
:100130007047000080B500F001F880BD84B0002059
:100140000390029041F20001C4F20201086840F4F9
:1001500080300860FFE741F20000C4F2020000684E
:1001600000F400300290039801300390FFE70299F9
:100170000020019039B9FFE70398B0F5A06018BFDF
:1001800001200190FFE70198C0070028E3D1FFE7B5
:1001900041F20000C4F2020000688003002803D589
:1001A000FFE70120029002E000200290FFE70298A2
:1001B000012851D1FFE742F20001C4F202010868B0
:1001C00040F010000860086820F007000860086828
:1001D00040F00200086041F20401C4F20201009103
:1001E0000868086008680860086840F48060086073
:1001F000086820F47C100860086840F4E810086083
:1002000041F20001C4F20201086840F08070086009
:10021000FFE741F20000C4F20200006880010028FC
:1002200001D4FFE7F5E741F20401C4F202010868D6
:1002300020F003000860086840F002000860FFE753
:1002400041F20400C4F20200006800F00C0008282B
:1002500001D0FFE7F4E700E0FFE704B070470000DB
:1002600080B541F20002C4F20202106840F00100C1
:10027000106041F20401C4F2020108680023CFF6C5
:10028000FF031840086010684FF6FF73CFF6F6635F
:1002900018401060106820F480201060086820F476
:1002A000FE00086041F20801C4F202014FF41F0091
:1002B0000860FFF73FFF4EF60851CEF200014FF005
:1002C0000060086080BD00004FF00A004FF00B0195
:1002D0004FF00C024FF00D0300F009F800F00AF89F
:1002E00000F00BF8DFF81CE0DFF81CF0FEE74FF041
:1002F000050570474FF0060670474FF007074FF0AF
:0C03000008087047EF020008FB0200082C
:04000005080002C924
:00000001FF
1.擴充線性位址記錄
- 擴充線性位址記錄(hex 檔案的第一排十六進制)也叫作 32 位位址記錄或 HEX386 記錄
- 這些記錄包含資料位址的高 16 位
- 擴充線性位址記錄總是有兩個資料位元組,外觀如下(這裡我通過标記友善對應原始資料):
内容 | 描述 |
---|---|
:020000040800F2 | |
02 | 這個記錄當中資料位元組的數量 |
0000 | 位址域,對于擴充線性位址記錄,這個域總是 0000 |
04 | 記錄類型 04 (擴充線性位址記錄) |
0800 | 是位址的高 16 位 |
F2 | 是這個記錄的校驗和,計算方法:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h) |
當一個擴充線性位址記錄被讀取,存儲于資料域的擴充線性位址被儲存,它被應用于從 Intel HEX 檔案讀取來的随後的記錄
線性位址保持有效,直到它被另外一個擴充位址記錄所改變
通過把記錄當中的位址域與被移位的來自擴充線性位址記錄的位址資料相加獲得資料記錄的絕對存儲器位址
2.資料部分
- Intel HEX 由任意數量的十六進制記錄組成。每個記錄包含 5 個域,它們按一定格式排列::llaaaatt[dd…]cc
- 每一組字母對應一個不同的域,每一個字母對應一個十六進制編碼的數字
- 每一個域由至少兩個十六進制編碼數字組成,它們構成一個位元組,就像以下描述的那樣:
内容 | 描述 |
---|---|
:llaaaatt[dd…]cc | |
: | 開頭 |
ll | 資料長度域,它代表記錄當中資料位元組(dd)的數量 |
aaaa | 位址域,它代表記錄當中資料的起始位址 |
tt | 代表HEX記錄類型的域,它可能是以下資料當中的一個:00(資料記錄)、01(檔案結束記錄)、02(擴充段位址記錄)、04(擴充線性位址記錄) |
dd | 資料域,它代表一個位元組的資料。一個記錄可以有許多資料位元組.記錄當中資料位元組的數量必須和資料長度域(ll)中指定的數字相符 |
cc | 校驗和域,它表示這個記錄的校驗和(校驗和的計算是通過将記錄當中所有十六進制編碼數字對的值相加,以256為模進行以下補足) |
Intel HEX檔案由任意數量以回車換行符結束的資料記錄組成
執行個體分析:
資料 | 描述 |
---|---|
: 0000 00060020ED000008F5000008F7000008 | |
10 | 這個記錄當中資料位元組的數量 |
0000 | 資料被加載到寄存器中的起始位址 |
00 | 記錄類型(資料記錄) |
00060020ED000008F5000008F7000008 | 資料資訊 |
D9 | 目前資料的校驗和 |
3.檔案尾
在檔案的最後一排,是一個檔案的結束标志:
:00000001FF
内容 | 描述 |
---|---|
:00000001FF | |
00 | 記錄長度為0 |
0000 | LOAD OFFSET為0000 |
01 | TYPE=01 |
FF | 校驗和為FF |
三、參考資料
https://blog.csdn.net/ssj925319/article/details/111868500