天天看點

使用MDK完成彙程式設計式的編寫一、stm32彙程式設計式二、分析HEX檔案三、參考資料

文章目錄

  • 一、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。

使用MDK完成彙程式設計式的編寫一、stm32彙程式設計式二、分析HEX檔案三、參考資料

編譯調試

選中帶有紅色d的放大鏡開始調試,在②處就是仿真調試所需要的調試工具。

使用MDK完成彙程式設計式的編寫一、stm32彙程式設計式二、分析HEX檔案三、參考資料

開始調試

使用MDK完成彙程式設計式的編寫一、stm32彙程式設計式二、分析HEX檔案三、參考資料

可以看見寄存器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檔案由任意數量以回車換行符結束的資料記錄組成

執行個體分析:

資料 描述
:

10

0000

00

00060020ED000008F5000008F7000008

D9

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

繼續閱讀