DIX [AR1,P#1.5]
X [AR1,P#1.5] 字串9
DIX可以认为是我们通常定义的地址标识符,DI是背景数据块存储区域,X是这个存储区域的尺寸符,指的是背景数据块中的位。但下面一个示例中的M呢?X只是指定了存储区域的尺寸符,那么存储区域符在哪里呢?毫无疑问,在AR1中! 字串3
DIX [AR1,P#1.5] 这个例子,要寻址的地址区域事先已经确定,AR1可以改变的只是这个区域内的确切地址数值单元,所以我们称之为:区域内寄存器间接寻址方式,相应的,这里的[AR1,P#1.5] 就叫做区域内寻址指针。
X [AR1,P#1.5] 这个例子,要寻址的地址区域和确切的地址数值单元,都未事先确定,只是确定了存储大小,这就是意味着我们可以在不同的区域间的不同地址数值单元以给定的区域大小进行寻址,所以称之为:区域间寄存器间接寻址方式,相应的,这里的[AR1,P#1.5] 就叫做区域间寻址指针。
字串8
既然有着区域内和区域间寻址之分,那么,同样的AR1中,就存有不同的内容,它们代表着不同的含义。 字串6
【AR的格式】 字串4
地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1和AR2,每个32位。
当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是: 字串2
其0-2bit,指定bit位,3-18bit指定byte字节。其第31bit固定为0。
字串1
AR:
0000 0000 0000 0BBB BBBB BBBB BBBB BXXX
这样规定,就意味着AR的取值只能是:0.0 ——65535.7 字串7
例如:当AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),实际上就是等于26.4。
而在区域间寄存器间接寻址中,由于要寻址的区域也要在AR中指定,显然这时的AR中内容肯定于寄存器区域内间接寻址时,对AR内容的要求,或者说规定不同。 字串1
AR:
字串6
1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX 字串4
比较一下两种格式的不同,我们发现,这里的第31bit被固定为1,同时,第24、25、26位有了可以取值的范围。聪明的你,肯定可以联想到,这是用于指定存储区域的。对,bit24-26的取值确定了要寻址的区域,它的取值是这样定义的:
区域标识符 字串1
26、25、24位
P(外部输入输出) 字串2
000 字串9
I(输入映像区)
001 字串4
Q(输出映像区) 字串9
010
M(位存储区) 字串7
011 字串8
DB(数据块) 字串9
100
DI(背景数据块) 字串9
101
L(暂存数据区,也叫局域数据)
111
如果我们把这样的AR内容,用HEX表示的话,那么就有: 字串1
当是对P区域寻址时,AR=800xxxxx 字串5
当是对I区域寻址时,AR=810xxxxx 字串6
当是对Q区域寻址时,AR=820xxxxx
当是对M区域寻址时,AR=830xxxxx
当是对DB区域寻址时,AR=840xxxxx 字串8
当是对DI区域寻址时,AR=850xxxxx 字串2
当是对L区域寻址时,AR=870xxxxx 字串4
经过列举,我们有了初步的结论:如果AR中的内容是8开头,那么就一定是区域间寻址;如果要在DB区中进行寻址,只需在8后面跟上一个40。84000000-840FFFFF指明了要寻址的范围是: 字串1
DB区的0.0——65535.7。 字串4
例如:当AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b),实际上就是等于DBX26.4。
字串2
我们看到,在寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit又是什么呢? 字串8
【P#指针】
字串2
P#中的P是Pointer,是个32位的直接指针。所谓的直接,是指P#中的#后面所跟的数值或者存储单元,是P直接给定的。这样P#XXX这种指针,就可以被用来在指令寻址中,作为一个“常数”来对待,这个“常数”可以包含或不包含存储区域。例如: 字串7
● L P#Q1.0 //把Q1.0这个指针存入ACC1,此时ACC1的内容=82000008(hex)=Q1.0 字串1
★ L P#1.0 //把1.0这个指针存入ACC1,此时ACC1的内容=00000008(hex)=1.0
字串5
● L P#MB100 //错误!必须按照byte.bit结构给定指针。 字串1
● L P#M100.0 //把M100.0这个指针存入ACC1,此时ACC1的内容=83000320(hex)=M100.0
字串4
● L P#DB100.DBX26.4 //错误!DBX已经提供了存储区域,不能重复指定。 字串4
● L P#DBX26.4 //把DBX26.4这个指针存入ACC1,此时ACC1的内容=840000D4(hex)=DBX26.4 字串8
我们发现,当对P#只是指定数值时,累加器中的值和区域内寻址指针规定的格式相同(也和存储器间接寻址双字指针格式相同);而当对P#指定带有存储区域时,累加器中的内容和区域间寻址指针内容完全相同。事实上,把什么样的值传给AR,就决定了是以什么样的方式来进行寄存器间接寻址。在实际应用中,我们正是利用P#的这种特点,根据不同的需要,指定P#指针,然后,再传递给AR,以确定最终的寻址方式。 字串3
在寄存器寻址中,P#XXX作为寄存器AR指针的偏移量,用来和AR指针进行相加运算,运算的结果,才是指令真正要操作的确切地址数值单元! 字串8
无论是区域内还是区域间寻址,地址所在的存储区域都有了指定,因此,这里的P#XXX
只能指定纯粹的数值,如上面例子中的★。 字串3
【指针偏移运算法则】 字串3
在寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit如何参与运算,得出最终的地址呢?
字串2
运算的法则是:AR1和P#中的数值,按照BYTE位和BIT位分类相加。BIT位相加按八进制规则运算,而BYTE位相加,则按照十进制规则运算。 字串6
例如:寄存器寻址指针是:[AR1,P#2.6],我们分AR1=26.4和DBX26.4两种情况来分析。 字串7
当AR1等于26.4,
字串3
AR1:26.2 字串9
+ P#: 2.6
---------------------------
= 29.7 这是区域内寄存器间接寻址的最终确切地址数值单元
当AR1等于DBX26.4, 字串2
AR1:DBX26.2 字串6
+ P#: 2.6
--------------------------- 字串7
= DBX29.7 这是区域间寄存器间接寻址的最终确切地址数值单元 字串8
= 29.7 这是区域内寄存器间接寻址的最终确切地址数值单元
字串1
当AR1等于DBX26.4,
AR1:DBX26.2 字串1
+ P#: 2.6
---------------------------
= DBX29.7 这是区域间寄存器间接寻址的最终确切地址数值单元
【AR的地址数据赋值】
通过前面的介绍,我们知道,要正确运用寄存器寻址,最重要的是对寄存器AR的赋值。同样,区分是区域内还是区域间寻址,也是看AR中的赋值。
字串2
对AR的赋值通常有下面的几个方法:
字串3

