0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度剖析ARM內(nèi)核寄存器及基本匯編語言1

jf_78858299 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2023-04-24 09:59 ? 次閱讀
對(duì)于嵌入式開發(fā)者來說,了解匯編語言和內(nèi)核寄存器是對(duì)內(nèi)核深入理解的基礎(chǔ)
 ..增加 2.2 匯編偽指令 章節(jié)					2021/12/12
 ..完善 2.3 ARM匯編指令集						2021/12/12
 ..增加 3.1 不同編譯器的反匯編					2021/12/14 
 ..增加 3.2 C和匯編 比較分析				        2021/12/15 
 從開始寫起也沒想到內(nèi)容有這么多,其中有很多干貨的東西,希望自己能夠說明到了,
 其中有很多推薦的博文和網(wǎng)站,在此要特別感謝韋東山老師的視頻,絕對(duì)干貨滿滿
  • 一、ARM內(nèi)核寄存器
    • 1.1 M3/M4內(nèi)核寄存器
    • 1.2 A7內(nèi)核寄存器
    • 1.3 ARM中的PC指針的值
  • 二、ARM匯編語言
    • 2.1 ARM匯編基礎(chǔ)
    • 2.2 匯編偽指令
    • 2.3 ARM匯編指令集
  • 三、代碼反匯編簡析
    • 3.1 不同編譯器的反匯編
    • 3.2 C 和 匯編 比較分析

開頭直接來看幾個(gè)簡單的匯編指令:

MOV R0,R1``MOV PC,R14

上面的指令中使用了匯編 MOV指令,但是其中的 R0,R1,R14,PC分別是什么?哪來的?怎么用?

要講 ARM 匯編語言,必須得先了解ARM的內(nèi)核寄存器,內(nèi)核處理所有的指令計(jì)算,都需要用到內(nèi)核寄存器,所以ARM匯編里面指令大都是基于寄存器的操作。

文章前推薦韋東山老師的單片機(jī)核心視頻,視頻可以在韋東山老師官網(wǎng)里面找到:百問網(wǎng)

ARM版本簡單介紹:

內(nèi)核(架構(gòu))版本 處理器版本
ARMv1 ARM1
ARMv2 ARM2、ARM3
ARMv3 ARM6、
ARMv4 ARM7、StrongARM
ARMv5 ARM9、ARM10E
ARMv6 ARM11
ARMv7 ARM Cortex-A、ARM Cortex-M、ARM Cortex-R
ARMv8 ARM Cortex-A30、ARM Cortex-A50、ARM Cortex-A70

一、ARM內(nèi)核寄存器

內(nèi)核寄存器與外設(shè)寄存器:

內(nèi)核寄存器與外設(shè)寄存器是完全不同的概念。內(nèi)核寄存器是指 CPU 內(nèi)部的寄存器,CPU處理所有指令數(shù)據(jù)需要用到這些寄存器保存處理數(shù)據(jù);外設(shè)寄存器是指的 串口,SPI,GPIO口這些設(shè)備有關(guān)的寄存器。

在我的另一篇博文:FreeRTOS記錄(三、FreeRTOS任務(wù)調(diào)度原理解析_Systick、PendSV、SVC)內(nèi)核中斷管理 章節(jié)講到過Cortex-M的寄存器的相關(guān)內(nèi)容,這里我們?cè)俸唵握f明一下:

1.1 M3/M4內(nèi)核寄存器

對(duì)于M3/M4而言:圖片R13,棧指針(Stack Pointer)

  • R13寄存器中存放的是棧頂指針,M3/M4 的棧是向下生長的,入棧的時(shí)候地址是往下減少的。
  • 裸機(jī)程序不會(huì)用到PSP,只用到MSP,需要運(yùn)行RTOS的時(shí)候才會(huì)用到PSP。
  • 堆棧主要是通過POP,PUSH指令來進(jìn)行操作。在執(zhí)行 PUSH 和 POP 操作時(shí), SP 的地址寄存器,會(huì)自動(dòng)調(diào)整。

R14 ,連接寄存器(Link Register)

  • LR 用于在調(diào)用子程序時(shí)存儲(chǔ)返回地址。例如,在使用 BL(分支并連接, Branch and Link)指令時(shí),就自動(dòng)填充 LR 的值(執(zhí)行函數(shù)調(diào)用的下一指令),進(jìn)而在函數(shù)退出時(shí),正確返回并執(zhí)行下一指令。如果函數(shù)中又調(diào)用了其他函數(shù),那么LR將會(huì)被覆蓋,所以需要先將LR寄存器入棧。
  • 保存子程序返回地址。使用BL或BLX時(shí),跳轉(zhuǎn)指令自動(dòng)把返回地址放入r14中;子程序通過把r14復(fù)制到PC來實(shí)現(xiàn)返回
  • 當(dāng)異常發(fā)生時(shí),異常模式的r14用來保存異常返回地址,將r14如??梢蕴幚砬短字袛?/li>

R15,程序計(jì)數(shù)器(Program Count)

  • 在Cortex-M3中指令是3級(jí)流水線,出于對(duì)Thumb代碼的兼容的考慮,讀取pc時(shí),會(huì)返回當(dāng)前指令地址+4的值。
  • 讀 PC 時(shí)返回的值是當(dāng)前指令的地址+4,關(guān)于M3、M4 和 A7的 PC值的問題需要單獨(dú)來解釋一下

其中程序狀態(tài)寄存器 XPSR:圖片

程序狀態(tài)寄存器,該寄存器由三個(gè)程序狀態(tài)寄存器組成 應(yīng)用PSR(APSR) :包含前一條指令執(zhí)行后的條件標(biāo)志,比較結(jié)果:大于等于,小于,進(jìn)位等等; 中斷PSR(IPSR ) :包含當(dāng)前ISR的異常編號(hào) 執(zhí)行PSR(EPSR) :包含Thumb狀態(tài)位

1.2 A7內(nèi)核寄存器

對(duì)于 A7 而言:圖片(上圖取自原子教材,此圖在官方文檔《ARM Cortex-A(armV7)編程手冊(cè)V4.0》中第3章.ARM Processor Modes and Registers 部分有英文原版,這里用中文版本更容易理解)

A7的 R13、R14、R15 的作用和 M3/4類似。

需要注意的一點(diǎn)就是,對(duì)于A7而言 R15,程序計(jì)數(shù)器(Program Count)

  • 讀 PC 時(shí)返回的值是當(dāng)前指令的地址+8, PC 指向當(dāng)前指令的下兩條指令地址。
  • 由于ARM指令總是以字對(duì)齊的,故PC寄存器 bit[1:0] 總是00。

A7內(nèi)核的程序狀態(tài)寄存器 CPSR:圖片

1.3 ARM中的PC指針的值

因?yàn)锳RM指令采用三級(jí)流水線機(jī)制,所以PC指針的值并不是當(dāng)前執(zhí)行的指令的地址值:

  1. 當(dāng)前執(zhí)行地址A的指令,
  2. 同時(shí)已經(jīng)在對(duì)下一條指令進(jìn)行譯碼,
  3. 同時(shí)已經(jīng)在讀取下下一條指令:PC = A +4 (Thumb/Thumb2指令集)、PC = A + 8 (ARM指令集)

在文檔《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》中對(duì)于 PC 的值有明確的說明:圖片

M3/M4/M0:

PC的值 = 當(dāng)前地址 + 4;

下面是一個(gè) STM32F103 反匯編程序,找了一段有[pc,#0]的代碼,方便判斷:圖片

A7:

PC的值 = 當(dāng)前地址 + 8;

圖片

二、ARM匯編語言

ARM芯片屬于精簡指令集計(jì)算機(jī)(RISC:Reduced Instruction Set Computing),具體說明在下面這篇博文5.4小結(jié)有過說明:

STM32的內(nèi)存管理相關(guān)(內(nèi)存架構(gòu),內(nèi)存管理,map文件分析)

2.1 ARM匯編基礎(chǔ)

2.1.1 ARM指令集說明

最初,ARM公司發(fā)布了兩類指令集:

  1. ARM指令集,32位的ARM指令,每條指令占據(jù)32位,高效,但是太占空間;
  2. Thumb指令集,16位的Thumb指令,每條指令占據(jù)16位,節(jié)省空間;

比如:MOV R0,R1 這條指令,可能是16位的,也可能是32位的

那么在匯編中是如何在 ARM 指令 和 Thumb 指令之間切換呢:

/*ARM指令 與 Thumb 指令 的切換*/

CODE16  ;(表示下面是 Thumb 指令)
...
...

;(調(diào)用下面的B函數(shù))
bx  B_addr;(B的地址B_addr的bit0 = 0,表示跳轉(zhuǎn)過去執(zhí)行 ARM 指令)
;A 函數(shù)
...

CODE32  ;(表示下面是 ARM 指令)
...
...
;B 函數(shù)
;(回到上面的A函數(shù))
bx  A_addr + 1 ;(A的地址A_addr的bit0 = 1,表示跳轉(zhuǎn)過去執(zhí)行 Thumb 指令)
...

/**********************/

對(duì)于A7、ARM7、ARM9 內(nèi)核而言它們支持 16位的Thumb 指令集 和 32位的 ARM 指令集

對(duì)于M3、M4 內(nèi)核而言它們支持的是 Thumb2 指令集,它支持16位、32位指令混合編程

對(duì)于內(nèi)核來說使用的是 ARM指令集 還是 Thumb指令集,就是在 XPSR 和 CPSR

在M3/M4中, XPSR 寄存器的 T(bit24):1表示 Thumb指令集圖片根據(jù)上面所述,M3是使用的 Thumb2 指令集,所以會(huì)有 T 總是 1.

在A7中 CPSR中的:T(bit5) :控制指令執(zhí)行狀態(tài),表明本指令是 ARM 指令還是 Thumb 指令,通常和 J(bit24)一起表明指令類型圖片

J(bit24) T(bit5) 指令集
0 0 ARM
0 1 Thumb
1 1 ThumbEE -- 提供從Thumb-2而來的一些擴(kuò)充性,在所處的運(yùn)行環(huán)境下,使得指令集能特別適用于運(yùn)行階段的編碼產(chǎn)生(例如實(shí)時(shí)編譯)。Thumb-2EE是專為一些語言如Limbo、Java、C#、Perl和Python,并能讓實(shí)時(shí)編譯器能夠輸出更小的編譯碼卻不會(huì)影響到性能。
1 0 Jazelle

回到開始的指令 MOV R0,R1

code 16  ;(表示下面指令是16位的 Thumb 指令)
MOV R0,R1
code 32  ;(表示下面指令是32位的 ARM 指令)
MOV R0,R1
Thumb    ;(編譯器會(huì)根據(jù)指令自動(dòng)識(shí)別是32位還是16位的 Thumb2MOV R0,R1

2.1.2 ARM匯編格式

編碼格式:

不同指令集的編碼格式(以 LDR 為例),摘自《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》:圖片以“數(shù)據(jù)處理”(其他的還有內(nèi)存訪問,分支跳轉(zhuǎn)等)指令為例,UAL匯編格式為:圖片Operation

表示各類匯編指令,比如 ADD、MOV;cond表示conditon,即該指令執(zhí)行的條件,如 EQ,NE 等;S表示該指令執(zhí)行后,是否會(huì)影響CPSR寄存器的值, 是否影響CPSR 寄存器的值,書寫時(shí)影響CPSR,否則不影響;Rd

為目的寄存器,用來存儲(chǔ)運(yùn)算的結(jié)果;Rn 第一個(gè)操作數(shù)的寄存器Operand2第二個(gè)操作數(shù) ,其可以有3種操作源:1-- 立即數(shù) 2-- 寄存器 3-- 寄存器移位

其指令編碼格式如下(32位):|bit 31-28 |27-25 |24-21 |20 |19-16 | 15-12 |11-0 | |--|--|--|--|--|--|--|--|--| |cond | 001 |Operation |S |Rn |Rd | Operand2 |

舉個(gè)例子:

...
CMP R0,R2      ;比較R0和R2的值
MOV EQ R0,R1  ;加上EQ,如果上面R0的值和R2的值相等的話,才執(zhí)行此語句
...

對(duì)于“數(shù)據(jù)處理”處理指令中的Operation ,指令集如下:圖片對(duì)于其中的條件cond ,如下:圖片

2.1.3 立即數(shù)

在一條ARM數(shù)據(jù)處理指令中,除了要包含處理的數(shù)據(jù)值外,還要標(biāo)識(shí)ARM命令名稱,控制位,寄存器等其他信息。這樣在一條ARM數(shù)據(jù)處理指令中,能用于表示要處理的數(shù)據(jù)值的位數(shù)只能小于32位;

在上面的ARM匯編格式中我們介紹過,ARM在指令格式中設(shè)定,只能用指令機(jī)器碼32位中的低12位來表示要操作的常數(shù)。圖片

那么對(duì)于指令MOV R0, #value(把value的值存入R0寄存器)而言,value 的值也不能是任意的值,其值只能是符合某些規(guī)定的數(shù),在官方文檔中 value 的值需要滿足如下條件:圖片什么是立即數(shù)?

滿足上圖中條件的數(shù)我們稱之為 立即數(shù),立即數(shù)就是符合一定規(guī)矩的數(shù)。

立即數(shù)表示方式:每個(gè)立即數(shù)由一個(gè)8位的常數(shù)循環(huán)右移偶數(shù)位得到。其中循環(huán)右移的位數(shù)由一個(gè)4位二進(jìn)制的兩倍表示。

立即數(shù) = 一個(gè)8位的常數(shù) 循環(huán)位移 偶數(shù)位

一個(gè)8bit常數(shù)循環(huán)右移(Y*2 = {0,2,4,6,8, ...,26, 28, 30})就得到一個(gè)立即數(shù)了;(為什么是0到30的偶數(shù)下面解釋)

如果需要深入理解立即數(shù),推薦一篇博文:深刻認(rèn)識(shí) -->> 立即數(shù)

ARM處理器是按32位來處理數(shù)據(jù)的,ARM處理器處理的數(shù)據(jù)是32位,為了擴(kuò)展到32位,因此使用了構(gòu)造的方法,在12位中用8位表示基本數(shù)據(jù)值,用4位表示位移值,通過用8位基本數(shù)據(jù)值往右循環(huán)移動(dòng)4位位移值*2次,來表示要操作的常數(shù)。

這里要強(qiáng)調(diào)最終的循環(huán)次數(shù)是4位位移值乘以2得到的,所以得到的最終循環(huán)次數(shù)肯定是一個(gè)偶數(shù),為什么要乘以2呢,實(shí)質(zhì)還是因?yàn)榉秶粔颍?位表示位移次數(shù),最大才15次(移位0,等于沒有循環(huán)),加上8位數(shù)據(jù)還是不夠32位,這樣只能通過ALU的內(nèi)部結(jié)構(gòu)設(shè)計(jì)將4位位移次數(shù)乘以2,這樣就能用12位表示32位常數(shù)了。

所以 12bit 數(shù)據(jù)存放格式如下:|bit 11-8 |7-0 | |--|--|--|--|--|--|--|--|--| |移位 1111b (0~15) | 8bit常數(shù) |

但是我們?nèi)ヅ袛嘁粋€(gè)數(shù)是否立即數(shù),實(shí)在是太麻煩了,但是我們想把任意數(shù)值賦給 R0 寄存器,怎么辦? 這就需要用到偽指令了,下面說一說什么是偽指令。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9027

    瀏覽量

    366476
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119814
  • PC
    PC
    +關(guān)注

    關(guān)注

    9

    文章

    2056

    瀏覽量

    153933
  • 匯編語言
    +關(guān)注

    關(guān)注

    14

    文章

    409

    瀏覽量

    35690
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    匯編語言長什么樣子的呢

    文章目錄匯編語言長什么的樣子呢?ARM匯編指令條件和狀態(tài)Status碼ARM匯編尋址方式數(shù)據(jù)操作(ALU操作)邏輯操作(與,或,非,異或)比
    發(fā)表于 12-14 07:28

    如何用C語言寄存器匯編語言去實(shí)現(xiàn)流水燈

    目錄一、初始化1、地址映射和寄存器映射2、接線3、程序下載二、用C語言寄存器實(shí)現(xiàn)流水燈三、匯編語言實(shí)現(xiàn)流水燈四、心得一、初始化
    發(fā)表于 02-10 07:55

    ARM匯編語言與指令格式資料分享

    1ARM匯編語言與指令格式介紹匯編語言介紹概念指的是用助記符代替操作碼,用地址符號(hào)或標(biāo)簽(:#&)代替地址碼的編程語言。優(yōu)缺點(diǎn)優(yōu)點(diǎn)
    發(fā)表于 04-22 16:10

    匯編語言教程-段寄存器的說明語句

    匯編語言教程-段寄存器的說明語句   在匯編語言源程序中可以定義多個(gè)段,每個(gè)段都要與一個(gè)段寄存器建立一種對(duì)應(yīng)關(guān)系。建立這
    發(fā)表于 03-27 17:17 ?1383次閱讀

    ARM匯編語言官方手冊(cè)(中文)

    ARM匯編語言官方手冊(cè)(中文)匯編語言ARM匯編語言官方手冊(cè)(中文)
    發(fā)表于 12-28 15:02 ?212次下載

    匯編語言

    匯編語言舉例,比如讀寄存器內(nèi)容的源代碼、匯編語言制作的光帶菜單及源程序、獲得操作系統(tǒng)版本的匯編源代碼等
    發(fā)表于 12-31 10:40 ?33次下載

    51單片機(jī)匯編語言教程_單片機(jī)的特殊功能寄存器

    51單片機(jī)匯編語言教程:7課單片機(jī)的特殊功能寄存器
    發(fā)表于 01-19 15:26 ?0次下載

    匯編語言學(xué)習(xí)

    寄存器 一個(gè)cpu有多個(gè)寄存器 就是cpu中可以存儲(chǔ)數(shù)據(jù)的器件,一個(gè)cpu中有多個(gè)寄存器匯編語言由一下3類組成 1、
    發(fā)表于 11-23 18:06 ?14次下載
    <b class='flag-5'>匯編語言</b>學(xué)習(xí)

    [從零學(xué)習(xí)匯編語言] -寄存器詳解

    文章目錄前言一、 存儲(chǔ)與通用寄存器1. 存儲(chǔ)2. 通用寄存器前言上一章我們?cè)唵蔚慕榻B過計(jì)算機(jī)中的一些硬件和軟件的相關(guān)概念,還不熟悉的小
    發(fā)表于 11-26 20:51 ?8次下載
    [從零學(xué)習(xí)<b class='flag-5'>匯編語言</b>] -<b class='flag-5'>寄存器</b>詳解

    [從零學(xué)習(xí)匯編語言] - 寄存器與內(nèi)存訪問

    [從零學(xué)習(xí)匯編語言] - 寄存器與內(nèi)存訪問
    發(fā)表于 11-26 20:51 ?13次下載
    [從零學(xué)習(xí)<b class='flag-5'>匯編語言</b>] - <b class='flag-5'>寄存器</b>與內(nèi)存訪問

    ARM匯編語言官方手冊(cè)

    ARM匯編語言官方手冊(cè)
    發(fā)表于 10-10 10:44 ?29次下載

    深度剖析ARM內(nèi)核寄存器及基本匯編語言2

    M3/M4內(nèi)核寄存器 * 1.2 A7內(nèi)核寄存器 * 1.3 ARM中的PC指針的值 * 二、
    的頭像 發(fā)表于 04-24 10:00 ?1035次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>剖析</b><b class='flag-5'>ARM</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>寄存器</b>及基本<b class='flag-5'>匯編語言</b>2

    深度剖析ARM內(nèi)核寄存器及基本匯編語言3

    M3/M4內(nèi)核寄存器 * 1.2 A7內(nèi)核寄存器 * 1.3 ARM中的PC指針的值 * 二、
    的頭像 發(fā)表于 04-24 10:01 ?1161次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>剖析</b><b class='flag-5'>ARM</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>寄存器</b>及基本<b class='flag-5'>匯編語言</b>3

    單片機(jī)匯編語言的結(jié)構(gòu)/數(shù)據(jù)類型/匯編指令

    開發(fā)匯編語言是為了為機(jī)器級(jí)代碼指令提供助記符或符號(hào),匯編語言程序由助記符組成,因此應(yīng)將它們翻譯成機(jī)器代碼。負(fù)責(zé)這種轉(zhuǎn)換的程序稱為匯編程序。匯編語言通常被稱為低級(jí)
    的頭像 發(fā)表于 07-07 12:28 ?2851次閱讀

    ARM匯編語言工具

    電子發(fā)燒友網(wǎng)站提供《ARM匯編語言工具.pdf》資料免費(fèi)下載
    發(fā)表于 11-06 09:12 ?0次下載
    <b class='flag-5'>ARM</b><b class='flag-5'>匯編語言</b>工具