精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

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

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

Arm Cortex-M 指令集對比:

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

1. 指令集

1.1 在處理器內移動數據

	

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

1.2 存儲器訪問

確保訪問的內存地址是對齊的,這一點很重要。在ARMv6-M架構(包括Cortex-M0和Cortex-M0處理器)上不支持非對齊傳輸。任何未對齊內存訪問的嘗試都會導致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 棧空間訪問

	

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

1.4 算數運算

	

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 移位和循環操作

	

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 展開和順序反轉操作

這些反向指令通常用于在小端和之間轉換數據大整數。


	

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 擴展操作

它們通常用于數據類型轉換。


	

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

條件轉移指令B

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

1.10 內存屏障指令

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

//數據內存屏障,確保所有內存訪問都完成 //在新的內存訪問被提交之前。


	

DMB

//數據同步屏障,確保所有的內存訪問都完成 //在執行下一條指令之前。


	

DSB

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


	

ISB

1.11 異常相關指令

	

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

1.12 睡眠模式功能相關說明

//等待中斷,停止程序執行,直到一個中斷到達, //如果處理器進入調試狀態。


	

WFI

//等待事件,如果設置了內部事件寄存器,則清除 //內部事件注冊和繼續執行。 //停止程序執行,直到事件(如中斷)到達 //如果處理器進入調試狀態。


	

WFE

//發送事件,設置本地事件寄存器并發送一個事件脈沖 //多處理器系統中的其他微處理器


	

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加法有關的可以訪問high registers的指令其本質是ADD指令。


	

ADDSP, ADD,SP,

2.2 分配臨時變量的指令

函數內的臨時變量分配到堆棧,進入函數給臨時變量分配空間時使用SUB指令。


	

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

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


	

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

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


	

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

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

2.3 取臨時變量地址的指令

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


	

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

立即數不夠,可以用寄存器。


	

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

2.4 RSBS指令

	

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

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

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


						

						

					
								

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

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

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

    關注

    68

    文章

    19160

    瀏覽量

    229116
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9046

    瀏覽量

    366810
  • 指令集
    +關注

    關注

    0

    文章

    222

    瀏覽量

    23365

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

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

    ARM Cortex-M處理器對比表

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

    處理器指令集設計

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

    ARM指令集詳解

    ARM指令集詳解 內容提要 ARM指令集 ARM指令集
    發表于 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處理器家族現在有8款處理器成員。在本文中,會比較Cortex-M系列處理器
    發表于 04-20 15:34 ?39次下載

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

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

    Cortex-MCortex-A認識ARM處理器

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

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

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

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

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

    Cortex-M跑Linux操作系統能行嗎

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

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

    都有類似這樣的疑問,下面圍繞Cortex-MARM、 Linux來講講相關內容。 ARMCortex-M ARM
    的頭像 發表于 09-26 09:59 ?2270次閱讀