首页 STM32常用汇编指令

STM32常用汇编指令

举报
开通vip

STM32常用汇编指令在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。ARM指令使用的基本格式如下:〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉}opcode操作码;指令助记符,如LDR、STR等。cond可选的条件码;执行条件,如EQ、NE等。S可选后缀;若指定“S”,则根...

STM32常用汇编指令
在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。ARM指令使用的基本格式如下:〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉}opcode操作码;指令助记符,如LDR、STR等。cond可选的条件码;执行条件,如EQ、NE等。S可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。Rd目标寄存器。Rn存放第1操作数的寄存器。operand2第2个操作数arm的寻址方式如下:立即寻址寄存器寻址寄存器间接寻址基址加偏址寻址堆栈寻址块拷贝寻址相对寻址这里不作详细描述,可以查阅相关文档。数据处理指令Load/Store指令程序状态寄存器与通用寄存器之间的传送指令转移指令异常中断指令协处理器指令在S3C2410、S3C2440的数据手册中对各种汇编指令有详细的描述;这里只对较常见的作写介绍。1、相对跳转指令:b、bl这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。这两条指令的可跳转范围是当前指令前后32M。bfuna....funa:bfunb....funb:....2、数据传送指令mov,地址读取伪指令ldrmov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。movr1,r2movr1,#1024mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。ldrr1,=10243、内存访问指令ldr、str、ldm、stmldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有'='时标伪指令,否则表内存访问指令。ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。ldrr1,[r2,#4]ldrr1,[r2]ldrr1,[r2],#4strr1,[r2,#4]strr1,[r2]strr1,[r2],#4寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下:LDM/STM{<cond>}<addmode>Rn{!},<registers>4、加减指令add、subaddr1,r2,#1subr1,r2,#15、程序状态寄存器的访问指令msr,mrsARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。这两条指令分别是:状态寄存器到通用寄存器的传送指令(MRS)通用寄存器到状态寄存器的传送指令(MSR)其汇编格式如下:MRS{<cond>}Rd,CPSR|SPSR其汇编格式如下:MSR{<cond>}CPSR_f|SPSR_f,#<32-bitimmediate>MSR{<cond>}CPSR_<field>|SPSR_<field>,Rmmsrcpsr,r0mrsr0,cpsr6、异常中断指令异常中断指令可以分为一下两种:软件中断指令(SWI)断点指令(BKPT—仅用于v5T体系)软件中断指令SWI用于产生SWI异常中断,用来实现在用户模式下对操作系统中特权模式的程序的调用;断点中断指令BKPT主要用于产生软件断点,供调试程序用。7、其他伪指令.externmain.text.global_start_start:'.extern'定义一个外部符号(可以是变量也可以是函数),上面的代码表示表文本文件中引用的main是一个外部函数。'.text'表示下面的语句都属于代码段'.global'将本文件中的某个程序标号定义为全局的,如‘_start’就是个全局函数MRS(读状态寄存器)MRSr1,CPSR;CPSR--->r1MSR(写状态寄存器)MSRcpsr_c,#0xD3;CPSR[7...0]=0xD3STMFDSP!{R8-R9}含义:(1)SP=SP-4字节(2)R9--->SP(3)SP=SP-4(4)R8-->SPLDMFDSP!{R8-R9,PC}含义:(1)SP-->R8(2)SP=SP+4(3)SP-->R9(4)SP=SP+4(5)SP-->PC(6)SP=SP+4ldmiasp!{r0-r7pc}^^表示将spsr的值赋给cpsrBlable跳转指令PC<---lableBLlable带链接跳转指令LR<----PC-4,PC<---lableBXRm带状态切换跳转指令PC<----Rm,切换状态(Rm[0]=1,thumb,Rm[0]=0,ARM)%F2表示跳转到当前指令后面的标号2处%B0表示跳转到当前指令前面的标号0处[-----IF;|-----ELSE;]-----ENDIFIFlogicalexpression[logicalexpressionInstructionsInstructions{ELSE|InstructionsInstructions}]ENDIF(1)GBLL伪指令用于定义一个全局的逻辑变量,并初始化为{False}。GBLLBOOTLOADERBOOTLOADERSETL{TRUE}(2)GET(或INCLUDE)GET伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。INCLUDE..\\..\\kernel\\oal\\startup.s(3)IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。IMPORTBootloaderMainIMPORTMMUSetup(4)BL带返回的跳转指令(5)BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转BLabel;程序无条件跳转到标号Label处执行CMPR1,#0;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行BEQLabel(6)LDR指令的格式为:LDR{条件}目的寄存器,<存储器地址>LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。指令示例:LDRR0,[R1];将存储器地址为R1的字数据读入寄存器R0。LDRR0,[R1,R2];将存储器地址为R1+R2的字数据读入寄存器R0。LDRR0,[R1,#8];将存储器地址为R1+8的字数据读入寄存器R0。LDRR0,[R1,R2]!;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1LDRR0,[R1,#8]!;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。LDRR0,[R1],R2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。LDRR0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。LDRR0,[R1],R2,LSL#2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。(7)STR指令的格式为:STR{条件}源寄存器,<存储器地址>STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。与LDR对应(8)采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。以下指令:LDMIAR0,{R1,R2,R3,R4};R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。(9)SBC指令的格式为:SBC{条件}{S}目的寄存器,操作数1,操作数2SBC指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法。注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。指令示例:SUBSR0,R1,R2;R0=R1-R2-!C,并根据结果设置CPSR的进位标志位(10)BX带状态切换的跳转指令(11)MCR指令的格式为:MCR{条件}协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄存器。指令示例:MCRP3,3,R0,C4,C5,6;该指令将ARM处理器寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中。(12)CMP指令的格式为:CMP{条件}操作数1,操作数2CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT后缀的指令将可以执行。指令示例:CMPR1,R0;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位CMPR1,#100;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位(13)批量数据加载/存储指令LDM(或STM)指令的格式为:LDM(或STM){条件}{类型}基址寄存器{!},寄存器列表{∧}LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈(SDM)或出栈(LDM)。其中,{类型}为以下几种情况:IA每次传送后地址加1;IB每次传送前地址加1;DA每次传送后地址减1;DB每次传送前地址减1;FD满递减堆栈;ED空递减堆栈;FA满递增堆栈;EA空递增堆栈;{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。STMFDR13!,{R0,R4-R12,LR};将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈LDMFDR13!,{R0,R4-R12,PC};将堆栈内容恢复到寄存器(R0,R4到R12,LR)(14)ORR指令的格式为:ORR{条件}{S}目的寄存器,操作数1,操作数2ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。指令示例:ORRR0,R0,#3;该指令设置R0的0、1位,其余位保持不变。(15)BIC指令的格式为:BIC{条件}{S}目的寄存器,操作数1,操作数2BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。指令示例:BICR0,R0,#%1011;该指令清除R0中的位0、1、和3,其余的位保持不变。(16)ADR(小范围的地址读取伪指令)ADRL(中等范围的地址读取伪指令)LDR(大范围的地址读取伪指令)ldrr0,=0xFFFFC000用于将基于PC的地址或基于寄存器的地址读取到寄存器中。///伪指令通过汇编编译器替换成对应的ARM/Thumb指令。
本文档为【STM32常用汇编指令】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
绘画的问号
暂无简介~
格式:pdf
大小:116KB
软件:PDF阅读器
页数:0
分类:高中语文
上传时间:2019-11-23
浏览量:0