西门子间接寻址(三) |
时间: 2021-07-22 08:38 浏览: |
详解西门子间接寻址(三) 使用间接寻址主要目,是使指令执行结果有动态变化,简化程序是第一目,某些情况下,这样寻址方式是必须,比如对某存储区域数据遍历。此外,间接寻址,还可以使程序更具柔性,换句话说,可以标准化。下面实例应用来分析如何灵活运用这些寻址方式,实例分析过程中,将对前面帖子中笔误、错误和遗漏做纠正和补充。 【存储器间接寻址应用实例】我们先看一段示例程序:L 100T MW 100 // 将16位整数100传入MW100L DW#16#8 // 加载双字16进制数8,当把它用作双字指针时,BYTE.BIT结构,结果演变过程就是:8H=1000B=1.0T MD 2 // MD2=8HOPN DB [MW 100] // OPN DB100L DBW [MD 2] // L DB100.DBW1T MW[MD2] // T MW1A DBX [MD 2] // A DBX1.0= M [MD 2] // =M1.0这个例子中,我们中心思想其实就是:将DB100.DBW1中内容传送到MW1中。这里我们使用了存储器间接寻址两个指针——单字指针MW100用于指定DB块编号,双字指针MD2用于指定DBW和MW存储区字址。事实上,从这个例子中心思想来看,根本没有必要如此复杂。但为什么要用间接寻址呢?要澄清使用间接寻址优势,就让我们从比较中,找答案吧。例子告诉我们,它最终执行是把DB某个具体字数据传送到位存储区某个具体字中。这是针对数据块1001数据字传送到位存储区第1字中具体操作。我们现需要对同样数据块多个字(连续不连续)进行传送呢?直接方法,就是一句一句写这样具体操作。有多少个字传送,就写多少这样语句。毫无疑问,不知道间接寻址道理,也应该明白,这样编程方法是不合理。而使用间接寻址方法,语句就简单多了。 【示例程序结构分析】我将示例程序从结构上做个区分,重新输入如下:=========================== 输入1:指定数据块编号变量|| L 100|| T MW 100===========================输入2:指定字址变量|| L DW#16#8|| T MD 2===========================操作主体程序OPN DB [MW 100]L DBW [MD 2]T MW[MD2]显然,我们根本不需要对主体程序(红色部分)进行简单而重复复写,而只需改变MW100和MD2赋值(绿色部分),就可以完成应用要求。结论:对间接寻址指针内容修改,就完成了主体程序执行结果变更,这种修改是可以是动态和静态。正是对真正目标程序(主体程序)不做任何变动,而寻址指针是这个程序中唯一要修改方,可以认为,寻址指针是主体程序入口参数,就好比功能块输入参数。可使程序标准化,具有移植性、通用性。那么又如何动态改写指针赋值呢?不会是另一种简单而重复复写吧。让我们以一个具体应用,来完善这段示例程序吧:将DB100中1-11数据字,传送到MW1-11中设计完成这个任务程序之前,我们先了解一些背景知识。 【数据对象尺寸划分规则】数据对象尺寸分为:位(BOOL)、字节(BYTE)、字(WORD)、双字(DWORD)。这似乎是个简单概念,但,MW10=MB10+MB11,那么是说,MW11=MB12+MB13?你回答是肯定,我建议你继续看下去,不要跳过,这里疏忽,会导致最终程序错误。按位和字节来划分数据对象大小时,是以数据对象bit来偏移。这句话就是说,0bit后就是1bit,1bit后肯定是2bit,以此类推直到7bit,完成一个字节大小指定,再有一个bit偏移,就进入下一个字节0bit。而按字和双字来划分数据对象大小时,是以数据对象BYTE来偏移!这就是说,MW10=MB10+MB11,并说,MW11=MB12+MB13,正确是MW11=MB11+MB12,然后才是MW12=MB12+MB13!这个概念重要性,你程序中使用了MW10,那么,就不能对MW11进行任何操作,,MB11是MW10和MW11交集。 也就是说,“将DB100中1-11数据字,传送到MW1-11中”这个具体任务而言,我们只需要对DBW1、DBW3、DBW5、DBW7、DBW9、DBW11这6个字进行6次传送操作即可。这就是单独分出一节,说明数据对象尺寸划分规则这个看似简单概念目所。 【循环结构】要“将DB100中1-11数据字,传送到MW1-11中”,我们需要将指针内容顺序逐一指向相应数据字,这种对指针内容动态修改,其实就是遍历。遍历,最简单莫过于循环。一个循环包括以下几个要素:1、初始循环指针2、循环指针自加减2、继续退出循环体条件判断被循环程序主体必须位于初始循环指针之后,和循环指针自加减之前。比如:初始循环指针:X=0循环开始点M被循环程序主体:-------循环指针自加减:X+1=X循环条件判断:X≤10 ,False:GO TO M;True:GO TO N循环退出点N把X作为间接寻址指针内容,对循环指针操作,就等于对寻址指针内容动态而循环修改了。 【将DB100中1-11数据字,传送到MW1-11中】L L#1 //初始化循环指针。这里循环指针就是我们要修改寻址指针T MD 102M2: L MD 102T #COUNTER_DOPN DB100L DBW [MD 102]T MW [MD 102]L #COUNTER_DL L#2 // +2,是数据字偏移基准是字节。+DT MD 102 //自加减循环指针,这是动态修改了寻址指针关键L L#11 //循环次数=n-1。n=6。这是,首次进入循环是无条件,但已事实上执行了一次操作。<=DJC M2有T MD102 ,L L#11, <=D详细分析,请前面内容推导。 【将DB1-10中1-11数据字,传送到MW1-11中】这里增加了对DB数据块寻址,使用单字指针MW100存储寻址址,同样使用了循环,嵌套数据字传送循环外,这样,要完成“将DB1-10中1-11数据字,传送到MW1-11中”这个任务 ,共需要M1循环10次 ×M2循环6次 =60次。L 1T MW 100L L#1T MD 102M1: L MW 100T #COUNTER_WM2: 对数据字循环传送程序,同上例L #COUNTER_WL 1 //这里数据字偏移,编号简单递增,+1+IT MW 100L 9 //循环次数=n-1,n=10<=IJC M1示例分析,程序是让寻址指针对要操作数据对象范围内进行遍历来编程,完成这个任务。我们看到,这种对存储器间接寻址指针遍历是基于字节和字,如何对位进行遍历呢?这就是下一个要分析寄存器间接寻址实例内容了。 |
上一篇:西门子间接寻址(二) 下一篇:做电工一定要有过硬的技术 |