男性不孕要检查多久:关于CM3的指令系统详解

来源:百度文库 编辑:偶看新闻 时间:2024/05/04 09:27:08
现在感觉一些同学学习直接就从C语言开始走了,对于底层的一些操作不关心。但我一直认为无论学习什么MCU都应该先从汇编开始,对底层要有一定的了解。至少我们应该能清楚,对于一些底层知识应该知道,对于一个汇编代码应该可以读走。。。这样对于底层指令的实现有很大的帮助了。。。。。。
为了帮助一些同学,我将本人学习的一些资料和自己的总结上出来。。。。
ARM的寻址方式:9种(立即、寄存器、寄存器间接、寄存器偏移、基址变址、多寄存器、堆栈、块拷贝、相对)
所谓寻址方式:就是根据指令中给出的地址的方式来选择相应的方法找出物理地址的手段。
1.立即寻址(立即数寻址)
利用#号对一些常数进行操作,这里的操作就是将这些以#号开始的数据送到一些寄存器中。它是最简单的一种寻址方式。
MOV R0,#0X0A
MOV R1,#'A'
ADD R0,R1,#0X01   ;寄存器R1中的数据加上常数0X01再送到目的寄存器R0当中
2.寄存器操作(直接对寄存器里的数据进行操作的一种寻址方式)
由于寄存器执行的速度快,所以这种执行方式的效率也是相当高的。这种寻址方式也比较简单。
SUB R0,R1,R2
3.寄存器间接寻址(所谓寄存器间接寻址就是将寄存器当中的值作为一个存储器的地址单元来用的一种寻址方式

其实该寻址方式是将寄存器操作和存储器的操作结合在一起用。名称比较长,但操作比较简单。
ADD R0,R1,[R2];这条指令的意思就是将R1中的数据加上以R2中的数据为地址的存储单元的当中的数据得到的和送到目的寄存器R0中。
LDR R0,[R1] ;这条指令的目的就是以R1中的数据为地址的存储单元中的数据送到加载到寄存器R0中。
STR R0,[R2];这条指令的目的就是将R0中的数据存储到以R2中的数据为地址的存储单元当中。
4.基址变址寻址(这条指令看着头晕,不过认真了解还是简单,就是以一个寄存器当中的数据为基址加上一个偏移量(这个偏移量可以由相应的寄存器提供也可以由立即数提供)得到一个有效的地址的一种寻址方式)
LDR R0,[R1,#4];这条指令的意思就是以R1中的数据为基地址加上偏移地址4得到一个有效的存储单元地址,将这个地址中的数据加载到R0中。
LDR R0,[R1,#4]!;看着这条指令,你会发现与上面这条指令很相似啊,的确,不过区别就大了,上面这条指令的最后没有感叹号的,所以R1中的数据是不会变的。但在本条指令中,当我们将数据加载到R0了后,R1中的数据就变为R1中原来的数据加上4;
LDR R0,[R1],#4;这条指令和上面两条都很像,这条指令的意思是将R1中的数据作为存储地址的存储单元中的数据加载到R0,然后R1中的数据加4.
5.多寄存器寻址(意思很明显了,就是操作多个寄存器,但是有上限的,最多传送16个通用寄存器的值 )
LDMIA R0,{R1,R2,R3,R4};意思就是将寄存器R0中的数据作为地址的这个存储单元中的值送到R1中,然后将R0中的值加4作为地址的存储单元中的值送到R1。。。。
弱弱说下:这个操作我最喜欢 。。。。
后缀IA表示,每次加载/存储完成后,R0按字长增长值。
6.相对寻址(就是一种特殊的基址变址寻址了,不知大家发现没有)
BL NEXT
BL就是一条相对寻址的指令 ,NEXT在这里就是一处符号地址。相对寻址就是以PC中的值作为基址,在这条指令中,就是以当前的PC值为基址再加上NEXT所代表的偏移量得到一个有效的地址送到PC中,

7.堆栈寻址(FILO就是数据进出堆栈的规则,不像消息队列、UART协议中的数据FIFO等规则)
在这里必须要知道满堆栈与空堆栈在定义上的区别:
满堆栈:SP指向最后入栈的数据的堆栈。
空堆栈:SP指向下一个将要放入数据的空位置。
ARM MCU支持下面四种堆栈工作模式:
满递增堆栈:SP指向最后入栈的数据,由低地址向高地址生成;
满递减堆栈:SP指向最后入栈的数据,由高地址向低地址生成;
空递增堆栈:SP指向要放入数据的下一个空位置,由低地址向高地址生成;
空递减堆栈:SP指向要放入数据的下一个空位置,由高地址向低地址生成;

8.寄存器偏移寻址(这条指令当中加入了相应的偏移指令实现数据的变化而得到一个新的地址的寻址方式)
MOV R0,R2,LSL,#3 ;这条指令的意思就是将R2左移三位,然后送到R0中。
ADDS R1,R1,R2,LSL,R3;将R2中的数据左移R3中的数据表示的位数后,加上R1再送到R1,并且影响状态标志;

9.块拷贝寻址(实际上就是从堆栈的角度实现多寄存器的传送指令 )
这也是最复杂的一条寻址方式。
多寄存器传送指令用于把一块数据从存储器的某一位置拷贝到另一个位置。ARM支持两种不同角度的寻址机制,两者都是映射到相同的基本指令。块拷贝角度即基于数据是存储在基址寄存器的地址之下还是之上,地址是在存储第一个值之前还是之后增加还减少。两种角度的映射取决操作是加载还是存储。