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

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

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

一文詳解Arm Cortex-M處理器指令集

安芯教育科技 ? 來源:靈動MM32 MCU ? 作者:Nuoeriris ? 2022-05-17 09:31 ? 次閱讀

Arm處理器是基于精簡指令集計算機(RISC)原理設(shè)計的,指令集和相關(guān)譯碼機制較為簡單,具有32位Arm指令集和16位Thumb指令集,Arm指令集效率高,但是代碼密度低,而Thumb指令集具有更好的代碼密度,卻仍然保持Arm的大多數(shù)性能上的優(yōu)勢,它是Arm指令集的子集。所有Arm指令都是可以有條件執(zhí)行的,而Thumb指令僅有一條指令具備條件執(zhí)行功能。Arm程序和Thumb程序可相互調(diào)用,相互之間的狀態(tài)切換開銷幾乎為零。

Cortex-M0處理器基于ARMv6-M架構(gòu),是一款功耗和性能較為均衡的處理器。Cortex-M0只支持56條指令的小指令集,其中大部分指令是16位指令。

Arm Cortex-M 指令集對比:

db60bce8-d57d-11ec-bce3-dac502259ad0.png

1. 指令集

1.1 在處理器內(nèi)移動數(shù)據(jù)

	

MOV,;RmandRncanbehighorlowregisters. MOVS, MOVS,#immed8;8位立即數(shù)值 MRS, MSR,

1.2 存儲器訪問

確保訪問的內(nèi)存地址是對齊的,這一點很重要。在ARMv6-M架構(gòu)(包括Cortex-M0和Cortex-M0處理器)上不支持非對齊傳輸。任何未對齊內(nèi)存訪問的嘗試都會導(dǎo)致HardFault異常。


	

LDR,[,];Rt=memory[Rn+Rm] STR,[,];memory[Rn+Rm]=Rt LDRH,[,];Rt=memory[Rn+Rm] STRH,[,];memory[Rn+Rm]=Rt LDRB,[,];Rt=memory[Rn+Rm] STRB,[,];memory[Rn+Rm]=Rt LDRSH,[,];Rt=SignExtend(memory[Rn+Rm]) LDRSB,[,];Rt=SignExtend(memory[Rn+Rm]) LDR,[,#immed5];Rt=memory[Rn+ZeroExtend(#immed5<<2)] STR??,[,#immed5];memory[Rn+ZeroExtend(#immed5<<2)]?=?Rt LDRH?,[,#immed5];Rt=memory[Rn+ZeroExtend(#immed5<<1)] STRH?,[,#immed5];memory[Rn+ZeroExtend(#immed5<<1)]?=?Rt LDRB?,[,#immed5];Rt=memory[Rn+ZeroExtend(#immed5)]STRB,[,#immed5];memory[Rn+ZeroExtend(#immed5)]=Rt LDR,[SP,#immed8];Rt=memory[SP+ZeroExtend(#immed8<<2)] STR??,[SP,#immed8];memory[SP+ZeroExtend(#immed8<<2)]?=?Rt LDR??,[PC,#immed8];Rt=memory[WordAligned(PC+4)+ZeroExtend(#immed8<<2)] LDR??,=immed32;pseudoinstructiontranslatedtoLDR,[PC,#immed8] LDR,label;pseudoinstructiontranslatedtoLDR,[PC,#immed8] LDM,{,,..};LoadMultiple //Ra=memory[Rn] //Rb=memory[Rn+4], //... LDMIA!,{,,..};LoadMultipleIncrementAfter LDMFD!,{,,..} //Ra=memory[Rn], //Rb=memory[Rn+4], //... //andthenupdateRntolastreadaddressplus4. STMIA!,{,,..};StoreMultipleIncrementAfter STMEA!,{,,..} //memory[Rn]=Ra, //memory[Rn+4]=Rb, //... //andthenupdateRntolaststoreaddressplus4.

1.3 ??臻g訪問

	

PUSH{,,..} PUSH{,,..,LR} POP{,,..} POP{,,..,PC}

1.4 算數(shù)運算

	

ADD,;Rd=Rd+Rm.Rd,Rmcanbehighorlowregisters. ADDS,,;Rd=Rn+Rm SUBS,,;Rd=Rn–Rm ADDS,,#immed3;Rd=Rn+ZeroExtend(#immed3) SUBS,,#immed3;Rd=Rn–ZeroExtend(#immed3) ADDS,#immed8;Rd=Rd+ZeroExtend(#immed8) SUBS,#immed8;Rd=Rd–ZeroExtend(#immed8) ADCS,,;Rd=Rd+Rm+Carry SBCS,,;Rd=Rd–Rm–Borrow ADDSP,SP,#immed7;SP=SP+ZeroExtend(#immed7<<2) SUB??SP,?SP,?#immed7?????;?SP?=?SP?–?ZeroExtend(#immed7<<2) ADD??SP,?;SP=SP+Rm.Rmcanbehighorlowregister. ADD,SP,;Rd=Rd+SP.Rdcanbehighorlowregister. ADD,SP,#immed8;Rd=SP+ZeroExtend(#immed8<<2) ADD??,PC,#immed8;Rd=(PC[31:2]<<2)?+?ZeroExtend(#immed8<<2) ADR??,

1.5 邏輯運算

	

ANDS,,;Rd=AND(Rd,Rm) ORRS,,;Rd=OR(Rd,Rm) EORS,,;Rd=XOR(Rd,Rm) BICS,,;Rd=AND(Rd,NOT(Rm)) MVNS,;Rd=NOT(Rm) TST,;AND(Rn,Rm)

1.6 移位和循環(huán)操作

	

ASRS,,#immed5;Rd=Rm>>immed5 LSLS,,#immed5;Rd=Rm<<#immed5 LSRS?,,#immed5;Rd=Rm>>#immed5ASRS,,;Rd=Rd>>Rm LSLS,,;Rd=Rd<,,;Rd=Rd>>RmRORS,,;Rd=RdrotaterightbyRmbits //Rotate_Left(Data,offset)=Rotate_Right(Data,(32-offset))

1.7 展開和順序反轉(zhuǎn)操作

這些反向指令通常用于在小端和之間轉(zhuǎn)換數(shù)據(jù)大整數(shù)。


	

REV,;Byte-ReverseWord //Rd={Rm[7:0],Rm[15:8],Rm[23:16],Rm[31:24]} REV16,;Byte-ReversePackedHalfWord //Rd={Rm[23:16],Rm[31:24],Rm[7:0],Rm[15:8]} REVSH,;Byte-ReverseSignedHalfWord //Rd=SignExtend({Rm[7:0],Rm[15:8]})

1.8 擴展操作

它們通常用于數(shù)據(jù)類型轉(zhuǎn)換。


	

SXTB,;SignedExtendedByte //Rd=SignExtend(Rm[7:0]) SXTH,;SignedExtendedHalfWord //Rd=SignExtend(Rm[15:0]) UXTB,;UnsignedExtendedByte //Rd=ZeroExtend(Rm[7:0]) UXTH,;UnsignedExtendedHalfWord //Rd=ZeroExtend(Rm[15:0])

1.9 程序流控制

	

B

條件轉(zhuǎn)移指令B

db77bb32-d57d-11ec-bce3-dac502259ad0.png

1.10 內(nèi)存屏障指令

在Cortex-M0和Cortex-M0處理器上支持內(nèi)存屏障指令,從而在Cortex-M處理器和其他ARM處理器家族中提供更好的兼容性。

//數(shù)據(jù)內(nèi)存屏障,確保所有內(nèi)存訪問都完成 //在新的內(nèi)存訪問被提交之前。


	

DMB

//數(shù)據(jù)同步屏障,確保所有的內(nèi)存訪問都完成 //在執(zhí)行下一條指令之前。


	

DSB

//指令同步障礙,刷新管道和 //確保之前所有的指令都已完成 //在執(zhí)行新指令之前。


	

ISB

1.11 異常相關(guān)指令

	

SVC ; Supervisor call CPSIE I ; Enable Interrupt (Clearing PRIMASK) CPSID I ; Disable Interrupt (Setting PRIMASK)

1.12 睡眠模式功能相關(guān)說明

//等待中斷,停止程序執(zhí)行,直到一個中斷到達, //如果處理器進入調(diào)試狀態(tài)。


	

WFI

//等待事件,如果設(shè)置了內(nèi)部事件寄存器,則清除 //內(nèi)部事件注冊和繼續(xù)執(zhí)行。 //停止程序執(zhí)行,直到事件(如中斷)到達 //如果處理器進入調(diào)試狀態(tài)。


	

WFE

//發(fā)送事件,設(shè)置本地事件寄存器并發(fā)送一個事件脈沖 //多處理器系統(tǒng)中的其他微處理器。


	

SEV

1.13 其他說明

	

NOP;NoOperation BKPT;Breakpoint YIELD;ExecuteasNOPontheCortex-M0processor

2. 指令說明

2.1 可訪問high registers的指令

絕大部分指令只能訪問low registers,也就是只能訪問R0~R7寄存器??梢栽L問high registers的指令只有兩條,這兩條指令都不更新APSR,指令沒有S后綴。


	

MOV,;RmandRncanbehighorlowregisters. ADD,;Rd=Rd+Rm.Rd,Rmcanbehighorlowregisters.

其它兩條和SP加法有關(guān)的可以訪問high registers的指令其本質(zhì)是ADD指令。


	

ADDSP, ADD,SP,

2.2 分配臨時變量的指令

函數(shù)內(nèi)的臨時變量分配到堆棧,進入函數(shù)給臨時變量分配空間時使用SUB指令。


	

SUB SP, SP, #immed7 ; SP = SP – ZeroExtend(#immed7<<2)

退出函數(shù)釋放臨時變量空間時使用ADD指令。


	

ADD SP, SP, #immed7 ; SP = SP + ZeroExtend(#immed7<<2)

上面兩條指令的立即數(shù)只有7位,最多可以增減SP指針127個字空間,如果超過127個字,使用這條指令:


	

ADD SP, ; SP = SP + Rm. Rm can be high or low register.

只有ADD指令,沒有SUB指令,如果需要SUB,那么給Rm賦值負數(shù)即可。

2.3 取臨時變量地址的指令

在堆棧分配了臨時變量空間后,總要取得臨時變量的地址才能做進一步的操作。


	

ADD , SP, #immed8 ; Rd = SP + ZeroExtend(#immed8<<2)

立即數(shù)不夠,可以用寄存器。


	

ADD , SP, ; Rd = Rd + SP. Rd can be high or low register.

2.4 RSBS指令

	

RSBS , , #0 ; Rd = 0 – Rm, Reverse Subtract (negative)

這是倒過來的減法,常量減去寄存器值,而且常量只能是0。所以這條指令實質(zhì)上就是一條取負數(shù)指令。

Rd = 0 - Rm 等價于:Rd = -Rm Rd 寄存器值等于負的 Rm 寄存器值。


						

						

					
								

原文標題:技術(shù)分享 | Cortex-M0中斷控制和系統(tǒng)控制(六)

文章出處:【微信公眾號:安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

    關(guān)注

    68

    文章

    18926

    瀏覽量

    227221
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365018
  • 指令集
    +關(guān)注

    關(guān)注

    0

    文章

    220

    瀏覽量

    23280

原文標題:技術(shù)分享 | Cortex-M0中斷控制和系統(tǒng)控制(六)

文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何選擇正確的Cortex-M處理器?

    某些芯片設(shè)計經(jīng)驗豐富但是不熟悉ARM系列處理器的設(shè)計者來說,也是很容易混淆這些產(chǎn)品的。不同的ARM 處理器有不同的指令集,系統(tǒng)功能和性能。本
    發(fā)表于 10-22 08:16

    ARM Cortex-M處理器詳解 精選資料分享

    Cortex-M 系列處理器指令集和高級中斷處理能力,以及 SoC系統(tǒng)級特性,調(diào)試和追蹤功能和性能的比較?! ?、簡介  今天, ARM
    發(fā)表于 07-16 07:57

    ARM處理器指令集與工作模式

    有限公司設(shè)計的低功耗成本的微處理器。ARM代表個公司ARM表示個技術(shù)ARM可以表示
    發(fā)表于 05-26 17:29

    Arm Cortex-M處理器Cortex-M85介紹

    Arm發(fā)布了新代的Cortex-M處理器,Cortex-M85。簡單粗暴的打個比方:Cortex-M
    發(fā)表于 07-15 14:59

    介紹易于使用的Arm Cortex-M處理器上的信號處理功能

    Cortex-M4,Cortex-M7,Cortex -M33或Cortex-M35P處理器,以
    發(fā)表于 07-29 14:48

    ARM Cortex-M處理器對比表

    延遲和高確定性操作。 ARM Cortex-M處理器對比表1功能Cortex-M0 Cortex-M0+Cortex-M1
    發(fā)表于 08-29 07:00

    處理器指令集設(shè)計

    處理器指令集設(shè)計垂直指令格式指令類型及其使用頻度CISC指令集特點 RISC指令集特點
    發(fā)表于 10-29 17:13 ?64次下載
    微<b class='flag-5'>處理器</b><b class='flag-5'>指令集</b>設(shè)計

    ARM指令集詳解

    ARM指令集詳解 內(nèi)容提要 ARM指令集 ARM指令集
    發(fā)表于 03-09 09:39 ?263次下載
    <b class='flag-5'>ARM</b><b class='flag-5'>指令集</b><b class='flag-5'>詳解</b>

    ARM白皮書】ARM Cortex-M處理器入門

    ARM Cortex-M處理器家族現(xiàn)在有8款處理器成員。在本文中,會比較Cortex-M系列處理器
    發(fā)表于 04-20 15:34 ?39次下載

    Cortex-M系列處理器指令集_指令集特性比較總結(jié)

    本文主要介紹Cortex-M系列處理器指令集指令集特性比較總結(jié),具體的跟隨小編起來了解下。
    發(fā)表于 04-18 16:59 ?7710次閱讀
    <b class='flag-5'>Cortex-M</b>系列<b class='flag-5'>處理器</b><b class='flag-5'>指令集</b>_<b class='flag-5'>指令集</b>特性比較總結(jié)

    Cortex-MCortex-A認識ARM處理器

    Cortex-MCortex-A認識ARM處理器
    的頭像 發(fā)表于 03-08 11:34 ?3313次閱讀

    ARM處理器的尋址方式和指令集介紹

    ARM處理器是基于精簡指令集計算機(RISC原理設(shè)計的,指令集和相關(guān)嶧碼機制較為簡單。ARM7TDM(S)具有32位
    發(fā)表于 11-24 17:24 ?33次下載
    <b class='flag-5'>ARM</b><b class='flag-5'>處理器</b>的尋址方式和<b class='flag-5'>指令集</b>介紹

    單片機、Cortex-M、Linux它們和嵌入式有什么區(qū)別?

    都有類似這樣的疑問,下面圍繞Cortex-M、 ARM、 Linux來講講相關(guān)內(nèi)容。 ARMCortex-M ARM
    的頭像 發(fā)表于 07-05 08:52 ?2813次閱讀
    單片機、<b class='flag-5'>Cortex-M</b>、Linux它們和嵌入式有什么區(qū)別?

    Cortex-M跑Linux操作系統(tǒng)能行嗎

    都有類似這樣的疑問,下面圍繞Cortex-MARM、 Linux來講講相關(guān)內(nèi)容。 ARMCortex-M ARM
    的頭像 發(fā)表于 07-19 09:35 ?1805次閱讀
    <b class='flag-5'>Cortex-M</b>跑Linux操作系統(tǒng)能行嗎

    單片機、Cortex-M與Linux和嵌入式有什么區(qū)別

    都有類似這樣的疑問,下面圍繞Cortex-M、 ARM、 Linux來講講相關(guān)內(nèi)容。 ARMCortex-M ARM
    的頭像 發(fā)表于 09-26 09:59 ?2209次閱讀