西门子间接寻址(二) |
时间: 2021-07-21 08:37 浏览: |
详解西门子间接寻址(二)【址寄存器间接寻址】先前所说存储器间接寻址中,间接指针用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(外部输入输出)000I(输入映像区)001Q(输出映像区)010M(位存储区)011DB(数据块)100DI(背景数据块)101L(暂存数据区,也叫局域数据)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。我们看到,寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit又是什么呢? 【P#指针】P#中P是Pointer,是个32位直接指针。所谓直接,是指P#中#后面所跟数值存储单元,是P直接给定。这样P#XXX这种指针,就可以被用来指令寻址中,作为一个“常数”来对待,这个“常数”可以包含或不包含存储区域。例如:● L P#Q1.0 //把Q1.0这个指针存入ACC1,此时ACC1内容=82000008(hex)=Q1.0★ L P#1.0 //把1.0这个指针存入ACC1,此时ACC1内容=00000008(hex)=1.0● L P#MB100 //错误!必须byte.bit结构给定指针。● L P#M100.0 //把M100.0这个指针存入ACC1,此时ACC1内容=83000320(hex)=M100.0● L P#DB100.DBX26.4 //错误!DBX已经提供了存储区域,不能重复指定。● L P#DBX26.4 //把DBX26.4这个指针存入ACC1,此时ACC1内容=840000D4(hex)=DBX26.4我们发现,当对P#指定数值时,累加器中值和区域内寻址指针规定格式相同(也和存储器间接寻址双字指针格式相同);而当对P#指定带有存储区域时,累加器中内容和区域间寻址指针内容完全相同。事实上,把什么样值传给AR,就决定了是以什么样方式来进行寄存器间接寻址。实际应用中,我们正是利用P#这种特点,不同需要,指定P#指针,然后,再传递给AR,以确定最终寻址方式。寄存器寻址中,P#XXX作为寄存器AR指针偏移量,用来和AR指针进行相加运算,运算结果,才是指令真正要操作确切址数值单元!是区域内区域间寻址,址所存储区域都有了指定,,这里P#XXX只能指定纯粹数值,如上面例子中★。 【指针偏移运算法则】寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit如何参与运算,出最终址呢?运算法则是:AR1和P#中数值,BYTE位和BIT位分类相加。BIT位相加按八进制规则运算,而BYTE位相加,则十进制规则运算。例如:寄存器寻址指针是:[AR1,P#2.6],我们分AR1=26.4和DBX26.4两种情况来分析。当AR1等于26.4,AR1:26.2+ P#:2.6---------------------------= 29.7 这是区域内寄存器间接寻址最终确切址数值单元当AR1等于DBX26.4,AR1:DBX26.2+ P#:2.6---------------------------= DBX29.7 这是区域间寄存器间接寻址最终确切址数值单元 【AR址数据赋值】前面介绍,我们知道,要正确运用寄存器寻址,最重要是对寄存器AR赋值。同样,区分是区域内区域间寻址,也是看AR中赋值。对AR赋值通常有下面几个方法:1、直接赋值法例如:L DW#16#83000320LAR1可以用16进制、整数二进制直接给值,但必须确保是32位数据。赋值AR1中既存储了址数值,也指定了存储区域,这时寄存器寻址方式肯定是区域间寻址。2、间接赋值法例如:L [MD100]LAR1可以用存储器间接寻址指针给定AR1内容。具体内容存储MD100中。3、指针赋值法例如:LAR1 P#26.2使用P#这个32位“常数”指针赋值AR。总之,使用哪种赋值方式,AR存储数据格式有明确规定,,都要赋值前,确认所赋值是否符合寻址规范。 |
上一篇:保护装置跳闸后的逻辑讲解 下一篇:西门子间接寻址(三) |