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指令中指明将要操作的域。
指令示例:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。