找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6963|回复: 0
打印 上一主题 下一主题
收起左侧

ARM汇编指令介绍

[复制链接]
跳转到指定楼层
楼主
ID:104835 发表于 2016-2-3 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 

1、 内存访问指令

基本指令:

LDRmemory > register (memory包括映射到内存空间的非通用寄存器)

STRregister  > memory

语法:

op{cond }{B}{T} Rd , [Rn ]

op{cond }{B} Rd , [Rn , FlexOffset ]{!}

op{cond }{B} Rd , label

op{cond }{B}{T} Rd , [Rn ], FlexOffset

op:基本指令,如LDRSTR

cond:条件执行后缀

B:字节操作后缀

T:用户指令后缀

Rd:源寄存器,对于LDR指令,Rd将保存从memory中读取的数值;对于STR指令,Rd保存着将写入memory的数值

Rn:指针寄存器

FlexOffset:偏移量

例子:

ldr r0, [r1] ;r1作为指针,该指针指向的数存入r0

str r0, [r1, #4] ;r1+4作为指针,r0的值存入该地址

str r0, [r1, #4]! ;同上,并且r1 = r1 + 4

ldr r1, =0x08100000 ;立即数0x08100000存到r1

ldr r1, [r2], #4 ;r2+4作为指针,指向的值存入r1,并且r2=r2+4

label的使用】

addr1 ;定义一个名为“addr1”的labeladdr1 = 当前地址

dcd 0 ;在当前地址出定义一个32bit的变量

~ ~ ~

ldr r1, label1     ;r1 = addr1r1即可以作为var1的指针

ldr r0, [r1]

add r0, r0, #1

str r0, [r1] ;变量var1的值加1

FlexOffset的使用】

FlexOffset可以是立即数,也可以是寄存器,还可以是简单的表达式

2、 多字节存取指令(常用于堆栈操作)

基本指令:

LDMmemory ――> 多个寄存器

STM:多个寄存器 ――> memory

语法:

op{cond }mode Rn{!}, reglist {^}

mode:指针更新模式,对应于不同类型的栈。最常用的是“FD”模式,相当于初始栈指针在高位,压栈后指针值减小。

Rn:指针寄存器

:最后的指针值将写入Rn

reglist:要操作的寄存器列表,如{r0-r8, r10}

^ :完成存取操作后从异常模式下返回

例子:

;异常处理程序:

sub lr, lr, #4 ; lr – 4是异常处理完后应该返回的地方

;保存r0~r12lr寄存器的值到堆栈并更新堆栈指针。

stmfd sp!, {r0-r12, lr}

;异常处理

ldmfd sp!, {r0-r12, pc}^ ;从堆栈中恢复r0~r12

,返回地址赋给pc指针,使程序返回到异常发生前所执行的地方,^标记用来使CPU

退出异常模式,进入普通状态。

 

3、 算术运算指令

基本指令:

ADD:加

SUB:减

语法:

op{cond }{S} Rd, Rn, Operand2

S:是否设置状态寄存器(CPSR),如:N(有符号运算结果得负数)、Z(结果得0)、C(运算的进位或移位)、V(有符号数的溢出)等等。

Rd:保存结果的寄存器

Rn:运算的第一个操作数

Operand2:运算的第二个操作数,这个操作数的值有一些限定:如可以是8位立即数(例:0xa8)或一个8为立即数的移位(例:0xa800,而0xa801就不符合)。也可以是寄存器,或寄存器的移位(如“r2, lsl #4”)。

例子:

add r0, r1, r2 ; r0 = r1 + r2

adds r0, r1, #0x80 ; r0 = r1 + 0x80,并设置状态寄存器

subs r0, r1, #2000 ; r0 = r1 – 2000,并设置状态寄存器

4、 逻辑运算指令

基本指令:

AND:与

ORR:或

EOR:异或

BIC:位清0

语法:

op{cond }{S} Rd, Rn, Operand2

语法类似算术运算指令

例子:

ands r0 r1 #0xff00 ; r0 = r1 and 0xff00,并设置状态寄存器

orr r0, r1, r2 ; r0 = r1 and r2

bics r0, r1, #0xff00 ; r0 = r1 and ! (0xff00)

ands r0, r1, #0xffff00ff ; 错误

5、 MOV指令

语法

MOV{cond}{S} Rd, Operand2

例子

mov r0, #8 ; r0 = 8

mov r0, r1 ; r0 = r1

不同于LDRSTR指令,该指令可以寄存器间赋值

6、 比较指令

基本指令:

CMP:比较两个操作数,并设置状态寄存器

语法:

CMP{cond } Rn, Operand2

例子:

cmp r0, r1 ; 计算r0 – r1,并设置状态寄存器,由状态寄存器可以知r0是否大于、小于或等于r1

cmp r0, #0 ;

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表