在讲解寻址方式之前,我们首先应该了解的是指令的结构,有目的操作数和源操作数组成。格式:指令 目的操作数,源操作数
例如: MOV A,R0
这个意思所要表达的是将寄存器R0里的内容复制到累加器A中,其实这也是我接下来要说的一种寻址方式,寄存器寻址。一般我们把目的操作数放在左边,源操作数放在右边。
接下来我开始逐个讲解7个寻址方式。
1、立即寻址
定义:立即寻址就是操作数在指令中直接给出,也就是指令的地址即操作数的地址,因此把这种方式称为立即寻址,该操作数称为立即数。为了表示指令中的立即数,在操作数前面加“#”标志。
例如:MOV A,#90H
这条指令的功能是把90H这个数据送到累加寄存器A里。
理解:其实只要看见“#”,我们就可以直接判断出这个指令为立即寻址。当出现“#”时,90H不是表示地址,而是表示一个数。
2、寄存器寻址
定义:寄存器寻址就是操作数在寄存器中,因此形式地址就是一个寄存器名,指定了寄存器就可以得到操作数。
例如:MOV A,R1
这条指令的功能就是把寄存器R1里的数据复制到累加寄存器A中。
理解 :我们可以把R1想象成一个电脑文件,我把这个文件命名为“R1”,把A想象成另一个文件,把他命名为“A”,MOV的过程其实就相当于把文件R1里的内容复制到文件A中。
3、直接寻址
定义:直接寻址的操作数在内存单元中,在指令中操作数直接以内存单元的地址的形式给出。
例如:MOV A,56H
这条指令的功能是将56H中的数据复制到累加寄存器A中。
理解:在这里大家要注意的是,这里的56H并不是数据,而是一个内部RAM内存单元,它与寄存器寻址方式是不相同的。寄存器寻址是将寄存器里的数据复制给累加寄存器A,而直接寻址是将内部RAM内存单元里的数据复制到累加寄存器A中。它的功能其实与间接寻址类似。
4、寄存器间接寻址(间接寻址)
定义:寄存器中存放的是操作数的地址,我们称之为寄存器间接寻址,即操作数是通过寄存器间接得到的。
例如:MOV A,@R0
此功能是将R0中地址的地址中的数据复制到累加寄存器A中。
理解:
这个寻址方式稍稍微有点绕,但不过还好。从定义我们可以知道寄存器中存放的不是数据,而是一个地址,我把这个过程给分解一下,就拿上面的例子来说,寄存器R0中存放了一个地址50H,而这个地址50H中还有一个数据56H,那么@的过程就是将这个56H复制给累加寄存器A。其实这就像是C语言中的指针一样。
再形象一点就是,我们要找一个学生,首先肯定是要先去他的学校,再去他的班级,这不就找到他了嘛,这其实就是一个地址的嵌套。
5.相对寻址
定义:相对寻址是把指令中给定的地址的偏移量与PC的当前值相加,得到真正的程序转移地址。相对寻址方式主要是解决程序转移而专门设置的。
例如:JC 80H
这个功能是若C = 0,则PC