好文档 - 专业文书写作范文服务资料分享网站

常用ARM及汇编指令

天下 分享 时间: 加入收藏 我要投稿 点赞

.

STMFD SP!,{R1-R7,LR} ;将R1-R7,LR入栈,满递减堆栈

LDMFD SP!,{R1-R7,LR} ;数据出栈,放入R1-R7,LR寄存器,满递减堆栈

8、块拷贝寻址:多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置

STMIA R0!,{R1-R7} ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,方向为向上增长

STMIB R0!,{R1-R7} ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,方向为向上增长

SIMDA R0!,{R1-R7} ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,方向为向下增长

STMDB R0!,{R1-R7} ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,方向为向下增长

不论是向上还是向下递增,存储时高编号的寄存器放在高地址的内存,出来时,高地址的内容给编号高的寄存器

9、相对寻址:是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址 BL ROUTE1 ;调用到 ROUTE1 子程序 BEQ LOOP ;条件跳转到 LOOP 标号处

.

.

================================================================================================================

指令集介绍

指令格式: {}{S},,{} 其中<>内的项是必须的,{}内的项是可选的 opcode 指令助记符,如 LDR,STR等 cond 执行条件,如 EQ,NE等

S 是否影响CPSR寄存器的值,书写时影响CPSR,否则不影响

Rd 目标寄存器

Rn 第一个操作数的寄存器 operand2 第二个操作数

指令格式举例如下:

LDR R0,[R1] ;读取R1地址上的存储器单元内容,执行条件AL(无条件执行)

BEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVEN

ADDS R1,R1,#1 ;加法指令,R1+1 => R1 影响CPSR寄存器,带有S SUBNES R1,R1,#0xD ;条件执行减法运算(NE),R1-0xD => R1,影响CPSR

.

.

寄存器,带有S 条件码表

条件码助记符 EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL 标志 Z=1 Z=0 C=1 C=0 N=1 N=0 V=1 V=0 C=1,Z=0 C=0,Z=1 N=V N!=V Z=0,N=V Z=1,N!=V 含义 相等 不相等 无符号数大于或等于 无符号数小于 负数 正数 溢出 没有溢出 无符号数大于 无符号数小于或等于 带符号数大于或等于 带符号数小于 带符号数大于 带符号数小于或等于 任何无条件执行(指令默认条件) .

.

条件码应用举例:

1、比较两个值大小,C代码如下: if(a>b) a++; else b++;

写出相应的ARM指令

代码如下:设R0为a,R1为b

CMP R0, R1 ; R0与R1比较 ADDHI R0,R0,#1 ; 若R0>R1,则R0=R0+1 ADDLS R1,R1,#1 ; 若R0<=R1,则R1=R1+1

2、若两个条件均成立,则将这两个数值相加 C代码为: if((a!=10)&&(b!=20)) a=a+b; 对应的ARM指令为:

CMP R0,#10 ;比较R0是否为10

CMPNE R1,#20 ;若R0不为10,则比较R1是否为20

ADDNE R0,R0,R1; 若R0不为10且R1不为20,则执行 R0 = R0+R1

3、若两个条件有一个成立,则将这两个数值相加 C代码为: if((a!=10)||(b!=20)) a=a+b; 对应的ARM指令为: CMP R0,#10

.

.

CMPEQ R1,#20 ADDNE R0,R0,R1

ARM存储访问指令:

LDR、STR、LDM、STM、SWP

LDR/STR:加载/存储字和无符号字节指令

从寻址方式的地址计算方法分,加载/存储指令有以下4种形式: 1,零偏移:LDR Rd,[Rn]

2,前索引偏移: LDR Rd,[Rn,#0x04]!,LDR Rd,[Rn,#-0x04] Rn不允许为R15 3,程序相对偏移:LDR Rd,label,label为程序标号,该形式不能使用后缀! 4,后索引偏移: LDR Rd,[Rn],#0x04,Rn不允许是R15

指令举例如下:

LDR R2,[R5] ;加载R5指定地址上的数据(字),放入R2中 STR R1,[R0,#0x04] ;将R1的数据存储到 R0+0x04存储单元,R0的值不变 (若有!,则R0就要更新)

LDRB R3,[R2],#1 ;读取R2地址上的一字节数据并保存到R3中,R2=R2+1

STRH R1,[R0,#2]! ;将R1的数据保存到R0+2的地址中,只存储低2字节数据,R0 =R0+2

LDM和STM是批量加载/存储指令,LDM为加载多个寄存器,STM为存储多个寄存器,主要用途是现场保护,数据复制、参数传递等,其模式有8种,前4

.

常用ARM及汇编指令

.STMFDSP!,{R1-R7,LR};将R1-R7,LR入栈,满递减堆栈LDMFDSP!,{R1-R7,LR};数据出栈,放入R1-R7,LR寄存器,满递减堆栈8、块拷贝寻址:多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置STMIAR0!,{R1-R7};将R1-R7的数据保存到存储器
推荐度:
点击下载文档文档为doc格式
8aqz882s4881m9s40mcz3j4le87moy00jaa
领取福利

微信扫码领取福利

微信扫码分享