单片机:数据迁移指令

数据迁移

数据迁移可以用MOV指令来进行数据迁移那么数据迁移是什么?

汇编语言中的MOV指令是一种数据迁移指令,它用于将一个数据项从源位置复制到目标位置。这种指令是数据操作的基础,允许程序员在寄存器、内存地址和其他数据存储位置之间移动数据。MOV指令不执行任何算术或逻辑操作,它只是简单地将数据从一个地方复制到另一个地方。

在汇编语言中,MOV指令的语法通常遵循“MOV 目标, 源”的格式。其中,目标是指数据要被复制到的位置,而源是指数据当前所在的位置。源和目标可以是寄存器、内存地址或立即数(即直接指定的数值)。

以寄存器为例 修改寄存器 R0的值位6

MOV R0,#6

相当于c语言中的 R0 = 6

其中mov 和寄存器大小写不区分我们可以在DEBUG窗口看到R0的值已经修改为6

#6是什么意思那?

在汇编中#6表示立即数他
在计算机编程和汇编语言中常见的一种操作数类型。它是指在指令中直接编码的数值,而不是存储在内存或寄存器中的值。立即数通常是常量或者由程序员明确指定的值,可以直接参与到算术运算、逻辑运算或者数据处理中,无需从其他地方读取。

立即数不仅可以用十进制也可以用其他进制表示。

立即数的本质是什么,有什么优缺点

立即数的本质:立即数是包含在指令当中的数据(即属于指令的一部分)

立即数的优点:读取指令的同时也将立即数读取到了内存中,速度快

立即数的缺点:数量有限

注:使用mov 给寄存器里面存放值的时候,#号后面需是有效数(①:立即数,②:取反之后是立即数),如果不是立即数需要用ldr指令进行存放。

例如:

ldr r11,=0x123456

那么立即数最大可以到多少?

立即数最大到多少取决于当前使用的架构,当前使用的芯片为STM32U575RIT6他是基于ARM Cortex-M33核心的微控制器,32位,具体来说,ARM的MOV指令通常不能直接加载一个大于一定范围的立即数到寄存器中。对于32位的ARM架构,虽然寄存器本身是32位的,但MOV指令的立即数字段通常较窄,无法直接表示一个完整的32位立即数。实际上,ARM指令集中的MOV指令通常只能加载8位(8位二进制数或两个十六进制数最大为0xff或者256)或更少的立即数,并通过移位和旋转等操作来扩展这些位的范围。 

汇编语言可以进行一些运算操作比如加减乘除操作,移位,位运算

算术运算指令

				MOV R0,#1
				MOV R1,#2
				ADD R2,R1,R0;加法---->R2=R1+R0;
				SUB R2,R1,R0;减法---->R2=R1-R0;
				MUL R2,R1,R0;乘法---->R2=R1*R0;

逻辑运算指令

				MOV R0,#1
				MOV R1,#2
				MOV R2,#3
				AND R3,R1,R0 ;与---->R3=R1&R0
				ORR R3,R1,R0 ;或---->R3=R1|R0
				EOR R3,R1,R0 ;异或---->R3=R1^R0
				LSL R3,R2,R1 ;左移---->R3=R2<<R1
				LSR R3,R2,R1 ;右移---->R3=R2>>R1

xPSR状态寄存器

N (Negative) – 负标志:如果最近的算术操作的结果是负数,此位被置位。

Z (Zero) – 零标志:如果最近的算术或逻辑操作的结果是零,此位被置位。

C (Carry) – 进位标志:如果最近的加法或乘法操作产生了进位,或者减法操作产生了借位,此位被置位。

V (Overflow) – 溢出标志:如果最近的有符号整数运算产生了溢出,此位被置位。

Q (Saturation) – 饱和标志:如果一个饱和运算发生了饱和,此位被置位(仅在支持饱和运算的指令集架构中有效)。

GE (Greater Equal) – 大于等于标志:这是四个位(GE[3:0]),用于比较两个操作数,分别对应无符号和有符号的比较结果。

除了这些条件码标志,APSR还包含一些控制位,如:

I (Interrupt Disable) – 中断禁止标志:如果被置位,硬件中断被屏蔽。

F (Fast Interrupt Disable) – 快速中断禁止标志:如果被置位,快速中断(FIQ)被屏蔽。

T (Thumb) – Thumb标志:如果被置位,处理器处于Thumb状态;否则,它处于ARM状态。

分支/跳转指令

B (Branch):这是一个基本的无条件跳转指令,用于将程序计数器(PC)设置为指令中指定的地址,从而跳转到程序的其他部分执行。语法:B <label>,其中<label>是跳转的目标标签。

BL (Branch with Link):这个指令不仅跳转到指定的地址,还将当前指令的下一个指令的地址(即返回地址)保存到链接寄存器(LR,通常是R14)中。这允许在跳转后通过返回指令(如MOV PC, LR)返回到跳转前的位置。语法:BL <label>。

不保存返回地址

jump			
				LDR R3,=0X11111111
				LDR R2,=0X22222222
				LDR R1,=0X33333333
				LDR R0,=0X44444444
main
				LDR R0,=0X11111111
				LDR R1,=0X22222222
				LDR R2,=0X33333333
				LDR R3,=0X44444444
				LDR R4,=0X08000008
				B jump

保存返回地址

jump			
				LDR R3,=0X11111111
				LDR R2,=0X22222222
				LDR R1,=0X33333333
				LDR R0,=0X44444444
				MOV PC,LR
main
				LDR R0,=0X11111111
				LDR R1,=0X22222222
				LDR R2,=0X33333333
				LDR R3,=0X44444444
				LDR R4,=0X08000008
				BL jump
				LDR R0,=0X11111111
				LDR R1,=0X22222222
				LDR R2,=0X33333333
				LDR R3,=0X44444444

作者:不要这样做

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机:数据迁移指令

发表回复