文章目錄
-
- 一、ARM Cortex-M4F處理器
-
- 1.1ARM Cortex-M4F處理器簡介
- 1.2 ARM Cortex-M4F處理器内部結構概要——嵌套中斷向量控制器
- 1.3 ARM Cortex-M4F處理器内部結構概要——存儲器保護單元
- 1.4 ARM Cortex-M4F處理器内部結構概要——調試解決方案
- 1.5 ARM Cortex-M4F處理器内部結構概要——總線接口
- 1.6 ARM Cortex-M4F處理器内部結構概要——浮點運算單元
- 1.7 ARMCortex-M4F處理器存儲器映像
- 1.8 ARM Cortex-M4F處理器的寄存器——概要
- 二、指令系統
-
- 2.1指令系統簡介
- 2.2指令系統——ARM系統架構
- 2.3指令系統——指令簡表與尋址方式
- 2.4指令系統——資料傳送類指令:取數指令
- 2.5指令系統——資料傳送類指令:存數指令
- 2.6指令系統——資料傳送類指令:堆棧操作指令
- 2.7指令系統——資料傳送類指令:寄存器間資料傳送指令
- 2.8指令系統——資料操作類指令:算術運算類指令
- 2.9指令系統——資料操作類指令:邏輯運算類指令
- 2.10指令系統——資料操作類指令:位測試指令
- 2.11指令系統——資料操作類指令:資料序轉指令(1)
- 2.12指令系統——資料操作類指令:資料序轉指令(2)
- 2.13指令系統——資料操作類指令:擴充類指令
- 2.14指令系統——跳轉控制類指令
- 2.15指令系統——其他指令
- 三、彙編語言的基本文法
-
- 3.1彙編語言的基本文法——彙編語言簡介
- 3.2彙編語言的基本文法——彙編語言格式
- 3.3彙編語言的基本文法——标号
- 3.4彙編語言的基本文法——操作碼
- 3.5 彙編語言的基本文法——操作數
- 3.6 彙編語言的基本文法——注釋
- 3.7 常用僞指令簡介(CCS環境為例介紹)——系統預定義的段
- 3.8 常用僞指令簡介——常量的定義
- 3.9 常用僞指令簡介——程式中插入常量
- 3.10 常用僞指令簡介——條件僞指令,檔案包含僞指令
- 四、指令集與機器碼對應表
-
- 4.1指令集與機器碼對應表——如何找到機器碼
一、ARM Cortex-M4F處理器
1.1ARM Cortex-M4F處理器簡介
- ARM Cortex-M4F是─種低功耗、高性能、高速度的處理器。
- 硬體方面支援除法指令,并且有着中斷處理程式和線程兩種模式。 在進行中斷方面,M4F具有着自動儲存處理器狀态和回複低延遲中斷。
- M4核心的定點運算的速度是M3核心的兩倍,而浮點運算速度比M3核心快十倍以上,同時功耗隻有一半。
1.2 ARM Cortex-M4F處理器内部結構概要——嵌套中斷向量控制器
嵌套中斷向量控制器(Nested Vectoredlnterrupt Controller,NVIC)是一個在Cortex M4F中内建的中斷控制器。
- 在MSP432系列晶片中,中斷源數為64個,優先等級可配置範圍為0-7,還可對優先等級進行分組。
- 為優化低功耗設計,在晶片可快速進入超低功耗狀态(MSP430),且在超低功耗睡眠模式下可喚醒。
- 包含一個24位倒計時定時器SysTick,即使系統在睡眠模式下也能工作,也為在RTOS同類核心晶片間移植帶來便利。
1.3 ARM Cortex-M4F處理器内部結構概要——存儲器保護單元
存儲器保護單元(Memory Protection Unit ,MPU)是指可以對一個標明的記憶體單元進行保護。
- 它将存儲器劃分為8個子區域。
- 子區域的優先級均是可自定義的。
- 處理器可以使指定的區域禁用和使能。
1.4 ARM Cortex-M4F處理器内部結構概要——調試解決方案
對存儲器和寄存器進行調試通路。
- 具有SWD或JTAG調試通路接口,或兩種都包括。
- Flash修補和斷點單元用于實作硬體斷點和代碼修補。
- 資料觀察點和觸發單元用于實作觀察點、觸發資源和系統分析。
- 指令跟蹤宏單元用于提供對printf()類型調試的支援。
- 跟蹤端口接口單元用來連接配接跟蹤端口分析儀,包括單線輸出模式。
1.5 ARM Cortex-M4F處理器内部結構概要——總線接口
ARM Cortex-M4F處理器提供先進的高性能總線(AHB-Lite)接口,包括的4個接口分别為: ICode存儲器接口,DCode存儲器接口和系統接口,還有基于高性能外設總線(ASB)的外部專用外設總線(PPB)
- 位段的操作可以細化到原子位段的讀寫操作。
- 對記憶體的通路是對齊的。
- 寫資料時采用寫緩沖區的方式。
1.6 ARM Cortex-M4F處理器内部結構概要——浮點運算單元
- 處理器可以處理單精度32位指令資料。
- 結合了乘法和累積指令用來提高計算的精度。
- 硬體能夠進行加減法、乘除法以及平方根等運算操作,同時也支援所有的IEEE資料四舍五入模式。
- 擁有32個專用32位單精度寄存器,也可作為16個雙字寄存器尋址。
- 通過采用解耦三級流水線來加快處理器運作速度。
1.7 ARMCortex-M4F處理器存儲器映像
存儲器映像是指:把這4GB空間當做存儲器來看待,分成若幹區間,都可安排實際的實體資源。
- 該處理器直接尋址空間為4GB,2^32=4GB,分為8個空間
- 位址範圍是:Ox0000_o000~OxFFFF_FFFF。
- ARM定出的條條框框是粗線條的,它依然允許晶片制造商靈活地配置設定存儲器空間,以制造出各具特色的MCU産品。
- CM4F的存儲器系統支援小端配置和大端配置。—般具體某款晶片在出廣時已經被廠廣商定義過,例如MSP432采用小端格式。
1.8 ARM Cortex-M4F處理器的寄存器——概要
學習一個CPU,了解其内部寄存器用途是重要一環。
CM4F處理器的寄存器包含:
- 用于資料處理與控制的寄存器。包括:RO~R15,其中R13作為堆棧指針SP。SP 實質上有兩個(MSP與PSP) ,但在同一時刻隻能有一個可以看到。
- 特殊功能寄存器,有預定義的功能,而且必須通過專用的指令來通路
- 浮點寄存器
ARMCortex-M4F處理器的寄存器——資料處理與控制寄存器
- 大部分能夠通路通用寄存器的指令都可以通路R0-R12。其中:低位寄存器(R0~R7)能夠被所有通路通用寄存器的指令通路;高位寄存器(R8~R12)能夠被所有32位通用寄存器指令通路,而不能被所有的16位指令通路。
- 寄存器R13被用作堆棧指針(SP) ,用于通路堆棧。
- 寄存器R14為子程式連接配接寄存器(LR)
- 寄存器R15是程式計數寄存器(PC),指向目前的程式位址。
ARMCortex-M4F處理器的寄存器——特殊功能寄存器
- 程式狀态字寄存器在内部分為以下幾個子寄存器: APSR、IPSR、EPSR。
- 中斷屏蔽寄存器的D31~D1位保留,隻有D0位(記為PM)有意義。當該位被置位時,除不可屏蔽中斷和硬體錯誤之外的所有中斷都會被屏蔽。
- 錯誤屏蔽寄存器與中斷屏蔽寄存器的差別在于它能夠屏蔽掉優先級更高的硬體錯誤異常。
- 基本優先級屏蔽寄存器提供了一種更加靈活的中斷屏蔽機制。
- 控制寄存器的D31~D2位保留,D1、D0有意義。
ARM Cortex-M4F處理器的寄存器——浮點寄存器
- 浮點運算時M4F處理器的最大亮點之一,是以浮點寄存器隻在Cortex-M4F處理器中存在,其中包含了用于浮點資料處理與狀态控制的寄存器。
- 浮點處理寄存器:S0~S31和D0-D15,S0-S31都是32位寄存器,每個寄存器都可用來存放單精度浮點數,它們兩兩組合可用來存放雙精度浮點數兩兩組合成成雙精度寄存器時可用D0-D15來通路。
- 浮點狀态控制寄存器:浮點狀态控制寄存器提供了浮點系統的應用程式級控制,其包括浮點運算結果的狀态資訊與定義一些浮點運算的動作。
負标志N
零标志Z
進位/借位标志C
溢出标志V
交替半精度控制位AHP
預設NaN模式控制位DN
清零模式控制位FZ
舍入模式控制位RMode
輸入非正常累計異常位IDC
不精确累積異常位IXC
下溢累積異常位UFC
溢出積累異常位OFC
二、指令系統
2.1指令系統簡介
2.2指令系統——ARM系統架構
- 在ARM系統中,使用架構(architecture)一詞,即體系結構,主要指使用的指令集。
- 同一架構,可以衍生出許多不同處理器型号,比如:ARMv7-M是一種架構型号,其中v7是指版本号,而基于該架構處理器有Cortex-M3、Cortex-M4、Cortex-M4F等。
2.3指令系統——指令簡表與尋址方式
指令簡表
尋址方式
舉例說明:
;立即數尋址
SUB R1,R0,#1 ;R1<一R0-1
MOV R0,#0xff ;立即數0xff裝入R0寄存器
;寄存器尋址
MOV R1,R2 ;<一R2
SUB R0,R1,R2 ;0<一R1-R2
;直接尋址
LDR Rt,label ;号label處連續取4位元組至寄存器中
LDRH Rt,label ;址label處讀取半字到Rt
LDRB Rt,label ;址label處讀取位元組到Rt
;偏移尋址及寄存器間接尋址
LDR R3,[PC,#100] ;為(PC + 100)的存儲器單元的内容加載到寄存器R3中
LDR R3,[R4] ;為R4的存儲單元的内容加載到寄存器中
2.4指令系統——資料傳送類指令:取數指令
存儲器中内容加載(load)到寄存器中的指令(取數指令)
2.5指令系統——資料傳送類指令:存數指令
寄存器中内容存儲(store)至存儲器中的指令(存數指令)
2.6指令系統——資料傳送類指令:堆棧操作指令
堆棧(stack)操作指令
- PUSH指令将寄存器值存于堆棧中,最低編号寄存器使用最低存儲位址空間,最高編号寄存器使用最高存儲位址空間;
- POP指令将值從堆棧中彈回寄存器,最低編号寄存器使用最低存儲位址空間,最高編号寄存器使用最高存儲位址空間。 堆棧操作指令舉例
PUSH {RO,R4-R7} ;将RO,R4~R7寄存器值入棧
PUSH{R2,LR} ;将R2,LR寄存器值入棧
POP{RO,R6,PC} ;出棧值到RO,R6,PC中,同時跳轉至PC所指向的位址
2.7指令系統——資料傳送類指令:寄存器間資料傳送指令
MOV指令:Rd表示目标寄存器;imm為立即數,範圍0x00~0xff
2.8指令系統——資料操作類指令:算術運算類指令
算術運算類指令限制條件
2.9指令系統——資料操作類指令:邏輯運算類指令
AND、EOR和ORR指令把寄存器Rn、Rm值逐位與、異或和或操作;BIC指令是将寄存器Rn的值與Rm的值的反碼按位作邏輯“與”操作,結果儲存到Rd。
ASR、LSL、LSR和ROR指令,将寄存器Rm值由寄存器Rs或立即數imm決定移動位數,執行算術右移、邏輯左移、邏輯右移和循環右移。
2.10指令系統——資料操作類指令:位測試指令
2.11指令系統——資料操作類指令:資料序轉指令(1)
該指令用于改變資料的位元組順序。Rn為源寄存器,Rd為目标寄存器,且必須為R0~R7之—。
2.12指令系統——資料操作類指令:資料序轉指令(2)
2.13指令系統——資料操作類指令:擴充類指令
2.14指令系統——跳轉控制類指令
;跳轉控制指令舉例
BEQ label ;條件轉移,标志位Z=1時轉移到label
BL funC ;調用子程式funC,把轉移前的下條指令位址儲存到LR
BX LR ;傳回到函數調用處
2.15指令系統——其他指令
三、彙編語言的基本文法
3.1彙編語言的基本文法——彙編語言簡介
3.2彙編語言的基本文法——彙編語言格式
- 編語言源程式可以用通用的文本編輯軟體編輯,以ASCII碼形式存盤。
- 具體的編譯器對彙編語言源程式的格式有一定的要求,為了能夠正确地産生目标代碼以及友善彙編語言的編寫,編譯器還提供了一些在彙編時使用的指令、操作符号,在編寫彙程式設計式時,也必須正确使用它們。
- 由于編譯器提供的指令僅是為了更好地做好“翻譯”工作,并不産生具體的機器指令,是以這些指令被稱為僞指令。
-
彙編語言源程式以行為機關進行設計,每一行最多可以包含以下四個部分。
标号: 操作碼 操作數 注釋
3.3彙編語言的基本文法——标号
- 如果一個語句有标号,則标号必須書寫在彙編語句的開頭部分。
- 可以組成标号的字元有:字母A ~ Z、字母a ~ z、數字0~9、下劃線“_”、美元符号“$ ”,但開頭的第一個符号不能為數字和$。
- 編譯器對标号中字母的大小寫敏感,但指令不區分大小。
- 标号長度基本上不受限制,但實際使用時通常不要超過20個字元。若希望更多的編譯器能夠識别,建議标号(或變量名)的長度小于8個字元。
- 标号後必須帶冒号“:”。
- 一個标号在一個檔案(程式)中隻能定義一次,否則重複定義,不能通過編譯。
- 一行語句隻能有一個标号,編譯器将把目前程式計數器的值賦給該标号。
3.4彙編語言的基本文法——操作碼
- 操作碼包括指令碼和僞指令,其中僞指令是指CCS開發環境ARMCortex-M4F彙編編譯器可以識别的僞指令。
- 對于有标号的行,必須用至少一個空格或制表符(TAB)将标号與操作 碼隔開。編譯器對标号中字母的大小寫敏感,但指令不區分大小。
- 對于沒有标号的行,不能從第一列開始寫指令碼,應以空格或制表符 (TAB)開頭。
3.5 彙編語言的基本文法——操作數
- 操作數可以是位址、标号或指令碼定義的常數,也可以是由僞運算符構成的表達式。
- 若一條指令或僞指令有操作數,則操作數與操作碼之間必須用空格隔開書寫。
- 操作數多于一個的,操作數之間用逗号“”分隔。操作數也可以是ARM Cortex-M4F内部寄存器,或者另一條指令的特定參數。
- 操作數中一般都有一個存放結果的寄存器,這個寄存器在操作數的最前面。
彙編語言的基本文法——操作數注意點
彙編語言的基本文法——操作數:僞運算符
3.6 彙編語言的基本文法——注釋
- 注釋即是說明文字,類似于C語言,多行注釋以“/”開始,以“/"結束。這種注釋可以包含多行,也可以獨占一行。
- 在CCS環境的ARMCortex-M4F處理器彙編語言中,單行注釋以“#”引導或者用“I/”引導。用“#”引導,“#”必須為單行的第一個字元。
3.7 常用僞指令簡介(CCS環境為例介紹)——系統預定義的段
- C語言程式在經過gcc編譯器最終生成.elf格式的可執行檔案。
- .elf可執行程式是以段為機關來組織檔案的。
- 通常劃分為如下幾個段:.text、.data和.bss,其中,.text是隻讀的代碼區,.data是可讀可寫的資料區,而.bss則是可讀可寫且沒有初始化的資料區。
3.8 常用僞指令簡介——常量的定義
- 使用常量定義,能夠提高程式代碼的可讀性,并且使代碼維護更加簡單。
- 常量的定義可以使用.equ彙編指令。
- 常量的定義還可以使用.set彙編指令,其文法結構與.equ相同。 例如:
3.9 常用僞指令簡介——程式中插入常量
用于程式中插入不同類型常量的常用僞指令:
插入字和字元串常量代碼:
3.10 常用僞指令簡介——條件僞指令,檔案包含僞指令
- .if條件僞指令後面緊跟着一個恒定的表達式((即該表達式的值為真),并且最後要以.endif結尾。中間如果有其他條件,可以用.else填寫彙編語句。
- .ifdef标号,表示如果标号被定義,執行下面的代碼。
- .include是一個附加檔案的連結訓示指令,利用它可以把另一個源檔案插入目前的源檔案—起彙編,成為一個完整的源程式。
- filename是一個檔案名,可以包含檔案的絕對路徑或相對路徑,但建議對于一個工程的相關檔案放到同一個檔案夾中,更多的時候能使用相對路徑。
- .section僞指令:使用者可以通過.section僞指令來自定義一個段。例如:
.section .isr vector, "a" @定義一個.isr vector段,"a"表示允許段
- .global僞指令:.global僞指令可以用來定義一個全局符号。例如:
.global symbol @定義一個全局符号symbol
- .extern僞指令: .extern僞指令的文法為: .extern symbol,聲明symbol為外部函數,調用時可以遍訪所有檔案找到該函數并且使用它。
.extern main @聲明main為外部函數
bl main @進入main函數
- .align僞指令: .align僞指令可以通過添加填充位元組使目前位置滿足一定的對齊方式。文法結構為:.align [exp[, fill]],其中,exp為0-16之間的數字,表示下一條指令對齊至2exp位置,若未指定,則将目前位置對齊到下一個字的位置,fill給出為對齊而填充的位元組值,可省略,預設為0x00。
.align 3@把目前位置計數器值增加到23的倍數上,若已是23的倍數,不做改變
- .end僞指令: .end僞指令聲明彙編檔案的結束。
四、指令集與機器碼對應表
4.1指令集與機器碼對應表——如何找到機器碼
-
第一步生成.Ist檔案
需要在內建環境裡對工程進行設定,讓它能夠生成.lst檔案,在本書裡內建環境為ccs。也可對于彙編和C/C++工程編譯生成.lst檔案。
-
第二步記錄,找規律
将指令按照正确的格式給變量指派,寫入main函數中編譯,編譯結束後檢視main.o.lst檔案,找到指令對應的十六進制機器碼,進行記錄
-
第三步确定機器碼
每個變量注意取不同的值,多次進行編譯記錄,然後找出規律,确定每個變量變化所改變的機器碼的部分。至此就可以完全确定這個指令所對應的機器碼。