ARM汇编程序入门实践
一.stm32程序
1.新建工程
(1)雙擊打開keil,點擊菜單欄Project–>New μVision Project,新建項目,在彈窗中設置工程項目的名稱和路徑,在這里,我新建名為LED的工程文件。
(2)在左側的窗口內選擇STM32芯片,這里我們選擇STM32F103RB,并保存。
(3)勾選相應的選項,并點擊OK,這樣工程創建完畢。
2.配置環境
(1)工程創建完畢后,在左上角點擊新建文件,然后窗口出現了一個Text1的文件。
(2)然后將下列代碼復制粘貼到Text1文本框內。
#define PERIPH_BASE ((unsigned int)0x40000000)//AHB #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) //GPIOA_BASE=0x40000000+0x10000+0x0800=0x40010800,該地址為GPIOA的基地址 #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) //GPIOB_BASE=0x40000000+0x10000+0x0C00=0x40010C00,該地址為GPIOB的基地址 #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) //GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,該地址為GPIOC的基地址 #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) //GPIOD_BASE=0x40000000+0x10000+0x1400=0x40011400,該地址為GPIOD的基地址 #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) //GPIOE_BASE=0x40000000+0x10000+0x0800=0x40011800,該地址為GPIOE的基地址 #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) //GPIOF_BASE=0x40000000+0x10000+0x0800=0x40011C00,該地址為GPIOF的基地址 #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) //GPIOG_BASE=0x40000000+0x10000+0x0800=0x40012000,該地址為GPIOG的基地址 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))#define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8)) //#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8 //定義typedef類型別名 typedef struct {volatile unsigned int CR;volatile unsigned int CFGR;volatile unsigned int CIR;volatile unsigned int APB2RSTR;volatile unsigned int APB1RSTR;volatile unsigned int AHBENR;volatile unsigned int APB2ENR;volatile unsigned int APB1ENR;volatile unsigned int BDCR;volatile unsigned int CSR; } RCC_TypeDef;#define RCC ((RCC_TypeDef *)0x40021000) //定義typedef類型別名 typedef struct { volatile unsigned int CRL; volatile unsigned int CRH; volatile unsigned int IDR; volatile unsigned int ODR; volatile unsigned int BSRR; volatile unsigned int BRR; volatile unsigned int LCKR; } GPIO_TypeDef; //GPIOA指向地址GPIOA_BASE,GPIOA_BASE地址存放的數據類型為GPIO_TypeDef #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)void LEDInit( void ) {RCC->APB2ENR|=1<<2; //GPIOA 時鐘開啟GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=0X00000003; }//粗略延時 void Delay_ms( volatile unsigned int t) {unsigned int i,n;for (n=0;n<t;n++)for (i=0;i<800;i++); }int main(void) {LEDInit();while (1){LED0=0;//LED熄滅Delay_ms(500);//延時時間LED0=1;//LED亮Delay_ms(500);//延時時間} }(3)復制粘貼完后,點擊左上角保存按鈕,在彈出的窗口內,輸入文件名main.c(如果不加后綴,就不會是.c文件),點擊保存,而后Text1文件就變成了main.c文件。
(4)右鍵點擊 Source Group 1 ,然后點擊 Add Existing Files to Group …(在工程下添加main.c文件)
(8)選中main.c文件,再點擊Add,然后關閉窗口,此時你會發現,Source Group 1 文件下新增了一個main.c文件。
3.編譯程序
點擊左上角編譯按鈕,開始編譯程序,此時0錯誤,0警告,表示編譯成功。
4、stm32程序仿真調試
1)調試前的設置
(1)首先點擊 魔法棒,然后在彈出的窗口內,點擊 Debug,勾選 Use Simulator ,再選擇 ULINK2/ME Cortex Debugger ,并點擊 Settings 。
(2)確定一下Port是JTAG,Reset可以設置為Autodetect或SYSRESEETREQ,然后點擊OK返回上一級窗口,再點擊OK。
2)開始調試
選中帶有紅色d的放大鏡開始調試,在②處就是仿真調試所需要的調試工具。
二、匯編語言
1.創建工程
創建一個新的文件,命名為ARM
2.添加文件
1.鼠標右鍵單擊Source Group 1,選擇Add New Item to Group
2.選擇 Asm File (.s) ,設置源文件的名稱,點擊Add
自此,添加文件的過程就完成了,就可以開始編寫匯編程序。
3.匯編程序
(1)在test文件中輸入如下代碼:
AREA 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(2)調試
調試前進行debug設置
4.分析文件
生成的hex文件如下:
:020000040800F2 :1000000000060020ED000008F5000008F7000008D9 :10001000F9000008FB000008FD00000800000000D7 :10002000000000000000000000000000FF000008C9 :10003000010100080000000003010008050100089C :100040000701000807010008070100080701000870 :100050000701000807010008070100080701000860 :100060000701000807010008070100080701000850 :100070000701000807010008070100080701000840 :100080000701000807010008070100080701000830 :100090000701000807010008070100080701000820 :1000A0000701000807010008070100080701000810 :1000B0000701000807010008070100080701000800 :1000C00007010008070100080701000807010008F0 :1000D00007010008070100080701000807010008E0 :1000E00007010008070100080701000809488047C8 :1000F00009480047FEE7FEE7FEE7FEE7FEE7FEE70A :10010000FEE7FEE7FEE7FEE704480549054A064B21 :1001100070470000FD0100085502000800000020A3 :1001200000060020000200200002002070477047F7 :100130007047000080B500F001F880BD82B041F248 :1001400004000021C4F202000191009150F8041C47 :1001500041F4803140F8041C50F8041C01F40031D3 :100160000091019901310191009919B90199B1F5F5 :10017000A06FF1D150F8041C890354BF0021012164 :1001800000910099012936D142F20001C4F2020126 :100190000A6842F010020A600A6822F003020A604C :1001A0000A6842F002020A600168016001680160A9 :1001B000016841F480610160016821F47C110160F3 :1001C000016841F4E811016050F8041C41F08071AD :1001D00040F8041C50F8041C8901FBD5016821F08B :1001E00003010160016841F002010160016801F052 :1001F0000C010829FAD102B07047000080B541F225 :100200000000C4F202000168002241F00101016017 :100210004168CFF6FF021140416001684FF6FF725E :10022000CFF6F66211400160016821F4802101607F :10023000416821F4FE0141604FF41F018160FFF726 :1002400079FF4EF60850CEF200004FF000610160D9 :1002500080BD00004FF00A004FF00B014FF00C0280 :100260004FF00D0300F009F800F00AF800F00BF869 :10027000DFF81CE0DFF81CF0FEE74FF005057047E3 :100280004FF0060670474FF007074FF00808704719 :080290007B0200088702000850 :040000050800025598 :00000001FF該文件為16進制的一串字符。hex文件的第一排字符稱之為擴展線性地址記錄,也稱為32位地址記錄或HEX386記錄。
在第一行數據020000040800F2中,其實際表達為0x02 0x00 0x00 0x04 0x08 0x00 0xf2。具體含義為
第一個字節 0x02表示本行數據的長度;
第二、三字節 0x00 0x00表示本行數據的起始地址;
第四字節 0x04表示數據類型,數據類型有:0x00、0x01、0x02、0x03、0x04、0x05
‘00’ Data Rrecord:用來記錄數據,HEX文件的大部分記錄都是數據記錄
‘01’ End of File Record: 用來標識文件結束,放在文件的最后,標識HEX文件的結尾
‘02’ Extended Segment Address Record: 用來標識擴展段地址的記錄
‘03’ Start Segment Address Record:開始段地址記錄
‘04’ Extended Linear Address Record: 用來標識擴展線性地址的記錄
‘05’ Start Linear Address Record:開始線性地址記錄
然后是數據,0x08 0x00
最后一個字節 0xf2為校驗和。
三、總結
因為沒有接入硬件設施,所以只能先進行程序的編譯和仿真測試,而沒有辦法下載到硬件上運行,這個LED燈閃爍的代碼不用深入了解,只是進行一個簡單的程序編譯調試,主要是學會如何安裝MDK軟件、建立工程、編寫代碼、編譯程序、仿真調試。
總結
以上是生活随笔為你收集整理的ARM汇编程序入门实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flag:中国红客联盟(实验)
- 下一篇: java d打字游戏_java实现快速打