关键词不能为空

当前您在: 主页 > 英语 >

arm汇编编程(示例)

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-16 20:44
tags:

-

2021年2月16日发(作者:永远爱你的英文)


一、


arm


的认知及基本概念

< br>


(



).arm


的基本概念



1.


什么是


arm





arm


是 一家英国电子公司的名字,全名是


Advanced RISC Machine





这家企 业设计了大量高性能、廉价、耗能低的


RISC


(精简指令集) 处理器,


ARM


公司


只设计芯片而不生 产,它将



技术授权给世界上许多公司和厂商。目前采用


arm


技术知识产权内核的微处理器,即通常


所说的


arm


微处理器










所以< /p>


arm


也是对一类微处理器的通称。










arm


指令集体系版本号(软件)为


V1 ~ V7


目前


V1 ~ V3


已很少见。从


V4


版不再与以


前的版本兼容。

< p>





arm



CPU


系列(硬件) 主要有



ARM7 ~ ARM11










2.


典型的嵌入式处理器






arm









占市场


79.5%



ARM





mips








占市场


13.9%



MIPS





microSPARC


占市场


3.1%




SUN






PowerPc





占市场


2.8%




IBM





其它









占市场


0.8%






3. arm


的应用范围:






工业控制:如机床、自动控制等






无线通信:如手机







网络应用:如






电子产品:如音视频播放噐、机顶 盒、游戏机、数码相机、打印机






其它各领域:如军事、医疗、机器人、智能家居等




4.


计算机体系结构





见图:冯


.


诺依曼计算机体系图









.


诺依曼体系结构








处理器使用同一个存储器,经由同一个总线传输








完成一条指令需要


3


个步骤:即取指令


->


指令译码


->


执行指令








指令和数据共享同一总线的结构





哈佛体系结构








将程序指令存储和数据存储分开








中央处理器首先到程序指令存储器中读取程序指令。解码后到 数据地址,再到相应的


数据存储器读取数据,然后执行指令








程序指令存储与数据存储分开,可以使指令和数据有不同的数 据宽度。







5.


复杂指令集与精简指令集





CISC


复杂指令集:


采用冯


.


诺依曼体系结 构。


数据线和指令线分时复用


(只能通过一辆车)











存储器操作指令多



汇编程序相对简单



指令结束后响应中断



CPU


电路丰富



面积


大功耗大









RISC


精简指令集:采用哈佛体系结构。数据线和指令线分离(同时能通过多辆车)











对存储器操作有限



汇编程序占空间大



在适当地方响应中断



CPU


电路较少



体积


小功耗低










ARM


采用


RISC


精简指令集








Thumb



ARM


体系结构中一种


16


位的指令集。











ARMv4T

之后,的


ARM


处理器有一种


16 -bit


指令模式,叫做


Thumb


, 较短的指


令码提供整体更佳的编码密度,


更有效地使用有限的内 存带宽。


所有



ARM9


和后来的家族,


包括



XScale


都纳入了



Thumb


技术。












ARM


有两种指令集:

< br>RISC



Thumb



6. arm


的思想



1) arm


体系的总思想:






在不牺 牲性能的同时,尽量简化处理器。同时从体系结构上灵活支持处理器扩展。采用


RISC


结构。


RISC


处理器简化了处理器结 构,


减少复杂功能指令的同时,


提高了处理器速度。

< p>






ARM



M IPS


都是典型的


RISC


处理器




2) arm


的流水线结构










arm


处 理器使用流水线来增加处理器指令流的速度,这样可以使几个操作同时进行。并


使处理和 存储器系统连续操作。






arm


处理器分为三级:取指


->


译码


->


执行< /p>









取指:指令从存储器中取出









译码:对指令使用的寄存器进行译码









执行:从寄存器组中读取寄存器, 执行移位和


ALU


操作,寄存器被写回到寄存器组








3) ARM


处理器支持的类型









字节




8










半字




16















32

















**


所有数据操作都以字为单位









**ARM


指令的长度刚好是一个字,


Thumb


指令长度刚好是半个字






4) ARM


处理器状态









ARM


处 理器内核使用


ARM


结构,该结构包含


32


位的


ARM


指令集和


16



Thumb


指令集, 因此


ARM


有两种操作状态









ARM


状 态:


32










Thumb


状态:

< br>16







5)


处理器模式









ARM


处理器共有

< br>7


种运行模式:










用户:




正常程序工作模式,不能直接切换到其它模式









系统:




用于支持操作系统的特权任务,可以直接切换到其它模式









快中断:支持高速数据传输及通道 处理,


FIQ


异常响应时进入此模式









中断:




用于通用中断处理,


IRQ


异常响应时进入此模式









管理:




操作系统保护代码,系统复位和软件中断响应时进入此模式









中止:




用于支持虚拟内存或存储器保护,用于


MMU








未定义:支持硬件协处理器的软件 仿真,未定义指令异常响应时进入此模式。




(



)


、经典平台硬件组成< /p>







见图:


arm


硬件组成图








开发板 一般是由一块组成的,


有核心器件和外围器件接口等,


但是有的 是由两块板子组


成,主版和核心板,主版上主要是外围接口,外围器件等,核心板上主要 是核心器件,还有


一些晶振电路等













1.


核心板


(


天嵌



2440)











CPU


处理器




S3C2440AL


,主频


400MHz


(最高可达


533MHz









SDRAM


内存




板载


64MB


SDRAM


(标准配置)


,


32bit


数据总线


SDRAM


时钟频率高



100MHz


( 支持运行


133MHz








Nand Flash


板载


64MB Nand Flash



256MB Nand Flash


(标准配置)







Nor Flash



板载


2MB Nor Flash


(最高可升级到


8MB


)< /p>







CorePower


< p>
专业


1.25V


核心电压供电






Power







核心板 采用


3.3V


供电








Powerled




核心板电源指示灯








核心板接口



接口型号为


DC-2.0


双列直插









SDRAM


:随机存储器,普遍使用的内存。用作主存。







NOR Flash




NAND Flash


是现在市场上两种主要的非易失闪存。













NOR


的 特点是芯片内执行,应用程序可以直接在


flash


闪存内运 行,不必再把


代码读到系统


RAM


中。













NAN D


结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的


速度也很快。








2.


主板








电源








并口线























复位



RTC


电源



RS232


电平转换


DB9


插座



音频


IIS,AC97







按键、


PS/2


IC


接口








数码管








触摸屏








以太网卡









USB HUB 1



4






3.


寄存器








见图:


ARM


模块和内核框图







寄存器是中央处理器内的组成部份。







寄存器是有限存贮容量的高速存贮部件,


用来暂存指令、

< p>
数据和位址。


在中央处理器的


控制部件中,包含的 寄存器有指令寄存器


(IR)


和程序计数器

(PC)


。在中央处理器的算术及逻


辑部件中,包含的寄存 器有累加器


(ACC)








IR


用于存储指令







PC


用于存储程序运行的地址(即当前指令在内存中的位置)








寄存器是由一个指令的输出或输入可以直接索引到的暂存器群 组。


所有的计算机指令都


是进入寄存器后被直接读取

< p>







ARM


的 汇编编程,本质上就是针对


CPU


寄存器的编程。












//*******


重点




需要背讼


************ *************************************






ARM


寄存器分为


2


类:普通寄存器和状态寄 存器













(1)


通用寄存器和计数器:共


32


个,


15


个通用寄存器












R0 -R7


未备份寄存器



















R0(a1)



R1(a1) R2(a3) R3(a4) R4(v1) R5(v2) R6(v3) R7(v4)












R8 -R12


备份寄存器



















R8(v5)



R9 (SB,v6) R10(SL,v7) R11(EP


,v8) R12(IP)





数据寄存器












R15(PC)





程序计数器



它的值是当前正在执行的指令在内存中的位置。























当指令执行结束后,


CPU


会自动将


PC


值加上一个单位,


PC

< br>值指向


下一条即将执行的指令的地址























如果通过汇编指令对


PC


寄存器赋值,就会 完成一次程序的跳转(如


从子函数跳转回主函数内)

































R14(LR)





链接寄存器



存放子程序的返回地址























例如: 在主函数内,如果调用子函数,程序会进入到子函数内执行。


当子函数执行完毕后,需要 回到



















主函数内,


所以,

< br>在子函数调用前需要将这个地址先保存起来,


否则无法


找 到这个地址。























LR


用于 保存这个地址,这个地址也称为子程序返回地址。当子函数


结束后,再将


LR


内的地址赋给


PC


即可。












































如果子程序再调用孙程序,


LR


如何保存地址呢?























先把当前


LR


内的值压入内存的栈区,然后


LR


再保存孙程序的返回


地址。当孙程 序执行完后通过


PC


跳转到



















子程序内,


此时将栈区内的子程序返回地址取出保存在


LR


内。


当子程序


执行完后 ,再通过


PC


跳转到主函数内。






















R13(SP)





栈指针寄存器



用于存放堆栈的栈顶地址。























SP< /p>


相当于指针变量,


保存的是栈顶的地址,


出栈时,



SP


指向的内


存中取出数据,入栈时将新的内存地址



















压入栈 顶,而


SP


相当于链表的头指针


(he ad)



















































原则上说


R0-R12


可以保存任何数据。


其中


R0-R7


用来临时存储数据,


R8-R12




统没有用来做任何特殊用途,常用于中断






















而在汇 编与


C


语言的交互中,定制了


A


TPCS


标准















寄存器 :


R4-R11


用来保存局部变量















参数:




参 数小于等于


4


,用


R0-R3


保存参数,参数多于


4


,剩余的传入堆栈















函数返回:结果为


32


位整数,通过


R0


返回

























结果为


6 4


位整数,通过


R0



R1


返回

























对于位数更多的结果,通过内存传递









(2)


状态寄存器


:











状态寄存器用于保存程序的当前状态






















CPSR




当前程序状态寄存器



















一个寄 存器为


32


位,


每一位数据代表不同的 状态。


分为三个部分


(


条件代


码标志位、控制位、保留区位


)









































31 32 29 28 .... 7 6 5 4



3



2



1



0
























N



Z



C



V








I F T M4 M3 M2 M1 M0















































其中


N Z C V


称为条件标志位< /p>


(即保存的是条件的运算结果,


真和


假)

























N=1


表示运算结果为负数


,N=0


表示运算结果为正数。








































Z=1


表示运算结果为


0

< p>



Z=0


表示运算结果为非零。

























C=1


表示运算结果产生了进位。

























V=1


运算结果的符号位发生了溢出。

















































4


个位的组合,代表了各种条件,如下:

























0000


EQ




Z


置位








相等


/


等于


0
























0001


NE




Z



0




































不等



进位


/


无符号


无进位


/


无符


负数



非负数



溢出



无溢出

























0010


CS/HS



高于或等于

























0011


CC/LO



号低于

























0100


MI

























0101


PL

























0110


VS

























0111


VC

























1000


HI

























1001


LS



























1010


GE



























1011


LT

























1100


GT

























1101


LE

























1110


AL

























1111


NV







































C


置位




C



0



N


置位




N



0



V


置位




V



0


< /p>


C


置位且


Z


清< /p>


0



C



0



Z


置位




N


等于


V





无符号高于



无符号低于


或等


有符号大于


或等


有符号 小于



有符号大于



N


不等于


V




Z



0



N


等于


V


Z


置位或


N


不等于


V


有符号小于或等于



任何状态






总是(


always





从不(


never

















































IFT


称为控制位

























I




I=1


禁用


IRO

< br>中断

























F




F=1


禁用


FIQ

< br>中断

























T




表示


CPU


当前的状态,


1


代表正在


Thumb


指令集状态,

< br>0



示正在


ARM


指令集状态。


























M0



M4


表示中断类型(控制位内的模式位)

























0b10000







User









用户中断

























0b10001







FIQ










快速中断

























0b10010







IRQ










声卡、


调制解调器等外部设备产生的


中断

























0b10011







Supervisor



管理程序或监控程序产生的中断

























0b10111







Abort








异常中断


























0b11011







Undefined




未定义中断

























0b11111







System







系统中断














SPSR




保存的程序状态寄存器,


结构与


CPSR


完全一样,


用来保存


CPSR


的值。


以便出现异常时恢复


CPSR


的值











(3)


流水线对


pc


值的影响























CPU


内部的组成部分:指令寄存器 ,指令译码器,指令执行单元(包括


ALU


< br>通用寄存器组)












CPU


执行指令的步骤:取指


->


译码


->


执行

















取指:将指令从内存或指令


cach e


中取入指令寄存器

















译码


:


指 令译码器对指令寄存器中的指令进行译码操作,


辨识


add



或是


sub


等操 作

















执行:指令执行单元根据译码的结果进行运算并保存结果












流水线操作:并发多条流水线(以


3


条为例)












1


取指






译码







执行












2










取指







译码






执行












3



















取指






译码






执行



















提高时间效率









(



)


、学习内容







1.


汇编


(


对裸板机的控制,以及驱动程序控制


)






2.


内核移植(


uboot

< p>
移植、内核编译、文件系统移植、应用程序移植)







3.


驱动程序编写



//^^^^^^^^^^^^^^^^^^^^^^^^^^


下午



^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^



(



)



ADS


的使用











ADS


是汇编或


C


语言编译调试工具











可生成的文件:


.axf


含调试信息 的可执行


ELF


文件

























.bin


可烧写的二进制映像文件





























.hex


可烧写的十六进制映像文件











ADS


配置











在磁盘中新建一个目录



D:arm


,用来存储所写的代码




















点击目录:


File->new,< /p>


创建一个可执行的


ARM


映象工程















ARM Executable Image


生成


ELF


格式映像(


bi n)














ARM Object Library


生成


armar


格式目标库文件















Empty Project


创建不包含任何库或源文件的工程















Makefile Importer Wizard


用于


Vc














Thumb


ARM


Interworking


Image


用于


ARM

< p>


thumb


指令混合代码生成的


ELF


映像















Thumb Executable image



thumb


指令生成


ELF

格式映像















Thumb Object Library


用于


Thumb


指令 的代码生成的


armar


格式文件


























ARM Executable Image


,工程文件名


2440ART













加源文件















project -> Add Files














新建















填加已有











生成目标的配置




















































内双击



TargetSettins:




post-linker


选择


ArM fromELF


Language Settins:Architecture or Processor


选择相应的编译器


ARM920T


Arm Linker:output



RO 0x30000000

























options



Image entry point


设为


0x30000000


























layout



Object 2440init.o Section Init




























Listings



Image map














Arm fromELF: output format




Plain binary



























output filename



***.bin























编译















make










调试




AXD


是调试器















设置,


debug ->


打开


AXD


调试界面,选择


option->con fig target


选项




















选ARMUL(模拟调试器)


,然后选择确定.进入调试界面.




















ARMUL


是虚拟调试环境(虚拟开发板)




















如果用 开发板真实环境调试,则需要使用


JTAG


连开发板后,在此处 选


H-JTAG















file-


项,加载刚才编译所的的




axf


调试文件.




















execute->run to cousor


项.使程序进入用户主程序

































可以用F8来一条一条执行语句,也可用F10,可以设置断 点.














(



).


汇编语言 基本结构









例:













AREA


Init,CODE,READONLY



< br>;AREA


定义代码段,段名


Init;


代码段,只读













ENTRY























;


伪操作,第一条指令的入口









Start


























;


标号,一段代码的开始,用于标记,无意义,必须


顶格













MOV



r0,#10
















;



10


存入


r0


寄存 器,整型常量前面用


#















MOV



r1,#3

















;



3


存入


r1


寄存器 ,


r0



r1


相当于两个变量,


只是名称固定,在寄存器的存储空间内













ADD



r0,r0,r1














;



r0


内数据与


r1


内数据相加,


相加后数据放在


r0


内< /p>









;Stop



























;


停止标号,下面的代码用于停止运行程序









;





MOV



r0,#0x18














;


软件异常中断响应









;





LDR



r1,=0x20026











;ADP


停止运行,应用退出









;





SWI



0x123456














;ARM


半主机软件中断









END











1).


基本概念










(2)


寄存器:如


< br>R0



R1


< br>










ARM


的汇编编程,本质上就是针对


CPU


寄存器的编程。






(3)


指令:即操作码,直接控制


CPU


,如


MOV








包括跳 转指令、数据处理指令、乘法指令、


PSR


访问指令、加载或存 储指令、数据交


换指令、移位指令等






(4)


伪 操作:作用于编译器


,


大多用于定义和控制。如


AREA








包括符号定义、数据定义、控制等






(5)


标 号:仅是一种标识。在跳转语句中,可以指向要跳转到的标识号位置
















ARM


汇编中,

< br>标号代表一个地址,


段内标号的地址在汇编时确定,


段外 标


号的地址值在连接时确定






(6)


符 号


:


即标号


(


代表地址


)


、变量名、数字常量名等。符号的命名规则如下:< /p>











a.


符号由大小写字母、数字以及下划线组成;











b.


除局部标号以数字开头外,其它的符号不能以数字开头;











c.


符号区分大小写,且所有字符都是有意义的;











d.


符号在其作用域范围你必须是唯一的;











e.


符号不能与系统内部或系统预定义的符号同名;











f.


符号不要与指令助记符、伪指令同名。





2).


段定义








在汇编语言中,以相对独立的指令或数据序列的程序段组成程 序代码








段的划分:数据段、代码段。一个汇编程序至少有一个代码段








(1)


代码段











上面的例子为代码段。











AREA




定义一个段,并说明所定义段的相关属性,


CODE


用以指明为代码段











ENTRY



标识程序的入口点。


END


为程序结束。








(2)


数据段











AREA





DA


TAAREA


< br>DA


TA,BIINIT,ALLGN=2










DISPBUF SPACE 200










RCVBUF



SPACE 200





















DA< /p>


TA


用以指明为数据段,











SPACE


分配


200

字节的存储单元并初始化为


0



















指令和伪操作在后面详细描述






3).


汇编语言结构









[


标号


] [


指令或伪操作


]













所有标号必须在一行的顶格书写,其后不加冒号









所有指令均不能顶格写









指令助记符大小写敏感,不能大小写混合,只能全部大写或全 部小写









;


为注释









@


代码行注释,同


;








#


整行注释或直接操作数前缀










为换行符










ENTRY



为程序的入口









END



为程序的结束





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


***************************************


二、


ARM


的寻址方式









最简单的汇编指令格式是操作码和操作数








:MOV



r0,#10






操作码:即


CPU


指令




MOV ADD






操作数 :即表示数据是在寄存器中还是在内存中,是绝对地址还是相对地址















操作数部分要解决的问题是,


到哪里去获取操作数,


获取操作数的方式就是寻


址方式。








ARM


每一条指令都是


32


位机器码,对应


CPU


的位数







ARM


指令格式:




























32


位中分为


7


个位域,每个位域分别存储不同意义的编码(二进制数)



















31 ~ 28 27~25




24 ~ 21



20




19~16





15~12





11 ~ 0










--- -------------------------------------------------- ------









| Cond | 001



| Opcode



| S |




Rn




|




Rd




|



Operand2 |










--------------- --------------------------------------------









对应输入的一条指令为:










{}{s} ,,

















Opcode:


指令操作码







4


个位存储,如


MOV

,ADD



每一个操作码和操作数最终

< br>都是以二进制形式存在










Cond



:


指令的条件码





4


个位来储,可省略

















如:


ADD




r0,r0,#1




;


计算


r0



1


后的值,再写入到


r0






















ADDEQ r0,r0,#1




;


只有在


C PSR


寄存器条件标志位满足指定条件时,


才计算


r0



1


后的值,再写入到


r0





































其中条件助记符如下:




















EQ






相等




















NE






不相等




















MI






负数




















VS






溢出




















PL






正数或零




















HI






无符号大于




















LS






无符号小于或等于




















CS






无符号大于或等于




















CC






无符号小于




















GT






有符号大于



arm



























GE






有符号大于或等于




















LE






有符号小于或等于




















LT






有符号小于




















AL






无条件执行












S






:


决定指令的操作是否影响


CPSR


的值


,


用一个 位存储,


省略则表示为


0


值,



则为


1


< p>

















SUBS



R0,R0,#1




;R0



1


,结果放入


R0


,同时响影


CPSR

< br>的值



















SUB




R0,R0,#1




;R0



1


,结果放入


R0


,不影响


CPSR


的值










Rd





:


目标寄存器编码






4


位存储













Rn





:



1


个操作数的寄存器编码




4


位存储










Operand2:



2


个操作数






12


位存储














寻址方 式:是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式


,



8



寻址方式:

< p>











寄存器寻址、立即寻址、寄存器间 接寻址、基址寻址、多寄存器寻址、堆栈寻址、


相对寻址、寄存器移位寻址


















//*******



< br>方














***************************************** ********







1.


立即寻址







操作数是常量,用


#


表示常量。例







MOV



R0,#0xFF000




;


指令省略了第


1


个 操作数寄存器。


将立即数


0xFF000(


2


操作



)


装入


R0


寄存器

< br>








SUB



R0,R0,#64






;R0



64


,结果放入

R0







#


表示立即数





0x


或< /p>


&


表示


16


进制 数




否则表示十进制数








立即数寻址指令中的地址码就是操作数本身,可以立即使用的操作数。







其中,


#0xFF000


< p>
#64


都是立即数。该立即数位于


32

< p>
位机器码中,占低位的


12


位。

< br>也就是说在


ARM


指令中以


12


位存储一个数据



< br>那么,


32


位的数据(


long



float


)如何存储?

< p>






32


位的数据以一种特殊的方式来处理







其中:高


4


位表示的无符号整数

< p>













8


位补


0


扩展为< /p>


32


位,然后循环右移


x


位来代表一个数。


x=



4< /p>


位整数


*2












所以,不是每一个


32


位数都是合法的立即 数,只有能通过上述构造得到的才是


合法的立好数。如:













合法立即数:


0xff,0x104,0xff0












不合法立即数:

< br>ox101



0x102,0xff1



2.


寄存器寻址







操作数的值在寄存器中,指令执行时直接取出寄存器值来操作









例:


MOV R1,R2










;



R2


的值存入


R 1






在第


1


个操作数寄存器的位置存



R2


编码













SUB R0,R1,R2







;



R1< /p>


的值减去


R2


的值,

结果保存到


R0



< p>
在第


2


操作数


位置,存放 的是寄存器


R2


的编码


















寄存器寻址是根据寄存器编码获取寄存器内存储的操作数








3.


寄存器间接寻址







操作数从寄存器所指向的内存中取出,寄存地存储的是内存地址









例:


LDR


R1,[R2]











;



R2< /p>


指向的存储单元的数据读出,保存在


R1




R2


相当于指针变量













STR R1,[R2]











;



R1< /p>


的值写入到


R2


所指向的内存

< p>












SWP R1,R1,[R2]








;


将寄存器


R1


的值和


R2


指定的存储单元的内容交换










[R2]


表示寄存器所指向的内存,相当于



*p








LDR


指令用于读取内存数据









STR


指令用于写入内存数据









//------------------------- ----------------------------


4.


寄存器基址寻址







操作数从内存址偏移后读取数据。常用于查表、数组操作、功能部件寄存器访问等。







基址:相当于首地址,地址偏移后取值作为操作数







基址寄存器:用来存放基址的寄存器











变址寻址:基址寻址也称为变址寻址












1)


前索引寻址









例:


LDR R2,[R3,#4]






;


读取


R3+4


地址上的存储单元的内容,放 入


R2












LDR


R2,[R3,#4]!





;


读取


R3 +4


地址上的存储单元的内容,放入


R2


,然后


R3


内的地址变为


R3+4,



R3=R3+4















[R3,#4]


表示地址偏移后取值,相当于


*(p+4)




p[4]



R3


内保存的地址不变









[R3,#4]!


表示地址偏移后取值,相当于


*(p+4)





p[4 ],!


表示回写,即


R3=R3-4


,R3


的值发生了改变














2)


后索引寻址










例:


LDR


R2,[R3],#4






;


先读取


R3


地址 上的存储单元的内容,放入


R2


,然后


R3


内的地址变为


R3+4,



R3=R3+4

















[R3],#4






类似于



*p++


只不过自加的不是


1


,而是指定的


4









[R3,#4]!





类似于



*++p

< br>只不过自加的不是


1


,而是指定的


4









































3)


寄存器的值作索引









例:


LDR R2,[R3,R0]






;R0


内存储索引值,


R3


内存地址,


读取


R3+R0


地址上的存

< br>储单元的内容,放入


R2















[R3,R0]


表示地址偏移后取值,相当于


*(p+i)




p[i]
















5.


多寄存器寻址







一次可传送多个寄存器的值,也称为块拷贝寻址
















例:


LDMIA


R1!,{R2-R7,R12}



R1

< br>指向的存储单元中的数据读写到


R2


< br>R7



R12


中,


然后


R1


自加


1










STMIA



R1!,{R2-R7,R12}


将寄存器


R2



R7



R12


的值保存到


R1


指向的 存储单元


中,然后


R1


自加

< p>
1



















其中


< /p>


R1


是基址寄存器,


用来存基址,


R2-R7



R12


用来存数据



赋值编号小的寄存


器与低 地址相对应,与寄存器列表顺序无关
















!


为可选后缀,


表示改变

< p>
R1


的值,


则当数据传送完毕之后,


将最后的地址写


入基址寄存器
















基址寄存器不允许为


R15


,寄存器列表可以为


R0


R15


的任意组合。
















这里


R1


没有写成


[R1]!


,是因为这个位不是操作数位,而是寄存器位
















LDMIA





STMIA




是块拷贝指令


,


< br>LDMIA


是从


R1


所指向的内 存中读数


据,


STMIA


是向


R1


所指向的内存写入数据






























R1


指向的是连续地址空间




6.


寄存器堆栈寻址







是按特定顺序存取存储区,按后进先出原则,使用专门的寄存器


SP


(堆栈指针


)


指向一

< br>块存储区







例:


LDMIA


SP!,{R2-R7,R12}


将栈内的数据,读写到


R 2



R7



R 12


中,然后下一个地


址成为栈顶











STMIA


SP!,{R2-R7,R12}

< p>
将寄存器


R2



R7



R12


的值保存到


SP


指向的栈中




















SP


指向的是栈顶




7.


相对寻址







即读取指令本身在内存中的地址。是相对于


PC

内指令地址偏移后的地址。












由程序 计数器


PC


提供基准地址,指令中的地址码字段作为偏移量,两 者相加后得到的


地址即为操作数的有效地址。







例:









B LOOP





;B


指令用于跳转到标号

< p>
LOOP


指令处执行代码









...






LOOP








MOV R6 #1















其中< /p>


LOOP


仅仅是标号,而不是地址,不是


CPU


指令,所以在指令的机器码中没有


标号的机器码,而是< /p>





计算出了 从


B


指令到


MOV

指令之间内存地址的差值,这个差值相当于


PC


的偏移量, 即


相当于:


add pc,pc,#


偏移量









B


指令引起了

PC


寄存器值的变化,


PC


内永远 保存将要运行指令在内存中的地址。










8.


寄存器移位寻址









操作数在被使用前进行移位运算









例:


MOV R0,R2,LSL #3






;R2


的值左移


3

位,


结果放入


R0










;


即是


R0=R2


×


8

















LSL


是移位指令,用于将前面寄存器的数据



左移




//^^^^^^^^^^^^^^^^^^^^^^^^^^


下午



^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^





ARM


汇编语言语句由



指令、伪指令、伪操作、宏指令组成





.ARM


指令集






共包括


6


种类型


:


数据处理指令、跳转指令、程序状态指令、加载存取储指令、协处理


指令、软中断指令




(


一)


、数据处理指令








数据处理指令,只能对寄存器内容进行操作,而不能对内存进 行操作,所有数据处理


指令均可使用


S


后缀,并影响状态标志




包括:数据 传送指令、算述指令、乘法指令、逻辑运算指令、比较指令、移位指令




1.


数据传输指令





1) MOV


数据传送指令









格式:


MOV Rd,







功能:


Rd


=操作数


,


操作数可以是寄存器、被移位的寄存器或立即数。








例:









MOV



R0,#0xFF000



;


立即寻址,将立即数


0xFF000(



2


操作数


)


装入< /p>


R0


寄存器











MOV R1,R2










;


寄存器寻址,将

< br>R2


的值存入


R1









MOV R0,R2,LSL #3



;


移位寻址,


R2


的值左移


3


位,结果放入


R0




2) MVN


数据取反传送指令








格式:


MVN ,;








功能: 将操作数传送到目的寄存器


Rd


中,但该值在传送前被按位取反 ,即


Rd=!op1









例:










MVN R0,



0 R0=-1















mvn


意为“取反传输”


,它把源寄 存器的每一位取反,将得到的结果写入结果寄存器。








movs



mvns


指令对


pc


寄存器赋值时有特殊含义,表示要求在赋值的同时 从


spsr



恢复

cpsr









mov



mvn


指 令,编译器会进行智能的转化。比如指令“


mov


r1, < /p>


0xffffff00


”中的立


即数是非 法的。





在编译时,


编译器将其转化为



mvn r1, 0xff




这样就不违背立 即数的要求。


所以对于


mov



mvn


指令,





可以认为:合法的立即数反码也是合法的立即数。










2.


算术指令





1) ADD


加法指令









格式:


ADD{}{S} ,,;








功能:


Rd



Rn +op2







例:











ADD R0,R1,



5








;R0=R1+5










ADD R0,R1,R2









;R0=R1+R2










ADD R0,R1,R2,LSL



5 R0=R1+R2


左移


5







2) ADC


带进位加法指令









格式:


ADC{}{S} ,,;








功能:


Rd



Rn +op2+carry ,carry


为进位标志值。


该指令用 于实现超过


32


位的数的加法。









例如:













第一个


6 4


位操作数存放在寄存器


R2



R3


中;













第二个


64


位操作数存放在寄存器


R4



R5


中;













64


位结果存放在


R0


R1


中。






















ADDS R0,R2,R4



3 2


位相加,


S


表示结果影响条件标志位 的值













ADC R1,R3,R5



32


位相加< /p>







3) SUB


减法指令








格式:


SUB{}{S} ,,;








功能:


Rd



Rn -op2








例:











SUB R0,R1,



5 R0=R1-5










SUB R0,R1,R2 R0=R1-R2










SUB R0,R1,R2,LSL



5 R0=R1-R2


左移


5







4) SBC


带借位减法指令









格式:


SBC{}{S} ,,;








功能:


Rd



Rn -op2-!carry








SUB



SBC


生成进位标志的方式不同于常 规,如果需要借位则清除进位标志,所以


指令要对进位标志进行一个非操作。

< p>








例:












第一个


64


位操作数存放在寄存器


R2



R3


中;












第二个


64


位操作数存放在寄存器


R4



R5


中;












64< /p>


位结果存放在


R0


R1


中。













SUBS R0,R2,R4;



32


位相减,


S


表示结果影响条件标志位的值












SBC R1,R3,R5;



32


位相减








5)


其它减法指令









RSB


反向减法指令


,



SUB


指令,但倒换了 两操作数的前后位置,即


Rd



op2 -Rn










RSC


带借位的反向减法指令


,



SBC


指令,但倒换了两操作数的前后位 置,即


Rd



op2-Rn-!car ry












rsb


r0, r1, r2



/* r0 = r2



r1 */








rsc


r0, r1, r2



/* r0 = r2



r1 + carry



1 */














add s



adcs


在进位时将


cpsr



C


标志置


1


;否则置


0










sub s



sbcs


在产生借位时将


cpsr



C


标志置< /p>


0


;否则置


1






3.


乘法指令







1) MUL 32


位乘法指令










格式:


MUL{}{S} ,,;









功能:


Rd



Rn


×


op2









该指令 根据


S


标志,决定操作是否影响


CPS R


的值;其中


op2


必须为寄存器。< /p>


Rn



op2


的 值为


32


位的有符号数或无符号数。











例:













MULS R0,R1,R2 R0



R1


×


R2


,结果影响寄存器


CPSR


的值







2) MLA


32


位乘加指令










格式:


MLA{}{S} ,,,;









功能:


Rd



Rn


×


op2+op3



op2



o p3


必须为寄存器。


Rn


< p>
op2



op3


的值为< /p>


32



的有符号数或无符号数。










例:













MLA


R0,R1,R2,R3 R0


R1


×


R2+R3






3) SMULL 64


位有符号数乘法指令










格式:


SMULL{}{S} ,,,;









功能:


Rdh Rdl



Rn


×


op2




Rdh



Rdl



op2


均为寄存器。


Rn



op2


的值为


32


位的


有符号 数。










例:













SMULL R0,R1,R2,R3 R0



R2


×


R3


的低

< p>
32




R1

< p>


R2


×


R3

< p>
的高


32








4) SMLAL 64


位有符号数乘加指令










格式:


SMLAL{}{S} ,,,;









功能:


Rdh Rdl



Rn


×


op2+Rdh Rdl



;Rdh



Rdl



op2


均为寄存器。


Rn



op2


的值为


32


位的有符号数,


Rdh R dl


的值为


64


位的加数。

< p>









例:













SMLAL R0,R1,R2,R3




;R0



R 2


×


R3


的低


32



+R0 R1



R2


×


R3


的高


32



+R1






5) UMULL 64


位无符号数乘法指令










格式:


UMULL{}{S} ,,,;









功能:同


SMULL


指令,但指令中


Rn



op2


的值为


32


位的无符号数。

< p>









例:













UMULL


R0,R1,R2,R3




;R0



R2


×


R3


的 低


32




R 1



R2


×


R 3


的高


32




其中


R2



R 3


的值为无符号数







6) UMLAL 64


位无符号数乘加指令










格式:


UMLAL {}{S} ,,,;









功能:同


SMLAL


指令,但指令中


Rn



op2


的值为


32


位的无符号数,

< p>
Rdh


Rdl


的值


为< /p>


64


位无符号数。










例:













UMLAL R0,R1,R2,R3


;R0



R2


×

< br>R3


的低


32



+R0 R1



R2


×


R3


的高


32



+R1
































;


其中


R2



R3< /p>


的值为


32


位无符号数

< br>


R1



R0

< br>的值为


64



无符号数




4.


逻辑指令:


and



orr



eor



bic





1) AND


逻辑与指令










格式:


AND{}{S} ,,;









功能:


Rd



Rn AND op2



一般用于 清除


Rn


的特定几位。









例:













AND R0,R0,



5



;


保持


R0


的第


0


位和第


2


位,其余位清< /p>


0






2) ORR


逻辑或指令










格式:


ORR{}{S} ,,;









功能:


Rd



Rn OR op2


一般用于设置


Rn


的特定几位。









例:












ORR R0,R0,



5



;R0


的第


0


位和第


2


位设置为

< br>1


,其余位不变







3) EOR


逻辑异或指令










格式:


EOR{}{S} ,,;








功能:


Rd



Rn EOR op2



一般用于将


Rn< /p>


的特定几位取反。










例:












EOR R0,R0,



5



;R0


的第


0


位和第


2


位取反,其余位不变







4) BIC


位清除指令










格式:


BIC{}{S} ,,;









功能:


Rd



Rn AND (!op2)


用于清除寄存器


Rn


中的某些位,并把结果存放到目的寄


存器


Rd










例:












BIC R0,R0,



5 R0< /p>


中第


0


位和第


2


位清


0


,其余位不变

< br>



5.


比较指令






1) CMP


比较指令









格式:


CMP{} ,;









功能:


Rn-op1


,根据结果更新< /p>


CPSR


中条件标志位的值。









例:












CMP R0,



5









;


计算< /p>


R0-5


,根据结果设置条件标志位













ADDGT


R0,R0,



5




;ADD


为加法指令,


GT


为判断条件标志位是



否大于


5,




R0>5


,则执行


ADD


指令






2) CMN


反值比较指令










格式:


CMN{} ,;









功能: 同


CMP


指令,但寄存器


Rn


的值是和


op1


取负的值进行比较。

< p>








例:













CMN R0,



5



R0



-5


进行比较







3) TST


位测试指令









格式:


TST{} ,;









功能:



Rn AND op1


按位与后,


更新


CPSR

< br>中条件标志位,


用于检查寄存器


Rn

是否


设置了


op1


中相应的位。< /p>









例:













TST R0


,#


5


测试


R0


中第


0

< p>
位和第


2


位是否为


1






4) TEQ


相等测试指令










格式:


TEQ{} ,;









功能:


Rn EOR op1



按位异或后,更新


CPSR


中条件标志位, 用于检查寄存器


Rn



值是否和


op1


所表示的值相等。









例:













TEQ R0,



5


判断

< br>R0


的值是否和


5


相等





6.

< p>
移位指令


(


位运算指令


)





1) LSL(



ASL)


左移









格式:寄存器


,LSL(



ASL )


操作数









功能:将寄存器内的数据左移,操作数是移位的位数在


0-31


之间










:










MOV R0, R1, LSL#2


;将



R1


中的内容左移两位后传送到



R0


中。






2) LSR


操作



右移









格式


:


寄存器



LSR


操作数









功能


:


将寄存嚣内的数据右移









例:











MOV R0, R1, LSR#2





R1


中的内容右移两位后传送到



R0


中,


左端用零来填充。






3)


其它移位









ASR



右移,左端用第


31


位值来填充









ROR



右移,循环右移,左端用右端移出的位来填充









RRX



右移,循环右移,左端用进位标志位


C


来填充











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


***************************************


(



)


、跳转 指令






1) B


跳转指令










格式:


B{} ;









功能: 跳转到


addr


地址。









例:












B exit;


程序跳转到标号< /p>


exit








2) BL


带返回的跳转指令










格式:


BL{} ;









功能: 同


B


指令,但


BL

指令执行跳转操作的同时,还将


PC


(寄存器


R15


)的值保


存到


LR< /p>


寄存器(寄存器


R14


)中。

< p>














该指令用于实现子程序调用,程序的返回可通过把

< p>
LR


寄存器的值复制到


PC


寄存器中来实现。










例:










BL func;


调用子程序


func



arm
























func

















MOV R15,R14;


子程序返回














3)


其它跳转指令









BLX


带返回和状态切换的跳转指 令,用于子程序调用和程序


Thumb


状态的切换。

< p>









BX


带状态切换的跳转指令,处理器跳转到目标地址处,目标 地址处的指令可以是


ARM


指令,也可以是

Thumb


指令。









跳转指令用于实现程序的跳转和程序状态的切换。







ARM


程序设计中,实现程序跳转有两种方式:跳转指令、直接向程 序寄存器


PC


中写入


目标地址值。



//--------------------------- -------------------------------------------------- -----------


(三)


、程序状态指令









用于状态寄存器和通用寄存器间传 送数据。总共有两条指令:


MRS



M SR


。两者结


合可用来修改程序状态寄存器的值。






1) MRS


程序状态寄存器到通用寄存器的数据传送指令









格式:


MRS{} ,CPSR/SPSR;









功能:用于将程序状态寄存器的内容传送到目标寄存器


Rd


中。









例:














MRS R0,CPSR



;


状态寄存器


CPSR


的值存入寄存器


R0








2) MSR


通用寄存器到程序状态寄存器的数据传送指令










格式:


MSR{} CPSR/SPSR_,;









功能:用于将寄存器


Rd

< p>
的值传送到程序状态寄存器中。












:用来设置状态寄存器中需要操作的位。



















32


位的状态寄存器可以分为


4

< p>
个域:




















[31



24]


为条件标志位域,用


f


表示。




















[23



16]


为 状态位域,用


s


表示。




















[15



8]< /p>


为扩展位域,用


x


表示。




















[7


:< /p>


0]


为控制位域,用


c

< br>表示。










例:













MSR CPSR_f,R0



R0


的值修改


CPSR


的条件标志域














MSR CPSR_fsxc,#5; CPSR


的值修改为


5





(四)


、加载存储指令







该集合的指令使用频繁,当数据存放在内存中时,必须先把数据从内存装载到寄存器,


执行完后再把寄存器



中的数据存储到内存中




1.


单数据访存指令





1


)单数据加载指令










格式:


LDR(



LDRB

< br>、


LDRBT



LDRH



LDRSB



LD RSH



LDRT


< br>STR



STRB


< p>
STRBT



STRH



STRT) ,;









功能:内存地址中的数据装载到目 标寄存器


Rd


中,同时还可以把合成的有效地址写


回到基址寄存器。










寻址方式:


Rn

:基址寄存器。


Rm


:变址寄存器。


Index


:偏移量,


12


位的无符 号数。















LDR Rd,[Rn]














;


把内存中地址为


Rn


的字数据装入寄存器< /p>


Rd

















LDR Rd,[Rn,Rm]











;


将内存中地址为


Rn+Rm


的字数据装入寄 存器


Rd

















LDR Rd,[Rn,



index]






;


将内存中地址为


Rn+index


的字数据 装入


Rd

















LDR Rd,[Rn,Rm,LSL



5]




;


将内存中地址为

< br>Rn+Rm


×


32


的字数据装入


Rd















LDR


Rd,[Rn,Rm]!










;


将内存 中地址为


Rn+Rm


的字数据装入


Rd


,并将


新地址


Rn+Rm


写入


Rn















LDR Rd,[Rn,



index]!





;


将内存 中地址为


Rn+index


的字数据装入


Rd


,并将


新地址


Rn+index


写入


Rn















LDR Rd,[Rn,Rm



LSL



5]!


将内存中地址为


Rn+Rm


×


32


的字数据装入


Rd



并将新地址


Rn+Rm


×


32


写入


Rn















LDR Rd,[Rn],Rm











;


将内存中地址为


Rn

的字数据装入寄存器


Rd


,并


将新 地址


Rn+Rm


写入


Rn















LDR Rd,[Rn],



index






;


将内存中地址为


Rn


的字数据装入寄存器< /p>


Rd



并将


新地 址


Rn+index


写入


Rn















LDR Rd,[Rn],Rm,LSL



5




;


将内存中地址为

< br>Rn


的字数据装入寄存器


Rd


, 并


将新地址


Rn+Rm


×


32


写入


Rn









各指令的区别:









(1) LDR



字数据加载指令















将内存 地址中的字数据装载到目标寄存器


Rd














例:



LDR


R0,[R1,R2,LSL



5]!


;


将内存中地址为


R1+R2


×


32


的字数据装入寄存



R0


,并将新地址


R1+R2


×


32


写入


R1




















(2) LDRB


字节数据加载指令














LDR,


只是从内存读取一个


8


位的字节数据而不是一个


32


位的字数据,并将


Rd


的 高


24


位清


0






















例:



LDRB


R0,[R1]












;


将内存中起始地址为


R1


的一个字节数据装入


R0


















(3) LDRBT


用户模式的字节数据加载指令














LDRB


指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下


的内存操作。










(4) LDRH


半字数据加载指令














LDR


指令,但该指令只是从内存读取一个


16


位的半字数据而不是一个


32



的字 数据,并将


Rd


的高


16


位清


0














例:


LDRH


R0,[R1]













;


将内存中起始地址为


R1


的一个半字数据装 入


R0











(5) LDRSB


有符号的字节数据加载指令














LDRB


指令,但该指令将寄存器


Rd


的高


24


位设置成所装载的字节数据符号


位的值。














例:


LDRSB


R0,[R1] < /p>


;


将内存中起始地址为


R1


的一个字节数据装入


R0


中,


R0


的高


24


位设置成该字节数据的 符号位










(6) LDRSH


有符号的半字数据加载指令














LDRH


指令,但该指令将寄存器


Rd


的高


16


位设置成所装载的半字数据符号


位的值。













例:


LDRSH R0,[R1]


将内存中起始地址为


R1


的一个


16< /p>


位半字数据装入


R0


中,


R0


的高


16


位设置成该半字 数据的符号位










(7) LDRT


用户模式的字数据加载指令














LDR


指 令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的


内存操作。有效地址 必须是字对齐的






2


)单数据存储指令









格式:


S TR(



STR


STRB



STRBT



STRH



STRT) ,;









功能:将寄存器数据写入到内存中









寻址方式:


Rn

:基址寄存器。


Rm


:变址寄存器。


Index


:偏移量,


12


位的无符 号数。















STR


Rd,[Rn]














;


将寄存器


Rd


中 的字数据写入到内存中地址为


Rn


内存中















STR


Rd,[Rn,Rm]











;


将寄存器


Rd


中 的字数据写入到内存中地址为


Rn+Rm


的内存中















STR


Rd,[Rn,



index]






;


将寄存器


Rd


中 的字数据写入到内存中地址为


Rn+index


内存中















STR


Rd,[Rn,Rm,LSL



5]




;


将寄存 器


Rd


中的字数据写入到内存中地址为


Rn+Rm


×


32


内存中















STR


Rd,[Rn,Rm]!










;


将寄存器


Rd


中 的字数据写入到内存中地址为


Rn+Rm


的内存中















STR


Rd,[Rn,



index]!





;


将寄存器


Rd


中的字数据写入到内存中地址 为


Rn+index


的内存中,并将新地址

Rn+index


写入


Rn















STR


Rd,[Rn,Rm



LSL



5]!


;


将寄存器


Rd


中的字数据写入到内存中 地址为


Rn+Rm


×


32


的内存中,并将新地址


Rn+Rm


×


32


写入


Rn















STR


Rd,[Rn],Rm











;


将寄存器


Rd


中 的字数据写入到内存中地址为


Rn


的内存中,并将新地址


Rn+Rm


写入


Rn















STR Rd,[Rn],



index






;


将寄存器


Rd


中的字数据写入到内存中地址 为


Rn



内存中,并将新地址


Rn+index


写入


Rn















STR


Rd,[Rn],Rm,LSL



5




;


将寄存 器


Rd


中的字数据写入到内存中地址为


Rn


的内存中,并将新地址


Rn+Rm


×


32


写入


Rn













(1) STR


字数据存储指令













把寄存器


Rd


中的字数据(


32


位)保存到


add r


所表示的内存地址中,同时还可


以把合成的有效地址写回到基 址寄存器。













例:



STR R0,[R1,



5]!



;



R0


中的字数据保 存到以


R1+5


为地址的内存中,然



R1



R1+5









(2) STRB


字节数据存储指令













把寄存器


Rd


中的低


8


位字节数据保存到


addr


所表示的内存地址中。













例:



STRB R0,[R1]



;


将寄存器


R0


中的低


8


位数据存入


R1


表示的内存地址中










(3) STRBT


用户模式的字节数据存储指令















STR B


指令,


但无论处理器处于何种模式,


该指令都将被当作一般用户模式下


的内存操作。









(4) STRH


半字数据存储指令













把寄存器


Rd


中的低


16


位半字数据保存到


add r


所表示的内存地址中,而且


addr


所表示的地址必须是半字对齐的。














例:


STRH R0,[R1]



;


将寄存器


R0


中的低


16


位数据存入

< p>
R1


表示的内存地址中










(5) STRT


用户模式的字数据存储指令














STR


指 令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下


的内存操作。





2.


多数据访存指令






1)


批量数据加载指令










格式:


LDM{}{} {!},{^};









功能:


从一片连续的内存单元读取数 据到各个寄存器中,


内存单元的起始地址为基址


寄存器


Rn


的值,各个寄存器由寄存















器列表


regs


表示。









该指令一般用于多个寄存器数据的出栈。










type


字段种类:














IA< /p>


:每次传送后地址加


1













































IB


:每 次传送前地址加


1





DA


:每次传送后地址减

< p>
1





DB


:每次传送前地址减


1





FD


:满递减堆栈。














ED


:空递减堆栈。














FA


:满递增堆栈。














EA


:空递增堆栈。



















LDMFA/STMFA



LDMEA/STM EA



LDMFD/STMFD



LDMED/STMED










LDM



STM


表示多寄存器寻址,即一次可以传送多个寄存器值。









LDM


:一次装载多个,这里用来出栈。









STM


:一次存储多个,这里用来入 栈。









F/E


表示指针指向的位置









F



full


满堆栈,表示堆栈指针指向最后一个入栈的有效数据项。< /p>









E



empty


空堆栈,表示堆栈指针指向下 一个要放入的空地址。









A/D


表示堆栈的生长方式









A


:堆栈向高地址生长,即递增堆栈。









D


:堆栈向低地址生长,即递减堆栈。










注意:


有一个约定,


编号低的寄存器在存储数据或者加载数据时对应于 存储器的低地


址。















FD< /p>



ED



FA< /p>



EA


指定是满栈还是空栈,是升序栈还 是降序栈,用于堆栈寻


址。



















一个满栈的栈指针指向上次写的最后一个数据单元


.



















空栈的栈指针指向第一个空闲单元。



















一个降序栈是在内存中反向增长而升序栈在内存中正向增长。















{!}


:若选用了此后缀,则当指令执行完毕后,将最后的地址写入 基址寄存器。
















{^}


:当


regs


中不包含


PC


时,该后缀用于指示指令所用的寄存器为用户模式


下的寄存器,




















否则指 示指令执行时,将寄存器


SPSR


的值复制到

< br>CPSR


中。
























2)


批量数据存储指令










格式:


STM{}{} {!},{^};









功能:


将各个寄存器的值存入一片连 续的内存单元中,


内存单元的起始地址为基址寄


存器

< p>
Rn


的值















各个寄 存器由寄存器列表


regs


表示。



该指令一般用于多个寄存器数据的入栈。










{^}


:指示指令所用的寄存器为用户模式下的寄存器。其他参数用法同


LDM


指令。
















例:


STMEA



R13!,{R0-R12,PC}



;


将寄存器


R0~R12


以及程序计 数器


PC


的值保存到


R13

< p>
指示的堆栈中





3.


数据交换指令






1)


字数据交换指令









格式:


SWP ,,[];









功能:


Rd



[op2]



[op2]

< p>


op1
















op2


所表示的内存装载一个字并把这个字放置到目的寄存器


Rd


中,


然后把


寄存 器


op1


的内容存储到同一内存地址中。

















例:


SWP


R0,R1,[R2]


;



R2


所表 示的内存单元中的字数据装载到


R0


,然后将

< br>R1



的字数据保存到


R2


所表示的内存单元中








2)


字节数据交换指令









格式:


SWPB ,,[];









功能: 从


op2


所表示的内存装载一个字节并把这个字节放置到目的寄 存器


Rd


的低


8


位中,


Rd


的高


24


位设置为


0
















然后将寄存器


op1


的低

< br>8


位数据存储到同一内存地址中。










例:




SWPB R0,R1,[R2]



R2


所表示的内存单元中的一个字节数据装载到


R0


的低


8


位,然后将


R1


中的低


8


位字节












数据保存到


R2

所表示的内存单元中





//^^^^^^^^^^^^^^^^^^^^^^^^^^


下午



^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

< br>(



)


、协处理指令

< p>





1) CDP


协处理器操作指令










格式:


CDP{}

,,,,,;









功能:用于传递指令给协处理器


p


,要求其 在寄存器


CRn



CRm


上,进行操作


opcode1


,并把结果存放到


CRd


中,















可以使 用


opcode2


提供与操作有关的补充信息。


指令中的所有寄存器均为协处


理器的寄存器,操作由协处理器完成。

< p>









指令中


:















P


为协处理器编号;
















CRd


为目的寄存器的协处理器寄存 器;
















CRm



CRn


为存放操作数的协处理器寄存器;
















Opcode1


< br>opcode2


为协处理器即将执行的操作。























例:


CDP


p5


5



c0



c1



c2



9


;该指令用于通知协处理器


p5


,在


c1



c 2


上执行


操作


5



9


,并将结果存放到


c0


中。








2) LDC


协处理器数据读取指令










格式:


LDC {}{L}

,,;









功能:将


addr


表示的内存地址中的连续数据传送到目的寄存器


CRd


中。
















L


表示指令为长读取操作,比如用于双精度数据的传输;
















目的寄存器


CRd

< br>为协处理器的寄存器;
















add r


的寻址方式同


LDR


指令,其寄存器 为


ARM


处理器的寄存器。
















例:


LDC p5

< br>,


c1



[R1+5]:


该指令用于将


R1



5


所对应的存储单元中的数据,传送到


协处理器


p5


的寄存器


c1


中。











3) STC


协处理器数据存储指令










格式:


S TC{}{L}

,,;









功能:


将 寄存器


CRd


的值传送到


addr


表示的内存地址中。


指令中各参数用法同


L DC











例如:


STC

p5



c1


[R1+5]



;


该指令用于将 协处理器


p5


中寄存器


c1

< p>
的数据传送到


R1



5< /p>


所对应的存储单元中。








4) MCR ARM


寄存器到协处理器寄存器的数据传送指令










格式:


MCR{}

,,,,{, op2};









功能:将


ARM


处理器的寄存器

< p>
Rd


中的数据传送到协处理器


p

< br>的寄存器


CRn



CRm


中;


op1



op2


为协处理器将要执行的操作。










例:


MCR p5,5,R1,C1,C2,9


;该指令将


R1


中的数据传送到协处理器


p5


的寄存器


C1



C2


中,协处理器执行操作


5



9












MRC


协处理器寄存器到


ARM


寄存器的数据传送指令










格式:


MRC {}

,,,,{,op2};









功能:


将协处理器


p


的寄存器


CRn



CRm


的数据传送到


ARM


处理器的寄存器


Rd

< p>
中;


op1



op2


为协处理器将要执行的操作。










例:


MRC p5,5,R1,C1,C2,9


;该指令将寄存器


C1



C2


中的数据传送到


R1


中,协处理



p5


协处理器执行操作

5



9







(



)


、异常中断指令


-


-


-


-


-


-


-


-



本文更新与2021-02-16 20:44,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/659905.html

arm汇编编程(示例)的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文