单片机
返回首页

arm学习笔记三(arm指令集)

2024-10-17 来源:cnblogs

arm指令集

跳转指令   实现流程的跳转
专门的跳转指令
b   跳转指令
  格式:
B{条件}目标地址
  示例代码如下:当cpsr寄存器中的z条件码置位时,程序跳转到标号label处执行
CMP R1,#0
BEQLable
指令条件
指令条件       标志位            含义
EQ              Z置位             相等
NE              Z清零            不相等
CS              C置位            无符号数大于或等于
CC              C清零            无符号数小于
MI              N置位            负数
PL              N清零            正数或零
VS              V置位            溢出
VC              V清零            未溢出
HI              C置位Z清零       无符号数大于
LS              C清零z置位       无符号数小于或等于
GE              N等于V           带符号数大于或等于
LT              N不等于V         带符号数小于
GT              Z清零且(N等于V)  带符号数大于
LE              Z置位或(N不等于V)带符号数小于或等于
AL        忽略              无条件执行

bl  带返回的跳转指令
在跳转之前,会把pc当前值保存到r14中
  格式:
BL{条件}   目标地址

blx 带返回和状态切换的跳转指令
将处理器的工作状态从arm状态切换到thumb状态,同时将pc当值存入r14中

bx  带状态切换的跳转指令

直接向程序计数器写入跳转地址
mov lr,pc

---------------------------------------------------------------------
数据处理指令
数据传送指令,算述逻辑运算指令和比较指令

mov
 从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器
 s选项决定指令的操作是否影响cpsr中条件标志们的值,没有s时不更新标志位
  格式:
  mov{条件}{S}目的寄存器  源操作数
  示例代码如下:
   mov r1,r0;将寄存器r0的值传送到寄存器r1
   mov pc,r14;
   mov r1,r0,lsl#3; 将寄存器r0的值左移3位后传送到r1
注:源操作数不能是间接寻址,mov指令不能在寄存器和内存间使用

mvn
 从一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器
 与mov指令不同的是在传送前按位取反了
  格式:
mvn{条件}{s} 目的寄存器  源操作数
  示例代码如下:
 mvn r0,#0xff; r0<---0xffffff00

cmp
把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新cpsr中条件标志位的值(进行一次减法运算)
  格式:
cmp{条件}操作数1,操作数2
  示例代码如下:
cmp r1,r0;
        cmp r1,#100;

tst
把一个寄存器的内容和另一个寄存器的内容或立即数进行按位与运算,更新cpsr
 格式:
tst{条件}  操作数1,操作数2 
 示例代码如下:
tst r1,#%1;测试在寄存器r1中是否设置了最低位

add
把两个数相加
 格式:
add{条件}{S}目的寄存器,操作数1,操作数2
 示例代码如下:
add r0,r1,r2;  r0=r1+r2
add r0,r1,#256; r0=r1+256
add r0,r2,r3,lsl#1; r0=r2+(r3<<1)

sub
把操作数1减去操作数2
 格式:
sub r0,r1,r2; r0=r1-r2
sub r0,r1,#256; r0=r1-256
sub r0,r2,r3,lsl#1; r0=r2-(r3<<1)

and 
在两个操作数上进行逻辑与运算,结果放到目的寄存器中
常用于屏蔽操作数1的某些位
 格式:
and{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
and r0,r0,#3; 保持r0的0、1位,其余位清零

orr
在两个操作数上进行逻辑或运算,结果放到目的寄存器
常用于设置操作数1的某些位
 格式:
orr{条件}{S}目的寄存器,操作数1,操作数2
 示例代码如下:
orr r0,r0,#3;设置r0的0、1位,其余位不变

bic
用于清除rn中的某些位,结果存放在rd中,operand2为32位的掩码
如果掩码中设置某一位为1,则该位清零
 格式:
bic{cond}{S}Rd,Rn,operand2
 示例代码如下:
bic r0,r0,#%1011;将r0的0、1、3位清零

mul
将操作数1与操作数2相乘,结果存放到目的寄存器中
 格式:
mul{条件}{S}目的寄存器,操作数1,操作数2 
 示例代码如下:
mul r0,r1,r2; r0=r1*r2
muls r0,r1,r2; r0=r1*r2 同时设置cpsr中的条件标志位

------------------------------------------------------------
程序状态寄存器访问指令

mrs
将程序状态寄存器的内容传送到通用寄存器中
 格式:
mrs{条件}通用寄存器,程序状态寄存器
示例代码如下:
 mrs r0,cpsr; 传送cpsr的内容到r0
  mrs r0,spsr; 传送spsr的内容到r0

msr
将操作数的内容传送到程序状态寄存器的特定域中
操作数可以为通用寄存器或立即数
<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域
位[31:24]条件标志位域,用f表示
位[23:16]为状态位域,用s表示
位[15:8]为扩展位域,用x表示
位[7:0]为控制位域,用c表示
 格式:
msr{条件}程序状态寄存器_<域>,操作数
示例代码如下:
msr cpsr,r0; 传送r0的内容到cpsr
msr spsr,r0; 传送r0的内容到spsr
msr cpsr_c,r0; 传送r0的内容到spsr,但仅仅修改cpsr中的控制位域

加载/存储指令
用于寄存器和存储器之间传输数据

ldr
从存储器中将一个32位的字数据传送到目的寄存器
ldr{条件}目的寄存器,<存储地址>
示例代码如下:
ldr r0,[r1]; r0=r1
ldrb r0,[r1]; 将寄存器地址为r1的(8位)字数据写入r0,将r0的高24位清零
ldrh r0,[r1]; 将以寄存器地址为r1的(16位)半字数据定入r0,将r0的高16位清零

str
从寄存器中将一个32位的字数据传送到存储器中
str{条件}源寄存器,<存储器地址>
示例代码如下:
str r0,[r1],#8; 将r0中的字数据写入以r1为地址的存储器中,并将新地址                    r1+8写入r1
str r0,[r1,#8]; 将r0中的字数据写入以r1+8为地址的存储器中

批量加载/存储指令
一次在一片连续的存储器和多个寄存器之间传送数据

ldm
用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据
将多个寄存器的内容入栈或出栈

ldm{条件}{类型}基址寄存器{!},寄存器列表{^}

类型:
IA 每次传送后地址加1
IB 每次传送前地址加1
DA 每次传送后地址减1
DB 每次传送前地址减1
FD 满递减堆栈
ED 空递减堆栈
FA 满递增堆栈
EA 空递增堆栈

{!} 为可选后缀,如果选用,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不变.基址寄存器不允许为r15

{^} 为可选后缀,当指令为ldm且寄存器列表中包含r15,选用该后缀时表示:除了正常的数据传送之外,还将spsr复制到cpsr


示例代码如下:
ldmfd r13!,{r0,r4-r12,pc}; 将堆栈内容恢复到寄存器

stm
stm{条件}{类型}基址寄存器{!},寄存器列表{^}
示例代码:
stmfd r13!,{r0,r1}; 将寄存器列表中的寄存器存入堆栈

数据交换指令
在存储器和寄存器之间交换数据

swp 字数据交换指令

swp{条件}目的寄存器,源寄存器1,[源寄存器2]
将源寄存器2所指向的存储器中的字节数据传送到目的寄存器
将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中
(当源寄存器1和目的寄存器为同一个寄存器时,该指令就实现寄存器和存储器的内容的交换)

swp r0,r1,[r2]; 
swp r0,r0,[r1];

swpb 字节数据交换指令

移位指令
不作为单独的指令使用,只能作为指令格式中的一个字段
lsl 逻辑左移 (相当于乘)
通用寄存器,lsl操作数
示例代码如下:
 mov r0,r1,lsl#2; 将r1中的内容左移两位后传送到r0 
asl 算术左移(等价于lsl)
lsr 逻辑右移
asr 算术右移
ror 循环右移(相当于除)

异常产生指令
swi 软件中断指令
产生软件中断,以便用户程序能调用操作系统的api
swi{条件}24位立即数
示例代码如下:
swi 0x02 调用操作系统编号位02的系统例程

bkpt 断点中断指令

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 如何使用LED驱动器LM3915制作振动计

  • 一个简单的立体声平衡指示器电路

    相关电子头条文章