前变址、回写前变址、后变址

        根据数据传输传输的时机以及在指令执行后基址寄存器是否被更新,寄存器变址有前变址、回写前变址和后变址暗中方式。
        执行指令的时候,如果先进行变址运算,后传递数据,那么这种方式就是前变址方式。如图1所示 

前变址、回写前变址、后变址_第1张图片

例如:LDR R0,[R1,R2]          ;R0<-((R1)+(R2))
           LDR R0,[R1,#8]          ;R0<-((R1)+8)
以上就是利用前变址方式提供数据操作命令。
与上面相反,先传输数据,后进行变址的运算的方式叫做后变址方式,从指令格式上来看,后变址指令的格式如下:
    LDR R0,[R1],#8                ;R0<-((R1))        R1<-((R1)+#8)
即将偏移量写在了方括号外边。后变址指令的执行过程如图2。

前变址、回写前变址、后变址_第2张图片

很容易看出后变址就是先把基址寄存器指向的内存数据传输到目标寄存器,然后进行基址与偏移量的加法运算。
从上面的过程还可以看出,后变址与前变址的一个重要的区别:后变址用变址运算的结果更新了基址寄存器,这就是所谓的“回写”。
显然回写是一种很有用的功能,因此ARM在前变址方式中又增加了一种回写前变址的寻址方式。为了与前变址方式进行区别,回写前变址寻址方式要求在第2操作数的方括号后边添加符号“!”。
    例如:LDR R0,[R1,R2]!        ;R1<-((R1)+(R2))     R0<-((R1))
               LDR R0,[R1,#8]!        ;R1<-((R1)+8)        R0<-((R1))
写回前变址寻址方式指令执行过程如图3所示。

前变址、回写前变址、后变址_第3张图片


你可能感兴趣的:(ARM学习,前变址寻址,后变址寻址,回写前变址寻址)