arm的汇编指令精选合辑
ARM的复合寻址方式有5种。
1 第2操作数的寻址方式
ARM运算指令和某些数据传送指令除了目的操作数和第1个操作数(它们为寄存器寻址)外,还具有第2操作数。该第2操作数具有以下寻址方式:
(1)立即寻址(#immediate_8*r*2)
由8位立即数和4位移位位r决定。R指定左移rⅹ2位,r=0~15,实际上可移位0,2,4,6,···,28,30。例如:实际的立即数可以为0xFF(r=0),0xFF0(r=2),0xFF000000(r=12), 0xFF000000F(r=14)等。
例:
MOV R0,#20
(2)寄存器直接(Rm)
例:
MOV R0,R1
(3)寄存器移位(Rm,移位码#immed_5)
移位码包括:LSL、LSR、ASR、ROR、RPX的任何一种,移位位数由#immed_5决定。详细请见ARM数据处理类指令的第2操作数。
例:
MOV R0,R1,LSL #1 ;(R1)*2→R0
(4)寄存器间接移位(Rm,移位码Rs)
移位码包括:LSL、LSR、ASR、ROR,移位位数由Rs的内容决定。
例:
MOV R0,R1,R2,LSL,R2 ;(R1)*(R2)→R0
2 字和无符号字节寻址方式
ARM中的取数指令的源操作数和存数指令的目的操作数采用带偏移量的变址方式,可以表示为基址+变址寻址。有效地址寄存器的内容加上偏移量的值。对于字和无符号字节,寻址方式通常可以包括3种:寄存器间接寻址,前变址偏移寻址和后变址偏移寻址。带偏移量的变址包括常数蔌寄存器值。
(1)存器间接寻址)[Rn])
例:
LDR R0,[R1] ;((R1))→R0
STR R0,[R1] ;(R0)→(R1)
(2)前变址偏移寻址([Rn,偏移量]{!})
在数据传送之前,瘵偏移量加到Rn中。其结果作为传送数据的存储器地址。若使用后缀"!",则结果写回到Rn中,Rn不允许是R15。
该寻址方式又分为下列3种:
①立即数偏移寻址[Rn,#±《immed_12》]{!}
例:
LDR R0,[R1,#5]! ;((R1+5)→R0,(R1)+5→R1
②寄存器偏移[Rn,#±Rm{!}
例
LDR R0,[R!R1,-R2] ;((R1)-(R2))→R0
③移位寄存器偏移
[Rn, ±Rm,LSL #《immede_5》{!}
[Rn, ±Rm,LSL #《immede_5》{!}
[Rn, ±Rm,ASR #《immede_5》{!}
[Rn, ±Rm,ROR #《immede_5》{!}
[Rn, ±Rm,RPX]{!}
例:
LDR R0,[R1,R2,LSL #2] ;((R1)+(R2)*4→R0
(3)后变址偏听偏信移寻址([Rn],偏移量)
Rn的值用作传送数据的存储器地址。在数据传送后,偏移量加到Rn中,结果写回到Rn。Rn不允许是R15。
该寻址方式又分为下列3种:
①立即数偏移[Rn],#±《immde_12》
例:
LDR R0,[R1],#4 ;((R1))→R0,(R1)+4→R1
②寄存器偏移[Rn],±Rm
例:
LDR R0,[R3],-R8 ;((R3))→R0,(R3)-(R8)→R3
③移位寄存器偏移
[Rn],±Rm,LSL#《immde_5》
[Rn],±Rm,LSR#《immde_5》
[Rn],±Rm,ASR#《immde_5》
[Rn],±Rm,ROR#《immde_5》
[Rn],±Rm,RPX
例:
LDR R0,[R3],R8,LSL#2 ;((R3))→R0,(R3)+(R8)*4→R3
3 半字和有符号字节寻址方式
ARM中的半字和有符号字节取数和存数指令的寻址方式与字和无符号字节的寻址方式略有不同。
(1)寄存器间接寻址([Rn])
例:
LDR R0,[R1]
STR R0,[R1]
(2)前变址偏移寻址([Rn,偏听偏信移量]{!})
(3)在数据传送之前,将偏移量加到Rn不允许是R15。
该寻址方式又分为下列两种:
①立即数偏移[Rn,#±《immed_8》]{!}
例:
LDR R0,[R5,#22]! ;((R5+22)→R0,(R5)+22→R5
②寄存器偏移[Rn,±Rm]{!}
例:
STRB R0,[R3,-R8] ;(R0)→(R3)-(R8),(R3)-(R8)→R3
(4)后变址偏听偏信移寻址(Rn),偏移量)
Rn的值用作传送数据的存储器地址。在数据传送后,偏移量加到Rn中,结果写回到R n。Rn不允许是R15。
该寻址方式又分为下列3种:
①立即数偏移[Rn],#±immed_8》
例:
LDR R0,[R3],-R8 ;((R5))→R0,(R5)+22→R5
②寄存器偏移[Rn],±Rm
例:
STR R0,[R3],-R8 ;(R0)→(R3),(R3)-(R8)→R3
4 块寻址
ARM对堆栈的使用一般用多寄存器传送指令,是一种有效
- 什么是LED驱动时序?LCD背光驱动程序设计(04-26)
- LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码(04-25)
- wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点(04-26)
- ARM微处理器助记符指令及其功能描述(04-30)
- 布线工程师如何充分“掌控”时钟信号?(02-21)
- FPGA组成、工作原理和开发流程(10-13)