在先前所说的存储器间接寻址中,间接指针用M、DB、DI和L直接指定,就是说,指针指向的存储区内容就是指令要执行简直切地址数值单位。但在 寄存器 间接寻址中,指令要执行简直切地址数值单位,并非寄存器指向的存储区内容,也就是说,寄存器自己也是间接的指向真正的地址数值单位。从寄存器到得出真正的地址数值单位,西门子提供了两种途径:
1、区域内寄存器间接寻址
2、区域间寄存器间接寻址
地址寄存器间接寻址的一样平常名堂是:
〖地址标识符〗〖寄存器,P#byte.bit〗,好比:DIX[AR1,P#1.5] 或 M[AR1,P#0.0] 。
〖寄存器,P#byte.bit〗统称为:寄存器寻址指针,而〖地址标识符〗在上帖中谈过,它包括〖存储区符〗+〖存储区尺寸符〗。但在这里,情形有所转变。较量一下适才的例子:
DIX [AR1,P#1.5]
X [AR1,P#1.5]
DIX可以以为是我们通常界说的地址标识符,DI是配景数据块存储区域,X是这个存储区域的尺寸符,指的是配景数据块中的位。但下面一个示例中的M呢?X只是指定了存储区域的尺寸符,那么存储区域符在那里呢?毫无疑问,在AR1中!
DIX [AR1,P#1.5] 这个例子,要寻址的地址区域事先已经确定,AR1可以改变的只是这个区域内简直切地址数值单位,以是我们称之为:区域内寄存器间接寻址方法,响应的,这里的[AR1,P#1.5] 就叫做区域内寻址指针。
X [AR1,P#1.5] 这个例子,要寻址的地址区域和确切的地址数值单位,都未事先确定,只是确定了存储巨细,这就是意味着我们可以在差别的区域间的差别地址数值单位以给定的区域巨细举行寻址,以是称之为:区域间寄存器间接寻址方法,响应的,这里的[AR1,P#1.5] 就叫做区域间寻址指针。
既然有着区域内和区域间寻址之分,那么,同样的AR1中,就存有差别的内容,它们代表着差别的寄义。
【AR的名堂】
地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1和AR2,每个32位。
当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单位,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是:
其0-2bit,指定bit位,3-18bit指定byte字节。其第31bit牢靠为0。
AR:
0000 0000 0000 0BBB BBBB BBBB BBBB BXXX
这样划定,就意味着AR的取值只能是:0.0 ——65535.7
例如:当AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),现实上就是即是26.4。
而在区域间寄存器间接寻址中,由于要寻址的区域也要在AR中指定,显然这时的AR中内容一定于寄存器区域内间接寻址时,对AR内容的要求,或者说划定差别。
AR:
1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX
较量一下两种名堂的差别,我们发明,这里的第31bit被牢靠为1,同时,第24、25、26位有了可以取值的规模。智慧的你,一定可以遐想到,这是用于指定存储区域的。对,bit24-26的取值确定了要寻址的区域,它的取值是这样界说的:
区域标识符
26、25、24位
P(外部输入输出)
000
I(输入映像区)
001
Q(输出映像区)
010
M(位存储区)
011
DB(数据块)
100
DI(配景数据块)
101
L(暂存数据区,也叫局域数据)
111
若是我们把这样的AR内容,用HEX体现的话,那么就有:
当是对P区域寻址时,AR=800xxxxx
当是对I区域寻址时,AR=810xxxxx
当是对Q区域寻址时,AR=820xxxxx
当是对M区域寻址时,AR=830xxxxx
当是对DB区域寻址时,AR=840xxxxx
当是对DI区域寻址时,AR=850xxxxx
当是对L区域寻址时,AR=870xxxxx
经由枚举,我们有了起源的结论:若是AR中的内容是8开头,那么就一定是区域间寻址;若是要在DB区中举行寻址,只需在8后面跟上一个40。84000000-840FFFFF指明晰要寻址的规模是:
DB区的0.0——65535.7。
例如:当AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b),现实上就是即是DBX26.4。