IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【ARM】指令集与寻址——第三篇 -> 正文阅读

[嵌入式]【ARM】指令集与寻址——第三篇

目录

1、指令分类

1.1、指令

1.2、mov

1.3、移位操作

2、比较指令

2.1、条形码

2.2、数据处理指令

2.2.1、N Z C V条件码标志

2.3.1、ADD(加法)

2.2.2、64位加法

2.3.1、SUB(减法)

2.3.2、64位减法

3、跳转指令

3.1、使用程序计数器PC进行跳转

3.2、B(跳转指令)

3.3、BL(跳转指令)

4、伪操作与伪指令

4.1、伪操作

4.2、数据操作

4.3、加载存储指令

5、寻址方式

5.1、立即寻址

5.2、寄存器寻址

5.3、寄存器间接寻址

5.4、基址变址寻址

5.5、多寄存器寻址

5.6、相对寻址

5.7、堆栈寻址


1、指令分类

  • 数据处理指令∶数据传送指令(mov)、算术逻辑运算指令(ADD、SUM、AND)、比较指令(CMP、TST)

  • 跳转指令:PC赋值跳转、专用跳转指令

  • 存储访问指令:LDR和STR

  • 伪指令:ADR、ADRL、LDR、NOP

1.1、指令

指令:指令是能够被CPU所识别和执行的32位的机器码

机器码

  • 31–28bit:条件段(如:EQ、NE、CS/HS、CC/LO等)

  • 27–26bit:保留位,恒为00

  • 24–21bit:opcode,指令的类型(AND、EOR、SUB、RSB、TST、ADD等)

  • 20bit:该指令是否会影响程序状态字寄存器,是则置一,否则置零

  • 19–16bit:第一个源操作数寄存器Rd

  • 15–12bit:目的寄存器,填充方法同Rn

  • 11–0bit:

  • 指令中的数值数据只有12bit

  • 8bit:来表示数据

  • 4bit:来表示循环右移

1.2、mov

?mov:把一个数移动到目标寄存器

指令格式:

mov{条件{s} 目标寄存器,源数据(寄存器存储,可以是常数,左移数值、右移右移数值)

条件:就表示mov指令是否要执行,如果满足条件就执行mov

s:是否影响CPSR的值

示例(其中的@表示注释):

立即数:由0-255之间的任意的八位数据通过循环右移偶数位能够的得到的数据

如: ?

1.3、移位操作

????????算数移动和逻辑移动:算数左移和逻辑左移作用一致

????????左移

  • LSL:逻辑左移,低位填0

  • ASL:算数左移,低位填0

@左移

mov r1,#5
mov r2,r1,LSL #2 @ 0101 << 2 = 1 0100(5)
mov r3,r1,ASL #2 @ 0101 << 2 = 1 0100

????????右移

  • LSR:逻辑右移,高位填0

  • ASL:逻辑右移,高位填0

  • ASR:算数右移,把高位填补原来高位(0 or 1,看原高位值)


@右移
mov r4,#6
mov r5,r4,LSR #2 @ 0110 >> 2 = 0001(1)
mov r6,r4,asr #2 @ 0110 >> 2 = 0001

示例:

2、比较指令

CMP:把寄存器数据与另一个寄存器(或数值)进行比较,同时会更新CPSR的条件标志值。其实该指令就是执行一个减法,不保存运算结果,只会更新CPSR标志位(表示两个操作数的大小关系)。

2.1、条形码

比较指令(CMP)的简单例子:

(1)当r1=r2=2时如下

mov r1,#2
mov r2,#2
cmp r1,r2 @ r1-r2 @ 比较条件结果
moveq r3,r1,LSL #2 @ 上一个条件结果相等(Z=1),才执行 r3=(r1<<2)
movne r4,r2,LSL #3 @ 上一个条件结果不相等(Z=0),才执行 r4=(r2<<2)

(2)当r1=1,r2=2时如下(与上面对比)

mov r1,#1
mov r2,#2
cmp r1,r2 @ r1-r2 @ 比较条件结果
moveq r3,r1,LSL #2 @ 上一个条件结果相等(Z=1),才执行 r3=(r1<<2)
movne r4,r2,LSL #3 @ 上一个条件结果不相等(Z=0),才执行 r4=(r2<<2)

2.2、数据处理指令

2.2.1、N Z C V条件码标志

????????N : 当两个有符号数〈用补码表示)进行运算时,用N=1表示运算结果为负数,N=0表示运算结果为整数或零

????????Z : Z=1表示运算结果为0,Z=0表示运算结果为非O

????????C : 运算加法产生进位,减法产生借位,运算加法时,如果产生了进位时C=1,否则C=0,减法运算时,如果产生了借位时C=O,否则C=1。进行包含移位操作的非加法/减法的指令时,C为移出值的最后一位,其他耳加法/减法指令时,C通常不变。

????????V :进行有符号位(补码表示)运算时,符号位溢出,V=1。

2.3.1、ADD(加法)

目标寄存器,操作数1,操作数2 ?

add实现两个数相加,把结果放在目标寄存器中,操作数1是一个寄存器,操作数2可以是寄存器、内存数据、数值 ?

加上s选项:修改CPSR条件标志

ADC ? adc表示加法,加上CPSR的进位标志

数据运算----加法

2.2.2、64位加法

@64加法
@低32位加上低32位;高32位加上高32位(64位数据)
@0x 00 00 01 e0 ff 00 00 00 
@0x 00 00 12 00 ef 00 00 00
?
mov r2,#0xff000000 @ r1,r2表示一个数
mov r1,#0x000001e0
?
mov r4,#0xef000000
mov r3,#0x00001200
?
adds r6,r2,r4 @ r6=r2+r4(有进位)
adc r5,r1,r3  @ r5=r1+r3

2.3.1、SUB(减法)

目标寄存器,操作数1,操作数2 ?

sub实现两个数相减,把相减的结果放在目 标寄存器中

SBC

sbc除了做正常的减法以外,还要把cpsr借位减去

@ 减法
mov r1,#5
mov r2,#2
sub r1,r1,r2 @ r1=r1-r2
?
mov r3,#3
mov r4,#5
subs r3,r3,r4 @ r3=r3-r4(借位)
?
mov r5,#5
mov r6,#0
sbc r5,r5,r6 @ r5=r5-r6(除本身的值,还会减去借位值 r5=r5-r6-借位(1))

2.3.2、64位减法

@64减法
@低32位减去低32位;高32位减去高32位(64位数据)
@0x 00 00 00 11 00 00 00 05
@0x 00 00 00 02 00 00 ff 00
mov r1,#0x11
mov r2,#0x05
?
mov r3,#0x02
mov r4,#0xff00
?
subs r6,r2,r4
sbc r5,r1,r3 @ r5=r1-r3-1(此处有借位,需要减1操作)

3、跳转指令

????????在程序执行流程中的跳转操作

3.1、使用程序计数器PC进行跳转

@ 使用PC和LR能够进行循环执行
?
mov LR,PC @ LR存储PC的值,LR中存储某条指令的地址
mov r1,#1
mov r2,#2
mov r3,#3
mov r4,#4
mov r5,#5
mov r6,#6
mov PC,LR @ 把LR寄存器的内容赋值给PC

?3.2、B(跳转指令)

????????B 目标地址

mov r1,#1
mov r2,#2
mov r3,#3
b next @ 表示跳转到next(标号)地址
mov r4,#4
mov r5,#5
next: @ 此处next(标号)标记指令地址
mov r6,#6

3.3、BL(跳转指令)

????????在执行跳转操作前,先会把当前PC的值赋值给LR寄存器

mov r1,#1
BL next @ 此处PC值赋给LR
mov r3,#3
next: 
mov r4,#4

4、伪操作与伪指令

4.1、伪操作

  • .global----对连接器可见,对整个程序可见的全局变量

  • .local----对本地文件可见

  • _start----表示汇编程序的入口标号

  • .end----表示文件代码结束

标号:用字母、数字表示名字,用于标记指令地址

使用格式:name(名字) :

ldr 寄存器,=值(可以直接对寄存器进行赋值)

4.2、数据操作

一般都是为数据分配存储单元(内存中)

  • .byte----申请字节

  • .word---申请字空间

  • .space--申请一段连续的空间

ldr r2,=d1 @ d1是标号,是一个值,这个值表示的内容为地址

d1: @ d1(标号)用于标记指令地址

.space 4*1024 @申请的一块地址

4.3、加载存储指令

????????寄存器和内存传输

ldr 目标寄存器,存储器地址 ? 从存储器地址对应的存储器空i间读取32bit值,存放到目标寄存器

ldr r1,[r2,#4] @ r2+4作为存储器地址,ldr取出地址中的数据值

str 源寄存器,目标存储器地址 ? 从奇存器中把数据存储到存储器地址对应的存储器空间中

str r1,[r2] @[r2],将r2表示为一个存储器的地址,把r1的内容存储到地址中

5、寻址方式

5.1、立即寻址

也叫做立即数寻址,操作数就已经存在于指令中,主要操作这个指令就能够的到数据

@立即寻址
add r0,#10  @ 在指令中就包含要操作的数据 r0=r0+10

5.2、寄存器寻址

寄存器的值作为操作数

@寄存器寻址
ldr r1,=0x12345678
add r0,r1  @ 在指令中没有数据,但是数据存储寄存器中,指令包含寄存器

5.3、寄存器间接寻址

寄存器内容作为对应操作数的地址,[寄存器]:就是把寄存器内容作为地址,操作对应地址的值

@寄存器间接寻址
ldr r0,=addr @ r0就是存储的地址
ldr r1,[r0] @ 得到r0作为地址的值

5.4、基址变址寻址

将寄存器(该寄存器一般称为基址寄存器,因为是存储地址),与指令中给出的地址偏移量相加得到一个有效地址

@基址变址寻址
ldr r0,=addr
ldrb r2,[r0,#1] @ r2=r0+1

5.5、多寄存器寻址

—条指令能够指定地址开始传输多个值到多个寄存器

@多寄存器寻址

ldmia r0,{r1,r2,r3,r4} @ r1=[r0],r2=[r0+4],r3=[r0+8],r4=[r0+12]

5.6、相对寻址

以开始位置作为基址,偏移指令个数的大小地址,基址加上偏移指令个数就是有效地址

bl one @在bl指令 pc表示当前指令的地址

5.7、堆栈寻址

使用一个专用的称为堆栈指针的寄存存储当前操作的位置,指向栈顶地址
?
可以操作一连串的多个数据(寄存器与存储器之间数据传输)
    
LDM:从存储器批量取数据到寄存器
STM:从寄存器批量存数据到存储器
?
FD:满递减栈 ---------从结束地址开始(从高地址往低地址)
ED:空递减栈 
FA:满递增栈
EA:空递增栈 ---------从开始地址开始(从低地址往高地址)
@堆栈寻址
mov r0,#0
mov r1,#1
mov r2,#2
mov r3,#3
mov r4,#4
mov r5,#5
mov r6,#6
mov r9,#9
?
ldr r13,=stack_end
stmfd sp!,{r0-r6,r9,lr} @ (FD)
@堆栈寻址
mov r0,#0
mov r1,#0
mov r2,#0
mov r3,#0
mov r4,#0
mov r5,#0
mov r6,#0
mov r9,#0
?
ldmfd sp!,{r0-r6,r9,pc} @ (ED)

-----------------------------------------------------此篇到此结束了-------------------------------------------------------

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-25 23:18:15  更:2022-09-25 23:18:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:14:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码