微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm汇编编程(示例)

arm汇编编程(示例)

时间:11-09 来源:互联网 点击:

引值,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{}{S},,;

功能: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{}{S},,;

功能: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{}{S},,;

功能: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{}{S},,;

功能:Rd=Rn-op2-!carry

SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。

例:

第一个64位操作数存放在寄存器R2,R3中;

第二个64位操作数存放在寄

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top