| |
基址加偏址寻址也称为变址寻址,就是将基址寄存器的内容与指令中给出的偏移量相加,形成存储器的有效地址,用于访问基址附近的存储器单元。寄存器间接寻址实质是偏移量为0的基址加偏移寻址,这种寻址方式有很高的执行效率且编程技巧很高,如果结合条件标志码,可编出短小但功能强大的汇编程序。
指令可在系统存储器合理的范围内基址上加上不超过4KB的偏移量来计算传送地址。
变址寻址方式可为前变址、自动变址和后变址寻址方式。
1.前变址模式
这是一个前变址的模式,也就是说,R1(基址寄存器)存放的地址先变化,然后执行指令的操作。采用这种模式可使用一个基址寄存器来访问位于同一区域的多个存储器单元。这条指令把基址R1的内容加上位移量为4后,所指向的存储单元送到寄存器R0.
1. 自动变址模式
有时为了修改寄存器的内容,使之指向数据传送地址,可使用带有自动变址的前变址寻址来实现基址寄存器自动修改,这样可让程序追踪一个数据表。例如:
; R0<- [R1+4]
惊叹号“!”表示在完成数据传送后将更新基址寄存器,更新的方式是每执行完一次操作,基址寄存器自动加上前变址的字节数。在本例中每执行完一次操作,R1的内容加4.在ARM中自动变址并不花费额外的时间,因为这个过程是在数据从寄存器中取出的同时在处理器的数据路径中完成的。它严格地等效于先执行一条简单的寄存器间接取数指令,再执行一条数据处理指令向基址寄存器加一个偏移量,但避免了额外的指令时间和代码空间开销,即ARM的这种自动变址不消耗额外的时间。
2. 后变址模式
后变址寻址模式时基址寄存器的内容在完成操作后发生变化。其实质是基址寄存器不加偏移作为传送地址使用,完成操作后再加上立即数偏移量来变化基址寄存器内容。
; R0<- R1+4
在此惊叹号不再需要,因为立即数偏移量的唯一用途是作为基址寄存器修改量。执行上面的 指令先将R1中内容所对应的存储器中内容读到R0中,然后R1加4,预备下一次的数据读/写。这种形式的指令完成的功能等效于简单的寄存器间接寻址取数,再加一条改变地址的数据处理指令,显然它具有较高的实现效率。
以下是使用后变址寻址形式来完成表拷贝程序:
COPY ADR R1,TABLE1 ;R1指向TABLE1
ADR R2,TABLE2 ;R2指向TABLE2
LOOP LDR R0,[R1],#4 ;取TABLE1第一个数据
STR R0,[R1],#4 ;拷贝到TABLE2
;若拷贝多字,则返回LOOP
…
TABLE1 ;<数据源>
…
TABLE2 ;<目标>
3. 偏移地址
在以上的例子中寄存器的地址寄存器的地址偏移一直是一个立即数。它同样可以是另一个寄存器,并且在加到基址寄存器前还可经过移位操作。例如:
LDR R0,[R1,R2,LSL #2];R0<-[R1+R2*4]
但常用的是立即数偏移的形式,地址偏移为寄存器形式的指令很少使用。
4. 传送数据类型
ARM处理器支持的传送数据类型可以是有符号和无符号的8位字节、16位字节和32位字节,最高位表示该值是作为正数处理还是作为负数处理。对于字节操作,在指令中增加一个字母B选择字节操作,增加一个字母H选择半字操作,不加则选择子操作。例如:
;加载8位字节到寄存器R0,零扩展到32位
LDRH R1,[R0,#20] ; R0<-[R0+20]
;加载16位半字到寄存器R1,零扩展到32位
在这种情况下,传送的地址可与任意字节、半字对齐,而不限于4字节的字分界处。
凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网