首页 理论教育 STM系列单片机的数据传送类指令

STM系列单片机的数据传送类指令

时间:2023-11-23 理论教育 版权反馈
【摘要】:1)两个寄存器间传送数据MOV指令、MVN指令MOV R8,R3;R8=R3MVN R8,R3;R8=-R32)寄存器与存储器间传送数据存储器到寄存器传送LDRx指令、LDMxy指令;LDR指令的应用举例1:链表操作链表的元素包括2个字,第一个字包含一个字节数据,第2个字包含指向下一个链表元素的指针。3)寄存器与特殊功能寄存器间传送数据MRS指令,MRS指令的格式为:MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。

STM系列单片机的数据传送类指令

1)两个寄存器间传送数据

MOV指令、MVN指令

MOV R8,R3; R8=R3

MVN R8,R3; R8=-R3(按位取反)

2)寄存器与存储器间传送数据

(1)存储器到寄存器传送

LDRx指令、LDMxy指令;

LDR指令的应用举例1:链表操作

链表的元素包括2个字,第一个字包含一个字节数据,第2个字包含指向下一个链表元素的指针。执行前R0指向链表头,R1放要搜索的数据;执行后R0指向第一个匹配的元素。llsearch ;标号,代表入口

条件后缀根据标志位确定,例CMPNE R1,R2在Z==0,即不相等时才执行比较。

LDR指令的应用举例2:简单的串比较

执行前R0指向第一个串,R1指向第二个串;执行后R0保存比较结果。

LDR指令的应用举例3:长跳转

通过直接向PC寄存器中读取字数据,程序可以实现4 GB的长跳转。

(2)寄存器到存储器传送

STRx指令、STMxy指令

LDR.W R0,[R1,#20]! ;预索引

上面语句的意思是先把地址R1+20处的值加载到R0,然后,R1=R1+20。

STR.W R0,[R1],#-12 ;后索引

把R0的值存储到地址R1处。完毕后,R1=R1+(-12)。注意,[R1]后面是没有“!”的。在后索引中,基址寄存器是无条件被更新的。

LDMxy指令和STMxy指令可以一次传送更多的数据。

X可以为I或D,I表示自增(Increment),D表示自减(Decrement)。

Y可以为A或B,表示自增或自减的时机是在每次访问前(Before)还是访问后(After)。

说明:STR C,D ;C->D;op1为寄存器,op2为存储器LDR C,D ;D->C;op1为寄存器,op2为存储器STM C,D ;D->C;op1为存储器,op2为寄存器LDM C,D ;C->D;op1为存储器,op2为寄存器

这里需要特别注意“!”的含义,它表示要自增(Increment)或自减(Decrement)基址寄存器Rd的值,时机是在每次访问前(Before)或访问后(After)。比如:

假设R8=0x8000,则

批量指令应用举例1:简单块复制(www.xing528.com)

BLO loop ;LO为条件小于,注意不是零,是字母“O”

批量指令应用举例2:子程序入/出的数据保护和恢复

function

STMFD R13!,{R4-R12,R14};保存寄存器数据到堆栈,FD满递减堆栈

插入函数体

LDMFD R13!,{R4-R12,R14};从堆栈中恢复寄存器

(3)堆栈操作

将部分或全部寄存器的值压入堆栈

PUSH{寄存器列表} ;每个寄存器压入堆栈,会使SP减4

压入LR意味着保存了返回地址

示例:

PUSH{r1,r2,LR}

从堆栈中弹出部分或全部寄存器的值

POP{寄存器列表} ;每弹出一个寄存器的值,会使SP加4

如果弹出的值给PC,当POP指令执行后,程序将转移到新的PC位置处执行。

3)寄存器与特殊功能寄存器间传送数据

MRS指令,MRS指令的格式为:

MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用于以下两种情况:

当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。

当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。

指令示例:

MSR指令.MSR指令的格式为:

MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。

指令示例:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈