所谓寻址方式,指的是CPU去获取一个操作数的方式,可以是从指令中获取立即数、可以是从寄存器中获取,也可以是从内存中获取。
目录
1、立即数寻址
2、寄存器寻址
3、寄存器移位寻址
4、寄存器间接寻址
5、基址加变址寻址
(1) 前向索引(先自增地址,再执行指令)
(2) 后向索引(先执行指令,再自增地址)
1、立即数寻址
立即数寻址指的是从指令中获取数据,比如
MOV R1,#1 @ 1 是立即数,生成二进制机器码以后,会被保存在指令中
CPU从内存拿到指令(二进制机器码)以后,直接从指令中取出操作数,也就是说参与运算的数来自于机器码,这种方式称为“立即寻址”。
2、寄存器寻址
顾名思义,寄存器寻址指的是参与运算的数据来自于其他寄存器。
ADD R1, R2, R3 @ 参与运算的两个数分别来自于R1寄存器和R2寄存器
3、寄存器移位寻址
寄存器里的数据并不是直接参与运算,而是参与运算的数据先经过移位,然后再参与运算
MOV R1, R2, LSL #1 @ 先将R2寄存器的数据左移1位,然后再保存到R1寄存器中
注意:MOV指令的操作位只有两位,这里要把 R2, LSL #1 看作一个整体
4、寄存器间接寻址
之所以称之为“间接”,是因为寄存器里保存的是地址,不直接参与运算,通过地址来操作内存,取出数据参与运算。
STR R1,[R2] @ 并不是用R2这个寄存器来参与运算,只是用R2寄存器里保存的内容来操作内存
5、基址加变址寻址
下面以STR指令为例。
(1) 前向索引(先自增地址,再执行指令)
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
STR R1, [R2, #8] @ 将 R1 寄存器的数据保存到 R2+8 的地址位置
这里是先让 R2的地址临时自增8,然后将R1寄存器的数据保存到内存中 R2+8 的位置。R2寄存器保存的地址不受影响。
如果要改变R2寄存器中的地址,需要在指令末尾加 “ ! ”,注意是英文字符
(2) 后向索引(先执行指令,再自增地址)
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
STR R1, [R2], #8 @ 将 R1 寄存器的数据保存到 R2 的地址位置,然后让R2自增8
这里是先执行保存指令,然后让R2寄存器中的地址自增。