计算机软考嵌入式系统设计师考试知识点(8)
ARM处理器指令系统及汇编语言程序设计(指令格式,寻址方式,指令集,伪指令,语句格式与程序结构,ARM汇编语言与C的混合编程等)
(1)指令格式
指令一般格式
指令格式说明:
项目 |
含义 |
备注 |
|
指令的操作码 |
即助记符,如MOV、ADD、B等 |
{cond} |
条件域,满足条件才执行指令 |
可不加条件即可省略条件,如EQ、NE等 |
{S} |
指令执行时是否需要更新CPSR |
可省略 |
Rd |
目的寄存器 |
Rd可为任意通用寄存器 |
Rn |
第一个源操作数 |
Rd可为任意通用寄存器,可以与Rd相同 |
Op2 |
第二个源操作数 |
可为#imm8m、寄存器Rm及任意移位寄存器 |
关于#imm8m的说明:#表示立即数,其后可以是十进制或十六进制数
对于ARM指令集,#imm8m表示一个由8位立即数经循环右移任意偶数位次形成的32位操作数。
对于Thumb指令集,#imm8m表示一个由8位立即数经左移任意位次形成的32位操作数。
指令的条件码
条件码 |
助记符 |
标 志 |
含 义 |
0000 |
EQ |
Z置位 |
相等 |
0001 |
NE |
Z清零 |
不相等 |
0010 |
CS |
C置位 |
无符号数大于或等于 |
0011 |
CC |
C清零 |
无符号数小于 |
0100 |
MI |
N置位 |
负数 |
0101 |
PL |
N清零 |
正数或零 |
0110 |
VS |
V置位 |
溢出 |
0111 |
VC |
V清零 |
未溢出 |
1000 |
HI |
C置位Z清零 |
无符号数大于 |
1001 |
LS |
C清零Z置位 |
带符号数小于或等于 |
1010 |
GE |
N等于V |
带符号数大于或等于 |
1011 |
LT |
N不等于V |
带符号数小于 |
1100 |
GT |
Z清零且N等于V |
带符号数大于 |
1101 |
LE |
Z置位或N不等于V |
带符号数小于或等于 |
1110 |
AL |
忽略 |
无条件执行 |
(2)寻址方式
1)立即寻址(立即数寻址)
例如:MOV R0,#0x1212121212
ADC R0,R0,#100 ;R0 R0+100+C
2)寄存器寻址(执行效率较高)
例如:ADD R0,R1,R2 ;R0 R1+R2
3)寄存器间接寻址
寄存器间接转址就是以寄存器中的值作为操作数地址,而操作数本身存放在存储器中。用间接寻址的寄存器必须用[ ]括起来。
例如:LDR R5,[R4] ;R5 [R4],间接寻址的寄存器是R4
STR R1,[R2] ;[R2] R1,间接寻址的寄存器是R2
4)基址加变址寻址
常见的几种形式:
LDR R0,[R1,#4]
STR R1,[R2,#8]
LDR R0,[R1,#4]! (!表示指令在完成数据传输后更新基址存储器)
LDR R0,[R1],#4
LDR R0, [R1, R2]
STR R0, [R1, R2]
5)相对寻址
相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加后得到操作数的有效地址。
下列程序中跳转指令BL利用相对寻址方式:
BL Subroutine_A ;跳转子程序Subroutine_A处执行
…
Subroutine_A:
…
MOV PC ,LR ;从子程序返回
6)堆栈寻址
7)块拷贝寻址
(3)
(4)
(5)
(6)