arm汇编编程(示例)
引值,R3内存地址,读取R3+R0地址上的存储单元的内容,放入R2
[R3,R0]表示地址偏移后取值,相当于*(p+i)或p[i]
5.多寄存器寻址
一次可传送多个寄存器的值,也称为块拷贝寻址
例:LDMIAR1!,{R2-R7,R12};将R1指向的存储单元中的数据读写到R2~R7、R12中,然后R1自加1
STMIAR1!,{R2-R7,R12};将寄存器R2~R7、R12的值保存到R1指向的存储单元中,然后R1自加1
其中R1是基址寄存器,用来存基址,R2-R7、R12用来存数据赋值编号小的寄存器与低地址相对应,与寄存器列表顺序无关
!为可选后缀,表示改变R1的值,则当数据传送完毕之后,将最后的地址写入基址寄存器
基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。
这里R1没有写成[R1]!,是因为这个位不是操作数位,而是寄存器位
LDMIA和STMIA是块拷贝指令,LDMIA是从R1所指向的内存中读数据,STMIA是向R1所指向的内存写入数据
R1指向的是连续地址空间
6.寄存器堆栈寻址
是按特定顺序存取存储区,按后进先出原则,使用专门的寄存器SP(堆栈指针)指向一块存储区
例:LDMIASP!,{R2-R7,R12};将栈内的数据,读写到R2~R7、R12中,然后下一个地址成为栈顶
STMIASP!,{R2-R7,R12};将寄存器R2~R7、R12的值保存到SP指向的栈中
SP指向的是栈顶
7.相对寻址
即读取指令本身在内存中的地址。是相对于PC内指令地址偏移后的地址。
由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。
例:
BLOOP;B指令用于跳转到标号LOOP指令处执行代码
...
LOOP
MOVR6#1
其中LOOP仅仅是标号,而不是地址,不是CPU指令,所以在指令的机器码中没有标号的机器码,而是
计算出了从B指令到MOV指令之间内存地址的差值,这个差值相当于PC的偏移量,即相当于:addpc,pc,#偏移量
B指令引起了PC寄存器值的变化,PC内永远保存将要运行指令在内存中的地址。
8.寄存器移位寻址
操作数在被使用前进行移位运算
例:MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,;即是R0=R2×8
LSL是移位指令,用于将前面寄存器的数据左移
//^^^^^^^^^^^^^^^^^^^^^^^^^^下午^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ARM汇编语言语句由指令、伪指令、伪操作、宏指令组成
三.ARM指令集
共包括6种类型:数据处理指令、跳转指令、程序状态指令、加载存取储指令、协处理指令、软中断指令
(一)、数据处理指令
数据处理指令,只能对寄存器内容进行操作,而不能对内存进行操作,所有数据处理指令均可使用S后缀,并影响状态标志
包括:数据传送指令、算述指令、乘法指令、逻辑运算指令、比较指令、移位指令
1.数据传输指令
1)MOV数据传送指令
格式:MOVRd,
功能:Rd=操作数,操作数可以是寄存器、被移位的寄存器或立即数。
例:
MOVR0,#0xFF000;立即寻址,将立即数0xFF000(第2操作数)装入R0寄存器
MOVR1,R2;寄存器寻址,将R2的值存入R1
MOVR0,R2,LSL#3;移位寻址,R2的值左移3位,结果放入R0
2)MVN数据取反传送指令
格式:MVN
功能:将操作数传送到目的寄存器Rd中,但该值在传送前被按位取反,即Rd=!op1;
例:
MVNR0,#0;R0=-1
mvn意为“取反传输”,它把源寄存器的每一位取反,将得到的结果写入结果寄存器。
movs和mvns指令对pc寄存器赋值时有特殊含义,表示要求在赋值的同时从spsr中恢复cpsr。
mov和mvn指令,编译器会进行智能的转化。比如指令“movr1,0xffffff00”中的立即数是非法的。
在编译时,编译器将其转化为“mvnr1,0xff”,这样就不违背立即数的要求。所以对于mov和mvn指令,
可以认为:合法的立即数反码也是合法的立即数。
2.算术指令
1)ADD加法指令
格式:ADD{
功能:Rd=Rn+op2
例:
ADDR0,R1,#5;R0=R1+5
ADDR0,R1,R2;R0=R1+R2
ADDR0,R1,R2,LSL#5;R0=R1+R2左移5位
2)ADC带进位加法指令
格式:ADC{
功能:Rd=Rn+op2+carry,carry为进位标志值。该指令用于实现超过32位的数的加法。
例如:
第一个64位操作数存放在寄存器R2,R3中;
第二个64位操作数存放在寄存器R4,R5中;
64位结果存放在R0,R1中。
ADDSR0,R2,R4;低32位相加,S表示结果影响条件标志位的值
ADCR1,R3,R5;高32位相加
3)SUB减法指令
格式:SUB{
功能:Rd=Rn-op2
例:
SUBR0,R1,#5;R0=R1-5
SUBR0,R1,R2;R0=R1-R2
SUBR0,R1,R2,LSL#5;R0=R1-R2左移5位
4)SBC带借位减法指令
格式:SBC{
功能:Rd=Rn-op2-!carry
SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。
例:
第一个64位操作数存放在寄存器R2,R3中;
第二个64位操作数存放在寄
arm汇编编 相关文章:
- ARM汇编编程基础之四-ARM汇编伪操作(11-27)
- ARM汇编编程基础之三-基本寻址方式与基本指令(11-27)
- ARM汇编编程基础之一-寄存器(11-27)
- ARM汇编编程基础之五-ADS开发环境的使用(11-27)
- ARM汇编编程基础之二-流水线对PC值的影响(11-27)
- ARM汇编编程基础之六-其它寻址模式与其它指令(11-27)