马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。LDM/STM指令可把存储器中的一个数据块加载到多个寄存器中,也可把多个寄存器中的内容保存到存储器中个。寻址操作中的存储器可以是R0~R15这16个寄存器的子集或所有寄存器。 LDM/STM指令根据其后缀名的不同,其寻址的方式也有很大不同。这些后缀可定义存储器地址的增长是向上还是向下,以及地址的增减与指令操作的先后顺序。具体的寻址方式见表:从表中可以看出,指令分为两组:一组用于数据的存储和读取,对应于IA、IB、DA、DB;一组用于堆栈操作,即进行压栈与出栈操作,对应于FD、ED、FA、EA。两组中对应的指令的含义是相同的,例如指令STMIB与指令STMFA含义相同,只是STMFA针对堆栈进行操作。对堆栈进行操作时,必须先对堆栈进行初始化。
表中对应符号的含义如下: IA 操作完成后地址递增 IB 地址先增而后完成操作 DA 操作完成后地址递减 DB 地址先减而后完成操作 FD 满递减堆栈 ED 空递减堆栈 FA 满递增堆栈 EA 空递增堆栈 下面以图的形式举例说明LDM/STM指令时如何让寻址的。图给出了块拷贝的用法。从图中可以看出,每条指令时如何将3个寄存器的数据存入存储器的,以及在使用自动变址的情况下基址寄存器是如何改变的。执行指令之前基址寄存器为R9,自动变址之后为R9ˊ。需要注意的是,在递增方式下,寄存器存储的顺序是R0、R1、R5;而在递减方式下,寄存器存储的顺序是R5、R1、R0。在这里有一个约定:编号低的寄存器在存储数据或者加载数据时对应于存储器的低地址。也就是说,编号最低的寄存器保存到存储器的最低地址或从最低地址取数,其次是其他寄存器按照寄存器编号的次序保存到第一个地址后后面的相邻地址或从中取数。
下面用2条指令来说明这类指令的用途,它们把8个字从R0指向的位置拷贝到R1指向的位置。 LDMIA R0!{R2-R9} ;将数据家加载到R2~R9 STMIA R1,{R2-R8 ;将数据存入到存储器} 指令执行后,R0的内容增加了32字节,这是由于“!”使之自动变址8个字,而R1没有改变;可见,由于“!”的存在地质寄存器自动变址,基址寄存器的内容保持更新,但是如果没有“!”,当指令执行完成后,基址寄存器的值还是初始值。如果R2~R9含有有用的数据,则可把它们压入堆栈,从而在操作过程中把他们保存起来。 STMFD R13!,{R2-R9} ;将寄存器内容存入堆栈,下面要用到寄存器 LDMIA R0!,{R2-R9} ;加载数据到R2~R9,寄存器中原有的数据
;遭到破坏
STMIA R1!,{R2-R9} ;保存数据到R1指向的地址 LDMFD R13!,{R2-R9} ;从堆栈中恢复 这里第一行和最后一行指令的后缀FD表示前面所述的满递减堆栈地址模式。注意,在堆栈操作中总是要指定自动变址,否则以前保存的内容会因为堆栈寄存器的基址不变将在下一次堆栈操作时遭到破坏。 多寄存器的存取指令为保存和恢复处理器状态以及在存储器中移动数据块提供了一种很有效的方式。它节省代码空间,使操作的速度比顺序执行等效的单寄存器存取指令快达4倍。(因改善后续行为而提高2倍,因减少指令数提高将近2倍)。 相对寻址 相对寻址可认为是基地址为程序计数器PC的变址寻址,偏移量指出了目的地址与现行指令之间的相对位置,偏移量与PC提供的基地址相加后得到有效的目的地址。 例如: BL SUBR ;转移到SUBR
;返回到此
SUBR ;子程序入口地址 MOV PC,R14 ;返回 凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网
|