4000336002
太原杏花岭区嵌入式开发培训机构哪家好 .小编程推荐中公优就业.优就业是中公教育IT培训品牌,致力于培养面向电商及互联网领域的人才,以学员就业为目的,优质就业为宗旨,是一家集网络营销师,ui合计师,SEO优化师,SEM竞价师,社会化媒体运营师,电商运营师,互联网产品经理,网页设计师,Web前端工程师,PHP工程师,Android工程师,IOS工程师,Java工程师,C/C++工程师,软件测试工程师等课程为一体的IT培训机构
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 ,;pseudoinstructiontranslatedtoADD,PC,#immed8 RSBS,,#0;Rd=0–Rm,ReverseSubtract(negative) MULS,,;Rd=Rd*Rm CMP,#immed8;Rd–ZeroExtended(#immed8) CMP,;Rn–Rm CMN,;Rn–NEG(Rm)
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="" 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]})