ARM(S3C2440)的常用指令

  • 格式:pdf
  • 大小:85.26 KB
  • 文档页数:12

;AREA指令定义一个程序段,名称为
EX2,属性为:CODE、READONLY
INCLUDE Common.inc ;包含汇编头文件
IMPORT sub1
;引用外部符号
EXPORT prog1 ;向外输出符号
ENTRY
;ENTRY指令定义程序
的开始
start
;此处定义了一个label
start
MOV r0, #10
常用 ARM 指令
1、 内存访问指令 基本指令:
LDR:memory -> register (memory 包括 映射到内存空间的非通用寄存器)
STR:register -> 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:基本指令,如 LDR、STR cond:条件执行后缀 B:字节操作后缀 T:用户指令后缀 Rd:源寄存器,对于 LDR 指令,Rd 将保存从 memory 中读取的数值;对于 STR 指令,Rd 保存着将写入 memory 的数值 Rn:指针寄存器 FlexOffset:偏移量
的变量
~~~
ldr r1, label1 ;r1 = addr1,r1 即可以作为
var1 的指针
ldr r0, [r1]
add r0, r0, #1
str r0, [r1]
;变量 var1 的值加 1
【FlexOffset 的使用】
FlexOffset 可以是立即数,也可以是寄存
PDF 文件使用 "pdfFactory Pro" 试用版本创建
blgt sub1
;如果r0>r1,跳转到sub1,否
则不操作
;――――――――――――――――――――
;一段循环代码
ldr r2, =8 ;r2 = 8
loop
;这里可以进行一些循环内的操作
subs r2, r2, #1 ;r2 = r2 –1,并设置状态
PDF 文件使用 "pdfFactory Pro" 试用版本创建

bne loop
;如果r2不等于0,则继续
循环
;――――――――――――――――――――
mov r0, #1
; r0 = 1
cmp r2, #8
; 比较r2和8
movlt r0, #2
; 如果r2<8,r0 = 2
ARM汇编程序结构
;――――――――――――――――――――
AREA EX2, CODE, READONLY
PDF 文件使用 "pdfFactory Pro" 试用版本创建
合)。也可以是寄存器,或寄存器的移位(如“r2, lsl #4”)。
例子:
add r0, r1, r2
; r0 = r1 + r2
adds r0, r1, #0x80
; r0 = r1 +
0x80,并设置状态寄存器 subs r0, r1, #2000
Rn:指针寄存器 !:最后的指针值将写入 Rn 中 reglist:要操作的寄存器列表,如{r0-r8, r10} ^ :完成存取操作后从异常模式下返回
例子:
;异常处理程序: sub lr, lr, #4
应该返回的地方
; lr – 4 是异常处理完后
;保存 r0~r12 和 lr 寄存器的值到堆栈并更新堆栈指 针。
2000,并设置状态寄存器
; r0 = r1 –
4、 逻辑运算指令 基本指令:
AND:与 ORR:或 EOR:异或 BIC:位清 0
语法:
op{cond }{S} Rd, Rn, 语法类似算术运算指令
例子:
Operand2
ands r0, r1, #0xff00
; r0 = r1 and
0xff00,并设置状态寄存器
MOV r1, #3
ADD r0,r0,r1
;r0 =r0 +r1
PDF 文件使用 "pdfFactory Pro" 试用版本创建
prog1
;此处定义了一个label
prog1
MOV r0, #0x18
LDR r1, =0x20026
SWI 0x123456
5、 MOV 指令 语法:
MOV{cond}{S} Rd, Operand2
例子:
mov r0, #8
; r0 = 8
mov r0, r1
; r0 = r1
不同于 LDR、STR 指令,该指令可以寄存器间赋值
6、 比较指令 基本指令:
CMP:比较两个操作数,并设置状态寄存 器
语法:
CMP{cond } Rn, Operand2
mov $w3, $w1
mov $w1, $w2
PDF 文件使用 "pdfFactory Pro" 试用版本创建
mov MEND
$w2, $w3
;使用这个宏 ldr r0, =1 ldr r1, =2 swap r0, r1, r2 ;此处调用了宏swap,运
END
;END指令表示程序段
的结束
;――――――――――――――――――――
宏的使用
定义宏:
MACRO
;宏的起始
{label} macronamepara1,para2……
;代码
MEND
;宏结束
引用宏:
marconame para1,para2……
例子
;定义一个宏,完成两个寄存器内容交换
MACRO
swap $w1, $w2, $w3
行完后r0、r1的值交换了 一般可以把宏写在宏文件(.mac文件)中,在程序里用 INCLUDE指令包含宏文件
PDF 文件使用 "pdfFactory Pro" 试用版本创建
不常使用。
例子
100
; 定义本地 label,名称
为“100”
~~~
100
; 第二次定义本地
label,名称为“100”
~~~
b %f100
; 向前跳到最近的
“100”处
~~~
b %b100
; 向后跳至最近的
“100”处
100
; 第三次定义本地 label
100
8、 条件执行
条件:状态寄存器中某一或某几个比特的值 代表条件,对应不同的条件后缀 cond,如:
器,还可以是简单的表达式
2、 多字节存取指令(常用于堆栈操作) 基本指令:
LDM:memory ――> 多个寄存器 STM:多个寄存器 ――> memory
语法:
op{cond }mode Rn{!}, reglist {^} mode:指针更新模式,对应于不同类型的栈。最常 用的是“FD”模式,相当于初始栈指针在高位,压栈 后指针值减小。
语法:
op{cond} label label:要跳向的地址
例子:
loop1
~~~
b loop1
; 跳到地址 loop1 处
bl sub1 至 sub1
; 将下一指令地址写入 lr,并跳
~~~
sub1
~~~
mov pc, lr
; 从 sub1 中返回
【使用本地 label(local label)】
stmfd sp!, {r0-r12, lr}
PDF 文件使用 "pdfFactory Pro" 试用版本创建
;异常处理 ldmfd sp!, {r0-r12, pc}^ ; 从 堆 栈 中 恢 复 r0~r12,返回地址赋给 pc 指针,使程序返回到异常 发生前所执行的地方,^标记用来使 CPU 退出异常 模式,进入普通状态。
后缀 (cond) 状态寄存器中的标记 意义
PDF 文件使用 "pdfFactory Pro" 试用版本创建
EQ 相等
Z=1
NE 不相等
Z=0
GE
N和V相同
>=
LT
N和V不同
<
GT
Z = 0, 且N和V相同
>
LE
Z = 1, 或N和V不同
<=
例子:
cmp r0, r1 ;比较r0和r1
3、 算术运算指令 基本指令:
ADD:加 SUB:减
语法:
op{cond }{S} Rd, Rn, Operand2 S:是否设置状态寄存器(CPSR),如:N(有符号 运算结果得负数)、Z(结果得 0)、C(运算的进位或 移位)、V(有符号数的溢出)等等。 Rd:保存结果的寄存器 Rn:运算的第一个操作数 Operand2:运算的第二个操作数,这个操作数的值 有一些限定:如可以是 8 位立即数(例:0xa8)或一 个 8 为立即数的移位(例:0xa800,而 0xa801 就不符
本地 label 可以在一个程序段内多次使用,用数字
作为 label 的名称,也可以在数字后面跟一些字母。引
用本地 label 的语法是:%{F|B}{A|T}n{routname},其
PDF 文件使用 "pdfFactory Pro" 试用版本创建
中 F 代表向前搜索本地 label,B 代表向后搜索,A/T
例子:
PDF 文件使用 "pdfFactory Pro" 试用版本创建
ldr r0, [r1]