第三周--AEM汇编语言编程入门
文章目錄
- 一.STM32匯編程序
- 1.keil環(huán)境搭建
- 2.stm32程序
- (1).新建工程
- (2).配置環(huán)境
- (3).編譯調(diào)試
- 3.分析HEX文件
- 二、基于MDK創(chuàng)建STM32
- 1.創(chuàng)建一個新工程
- 2.添加文件
- 3.匯編程序
- 4.分析編譯生成的Hex文件
- 5.使用匯編實(shí)現(xiàn)LED閃碩
一.STM32匯編程序
1.keil環(huán)境搭建
keil安裝
通過以上鏈接下載mdk和注冊器,點(diǎn)擊安裝mdk,根據(jù)提示自行更改軟件路徑和支持包路徑,填寫完注冊信息后NEXT,等待安裝。安裝完成,點(diǎn)擊Finish。
注冊
1.點(diǎn)擊運(yùn)行注冊器程序。\n\n2.在桌面找到keil軟件圖標(biāo),點(diǎn)擊右鍵,以管理員身份運(yùn)行。\n\n3.點(diǎn)擊File–>Lincense Management–>Single-User Lincense,找到CID,復(fù)制CID中的內(nèi)容填寫到注冊器的CID空白處,將注冊器中Target選擇為ARM,點(diǎn)擊Generate,得到注冊碼。\n\n4.將生成的注冊碼復(fù)制粘貼到Keil的New Lincense ID Code空白處,點(diǎn)擊Add LIC,點(diǎn)擊Close。
支持包安裝
點(diǎn)擊運(yùn)行下載的支持包,NEXT開始安裝,安裝完成,點(diǎn)擊Finish。
2.stm32程序
(1).新建工程
雙擊打開keil,點(diǎn)擊菜單欄Project–>New μVision Project,新建項(xiàng)目,在彈窗中設(shè)置工程項(xiàng)目的名稱和路徑,在這里,我新建名為TEST的工程文件。
(2).配置環(huán)境
選擇設(shè)備\n\n點(diǎn)擊菜單中的Project,找到Options for Target ‘Target 1’并點(diǎn)擊,在彈窗中選擇相應(yīng)的目標(biāo)環(huán)境,此處我選的是STM32F103ZE
選擇運(yùn)行環(huán)境
添加源文件\n\n右鍵單擊Source Group 1,選擇Add New Item to Group,添加Asm File (.s)文件,命名為TEST并保存。\n\n為其添加如下代碼
設(shè)置仿真器模式
編譯調(diào)試
.編譯調(diào)試
3.分析HEX文件
:020000040800F2 :100000000006002031010008390100083B0100080A :100010003D0100083F010008410100080000000008 :100020000000000000000000000000004301000884 :1000300045010008000000004701000849010008D0 :100040004B0100084B0100084B0100084B01000860 :100050004B0100084B0100084B0100084B01000850 :100060004B0100084B0100084B0100084B01000840 :100070004B0100084B0100084B0100084B01000830 :100080004B0100084B0100084B0100084B01000820 :100090004B0100084B0100084B0100084B01000810 :1000A0004B0100084B0100084B0100084B01000800 :1000B0004B0100084B0100084B0100084B010008F0 :1000C0004B0100084B0100084B0100084B010008E0 :1000D0004B0100084B0100084B0100084B010008D0 :1000E0004B0100084B0100084B0100084B010008C0 :1000F0004B0100084B0100084B0100084B010008B0 :100100004B0100084B0100084B0100084B0100089F :100110004B0100084B0100084B0100084B0100088F :100120004B0100084B0100084B0100084B0100087F :100130000948804709480047FEE7FEE7FEE7FEE77B :10014000FEE7FEE7FEE7FEE7FEE7FEE704480549B7 :10015000054A064B7047000041020008990200085A :100160000000002000060020000200200002002005 :10017000704770477047000080B500F001F880BDFF :1001800082B041F204000021C4F20200019100910A :1001900050F8041C41F4803140F8041C50F8041C51 :1001A00001F400310091019901310191009919B9CF :1001B0000199B1F5A06FF1D150F8041C890354BF27 :1001C0000021012100910099012936D142F200015C :1001D000C4F202010A6842F010020A600A6822F0C2 :1001E00003020A600A6842F002020A6001680160C4 :1001F00001680160016841F480610160016821F4D7 :100200007C110160016841F4E811016050F8041CA0 :1002100041F0807140F8041C50F8041C8901FBD5A2 :10022000016821F003010160016841F002010160F1 :10023000016801F00C010829FAD102B070470000F2 :1002400080B541F20000C4F202000168002241F0D2 :10025000010101604168CFF6FF0211404160016871 :100260004FF6FF72CFF6F66211400160016821F48B :1002700080210160416821F4FE0141604FF41F01BB :100280008160FFF779FF4EF60850CEF200004FF084 :100290000061016080BD00004FF00A004FF00B01CB :1002A0004FF00C024FF00D0300F009F800F00AF8CF :1002B00000F00BF8DFF81CE0DFF81CF0FEE74FF071 :1002C000050570474FF0060670474FF007074FF0DF :0C02D00008087047BF020008CB020008BD :040000050800029954 :00000001FF該文件為16進(jìn)制的一串字符。hex文件的第一排字符稱之為擴(kuò)展線性地址記錄,也稱為32位地址記錄或HEX386記錄。\n在第一行數(shù)據(jù)020000040800F2中,其實(shí)際表達(dá)為0x02 0x00 0x00 0x04 0x08 0x00 0xf2。具體含義為\n\n第一個字節(jié) 0x02表示本行數(shù)據(jù)的長度;\n\n第二、三字節(jié) 0x00 0x00表示本行數(shù)據(jù)的起始地址;\n\n第四字節(jié) 0x04表示數(shù)據(jù)類型,數(shù)據(jù)類型有:0x00、0x01、0x02、0x03、0x04、0x05\n\n’00’ Data Rrecord:用來記錄數(shù)據(jù),HEX文件的大部分記錄都是數(shù)據(jù)記錄\n’01’ End of File Record: 用來標(biāo)識文件結(jié)束,放在文件的最后,標(biāo)識HEX文件的結(jié)尾\n\n’02’ Extended Segment Address Record: 用來標(biāo)識擴(kuò)展段地址的記錄\n\n’03’ Start Segment Address Record:開始段地址記錄\n\n’04’ Extended Linear Address Record: 用來標(biāo)識擴(kuò)展線性地址的記錄\n\n’05’ Start Linear Address Record:開始線性地址記錄\n\n然后是數(shù)據(jù),0x08 0x00\n\n最后一個字節(jié) 0xf2為校驗(yàn)和。
。
二、基于MDK創(chuàng)建STM32
1.創(chuàng)建一個新工程
(1)點(diǎn)擊project在選擇保存路徑
(2)選擇環(huán)境配置
對應(yīng)芯片
運(yùn)行環(huán)境
2.添加文件
1.鼠標(biāo)右鍵單擊Source Group 1,選擇Add New Item to Group,2.選擇 Asm File (.s) ,設(shè)置源文件的名稱,點(diǎn)擊Add,隨后設(shè)置完成。
3.匯編程序
AREA MYDATA, DATAAREA MYCODE, CODEENTRYEXPORT __main__mainMOV R0, #10MOV R1, #11MOV R2, #12MOV R3, #13;LDR R0, =func01BL func01;LDR R1, =func02BL func02BL func03LDR LR, =func01LDR PC, =func03B .func01MOV R5, #05BX LRfunc02MOV R6, #06BX LRfunc03MOV R7, #07MOV R8, #08 BX LR###調(diào)試結(jié)果
選擇仿真器\n設(shè)置硬件仿真器為ST_Link(根據(jù)自己的實(shí)際情況進(jìn)行選擇),仿真器的模式設(shè)置為JTAG接口或者SW(根據(jù)自己的實(shí)際情況進(jìn)行選擇)。設(shè)置完成,連接相應(yīng)的仿真器會有對應(yīng)信息顯示。\n仿真調(diào)試(斷點(diǎn)設(shè)置是在代碼行前點(diǎn)擊,出現(xiàn)紅點(diǎn),即表明斷點(diǎn)設(shè)置成功
調(diào)試結(jié)果
4.分析編譯生成的Hex文件
1.最終生成程序的各部分大小
2.分析Hex文件內(nèi)容
第一行內(nèi)容分別是0x02,0x00,0x00,0x04,0x08,0x00,0xF2。\n\n0x02\n該行數(shù)據(jù)中有兩個數(shù)據(jù)\n0x00 0x00\n本行數(shù)據(jù)的起始地址位\n0x04\n用來標(biāo)識擴(kuò)展線性地址的記錄\n該字節(jié)還可以是其他值,下面是其他值的含義\n00:用來記錄數(shù)據(jù),HEX文件的大部分記錄都是數(shù)據(jù)記錄\n01:用來標(biāo)識文件結(jié)束,放在文件的最后,標(biāo)識HEX文件的結(jié)尾\n02:用來標(biāo)識擴(kuò)展段地址的記錄\n03:開始段地址記錄\n05:開始線性地址記錄\n0x08 0x00\n該行兩個字節(jié)的數(shù)據(jù)\n數(shù)據(jù)類型是 04 ,即該行記錄的是一個拓展地址(0x08 0x00 是地址信息,用法是將該地址(0x0800\u003C\u003C16) 后作為基地址\n0xF2\n校驗(yàn)和,校驗(yàn)和= 0x100 - 累加和
5.使用匯編實(shí)現(xiàn)LED閃碩
1.創(chuàng)建一個新工程\n不需要添加啟動代碼(startup,core),其他步驟跟上面步驟基本一致。\n2.添加一個匯編文件
LED0 EQU 0x40011004;定義引腳PC2 RCC_APB2ENR EQU 0x40021018;配置RCC寄存器,時鐘 GPIOC_CRL EQU 0x40011000;配置CRL寄存器 Stack_Size EQU 0x00000400;棧的大小 ;分配一個STACK段,該段不初始化,可讀寫,按8字節(jié)對齊。分配一個大小為Stack_Size的存儲空間,并使棧頂?shù)牡刂窞開_initial_sp。AREA STACK, NOINIT, READWRITE, ALIGN=3;NOINIT: = NO Init,不初始化。READWRITE : 可讀,可寫。ALIGN =3 : 2^3 對齊,即8字節(jié)對齊。 Stack_Mem SPACE Stack_Size __initial_spAREA RESET, DATA, READONLY__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerAREA |.text|, CODE, READONLY;開始代碼段THUMBREQUIRE8PRESERVE8ENTRY Reset_Handler BL LED_Init;BL:帶鏈接的跳轉(zhuǎn)指令。當(dāng)使用該指令跳轉(zhuǎn)時,當(dāng)前地址(PC)會自動送入LR寄存器 MainLoop BL LED_ONBL DelayBL LED_OFFBL DelayB MainLoop;B:無條件跳轉(zhuǎn)。LED_Init;LED初始化PUSH {R0,R1, LR};R0,R1,LR中的值放入堆棧LDR R0,=RCC_APB2ENR;LDR是把地址裝載到寄存器中(比如R0)。ORR R0,R0,#0x04;ORR 按位或操作,將將R0的第二位置1,其他位不變LDR R1,=RCC_APB2ENRSTR R0,[R1];STR是把值存儲到寄存器所指的地址中。LDR R0,=GPIOC_CRLBIC R0,R0,#0x0F;BIC 先把立即數(shù)取反,再按位與LDR R1,=GPIOC_CRLSTR R0,[R1]LDR R0,=GPIOC_CRLORR R0,R0,#0x03LDR R1,=GPIOC_CRLSTR R0,[R1];將PC2置1MOV R0,#1 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC};將棧中之前存的R0,R1,LR的值返還給R0,R1,PCLED_ONPUSH {R0,R1, LR} MOV R0,#0LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}LED_OFFPUSH {R0,R1, LR} MOV R0,#1 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC} DelayPUSH {R0,R1, LR}MOVS R0,#0MOVS R1,#0MOVS R2,#0DelayLoop0 ADDS R0,R0,#1CMP R0,#330BCC DelayLoop0MOVS R0,#0ADDS R1,R1,#1CMP R1,#330BCC DelayLoop0MOVS R0,#0MOVS R1,#0ADDS R2,R2,#1CMP R2,#15BCC DelayLoop0POP {R0,R1,PC} ; NOPEND相關(guān)命令說明:
AREA命令:AREA 命令指示匯編器匯編一個新的代碼段或數(shù)據(jù)段。段是獨(dú)立的、指定的、不可見的代碼或數(shù)據(jù)塊,它們由鏈接器處理。
格式如下:AREA 段名,段屬性1,段屬性2,段屬性例如: AREA STACK, NOINIT, READWRITE, ALIGN=3.
SPACE命令:SPACE 命令保留一個用零填充的存儲器塊。
ENTRY命令:聲明整個程式的入口點(diǎn),入口點(diǎn)有且僅有一個。
完成后,編譯燒錄,最終結(jié)果是將開發(fā)板上的LED點(diǎn)亮,但是,并沒有出現(xiàn)閃爍的現(xiàn)象。
總結(jié)
以上是生活随笔為你收集整理的第三周--AEM汇编语言编程入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Linux的介绍
- 下一篇: 软件评价——360安全卫士