日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第三周--AEM汇编语言编程入门

發布時間:2024/3/24 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三周--AEM汇编语言编程入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一.STM32匯編程序
    • 1.keil環境搭建
    • 2.stm32程序
      • (1).新建工程
      • (2).配置環境
      • (3).編譯調試
    • 3.分析HEX文件
  • 二、基于MDK創建STM32
    • 1.創建一個新工程
    • 2.添加文件
    • 3.匯編程序
    • 4.分析編譯生成的Hex文件
    • 5.使用匯編實現LED閃碩


一.STM32匯編程序

1.keil環境搭建

keil安裝
通過以上鏈接下載mdk和注冊器,點擊安裝mdk,根據提示自行更改軟件路徑和支持包路徑,填寫完注冊信息后NEXT,等待安裝。安裝完成,點擊Finish。

注冊

1.點擊運行注冊器程序。\n\n2.在桌面找到keil軟件圖標,點擊右鍵,以管理員身份運行。\n\n3.點擊File–>Lincense Management–>Single-User Lincense,找到CID,復制CID中的內容填寫到注冊器的CID空白處,將注冊器中Target選擇為ARM,點擊Generate,得到注冊碼。\n\n4.將生成的注冊碼復制粘貼到Keil的New Lincense ID Code空白處,點擊Add LIC,點擊Close。

支持包安裝
點擊運行下載的支持包,NEXT開始安裝,安裝完成,點擊Finish。

2.stm32程序

(1).新建工程

雙擊打開keil,點擊菜單欄Project–>New μVision Project,新建項目,在彈窗中設置工程項目的名稱和路徑,在這里,我新建名為TEST的工程文件。

(2).配置環境

選擇設備\n\n點擊菜單中的Project,找到Options for Target ‘Target 1’并點擊,在彈窗中選擇相應的目標環境,此處我選的是STM32F103ZE

選擇運行環境

添加源文件\n\n右鍵單擊Source Group 1,選擇Add New Item to Group,添加Asm File (.s)文件,命名為TEST并保存。\n\n為其添加如下代碼

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

設置仿真器模式

編譯調試
![在這里插入圖片描述](https://img-blog.csdnimg.cn/92fdcb2b2fb24dae88d1e7dfd8739df6.png#pic_center

(3).編譯調試

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進制的一串字符。hex文件的第一排字符稱之為擴展線性地址記錄,也稱為32位地址記錄或HEX386記錄。\n在第一行數據020000040800F2中,其實際表達為0x02 0x00 0x00 0x04 0x08 0x00 0xf2。具體含義為\n\n第一個字節 0x02表示本行數據的長度;\n\n第二、三字節 0x00 0x00表示本行數據的起始地址;\n\n第四字節 0x04表示數據類型,數據類型有:0x00、0x01、0x02、0x03、0x04、0x05\n\n’00’ Data Rrecord:用來記錄數據,HEX文件的大部分記錄都是數據記錄\n’01’ End of File Record: 用來標識文件結束,放在文件的最后,標識HEX文件的結尾\n\n’02’ Extended Segment Address Record: 用來標識擴展段地址的記錄\n\n’03’ Start Segment Address Record:開始段地址記錄\n\n’04’ Extended Linear Address Record: 用來標識擴展線性地址的記錄\n\n’05’ Start Linear Address Record:開始線性地址記錄\n\n然后是數據,0x08 0x00\n\n最后一個字節 0xf2為校驗和。


二、基于MDK創建STM32

1.創建一個新工程

(1)點擊project在選擇保存路徑
(2)選擇環境配置
對應芯片

運行環境

2.添加文件

1.鼠標右鍵單擊Source Group 1,選擇Add New Item to Group,2.選擇 Asm File (.s) ,設置源文件的名稱,點擊Add,隨后設置完成。

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

###調試結果

選擇仿真器\n設置硬件仿真器為ST_Link(根據自己的實際情況進行選擇),仿真器的模式設置為JTAG接口或者SW(根據自己的實際情況進行選擇)。設置完成,連接相應的仿真器會有對應信息顯示。\n仿真調試(斷點設置是在代碼行前點擊,出現紅點,即表明斷點設置成功
調試結果

4.分析編譯生成的Hex文件

1.最終生成程序的各部分大小

2.分析Hex文件內容

第一行內容分別是0x02,0x00,0x00,0x04,0x08,0x00,0xF2。\n\n0x02\n該行數據中有兩個數據\n0x00 0x00\n本行數據的起始地址位\n0x04\n用來標識擴展線性地址的記錄\n該字節還可以是其他值,下面是其他值的含義\n00:用來記錄數據,HEX文件的大部分記錄都是數據記錄\n01:用來標識文件結束,放在文件的最后,標識HEX文件的結尾\n02:用來標識擴展段地址的記錄\n03:開始段地址記錄\n05:開始線性地址記錄\n0x08 0x00\n該行兩個字節的數據\n數據類型是 04 ,即該行記錄的是一個拓展地址(0x08 0x00 是地址信息,用法是將該地址(0x0800\u003C\u003C16) 后作為基地址\n0xF2\n校驗和,校驗和= 0x100 - 累加和

5.使用匯編實現LED閃碩

1.創建一個新工程\n不需要添加啟動代碼(startup,core),其他步驟跟上面步驟基本一致。\n2.添加一個匯編文件

LED0 EQU 0x40011004;定義引腳PC2 RCC_APB2ENR EQU 0x40021018;配置RCC寄存器,時鐘 GPIOC_CRL EQU 0x40011000;配置CRL寄存器 Stack_Size EQU 0x00000400;棧的大小 ;分配一個STACK段,該段不初始化,可讀寫,按8字節對齊。分配一個大小為Stack_Size的存儲空間,并使棧頂的地址為__initial_sp。AREA STACK, NOINIT, READWRITE, ALIGN=3;NOINIT: = NO Init,不初始化。READWRITE : 可讀,可寫。ALIGN =3 : 2^3 對齊,即8字節對齊。 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:帶鏈接的跳轉指令。當使用該指令跳轉時,當前地址(PC)會自動送入LR寄存器 MainLoop BL LED_ONBL DelayBL LED_OFFBL DelayB MainLoop;B:無條件跳轉。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 先把立即數取反,再按位與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

相關命令說明:
AREA命令:AREA 命令指示匯編器匯編一個新的代碼段或數據段。段是獨立的、指定的、不可見的代碼或數據塊,它們由鏈接器處理。
格式如下:AREA 段名,段屬性1,段屬性2,段屬性例如: AREA STACK, NOINIT, READWRITE, ALIGN=3.
SPACE命令:SPACE 命令保留一個用零填充的存儲器塊。
ENTRY命令:聲明整個程式的入口點,入口點有且僅有一個。
完成后,編譯燒錄,最終結果是將開發板上的LED點亮,但是,并沒有出現閃爍的現象。

總結

以上是生活随笔為你收集整理的第三周--AEM汇编语言编程入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。