品牌:SKIIP83AC128IST1
发货:3天内
信息标签:SKIIP83AC128IST1,库存,代理,库存产品代理
SKIIP83AC128IST1 【示例程序的结构分析】
西门康模块代理
程先生 139 188 64473 qq:937926739
我将示例程序从结构上做个区分,SKIIP83AC128IST1重新输入如下:
=========================== 输入1:指定数据块编号的变量
|| L 100
SKIIP83AC128IST1
|| T MW 100
===========================输入2:指定字地址的变量
|| L DW#16#8 SKIIP83AC128IST1
|| T MD 2
===========================操作主体程序
OPN DB [MW 100]
L DBW [MD 2]
T MW[MD2]
显然,我们根本不需要对主体程序(红色部分)进行简单而重复的复写,而只需改变MW100和MD2的赋值(绿色部分),就可以完成应用要求。
结论:通过对间接寻址指针内容的修改,就完成了主体程序执行的结果变更,这种修改是可以是动态的和静态的。
SKIIP83AC128IST1
正是由于对真正的目标程序(主体程序)不做任何变动,而寻址指针是这个程序中**要修改的地方,可以认为,寻址指针是主体程序的入口参数,就好比功能块的输入参数。因而可使得程序标准化,具有移植性、通用性。
那么又如何动态改写指针的赋值呢?不会是另一种简单而重复的复写吧。
SKIIP83AC128IST1
让我们以一个具体应用,来完善这段示例程序吧:
将DB100中的1-11数据字,传送到MW1-11中
在设计完成这个任务的程序之前,我们先了解一些背景知识。
【数据对象尺寸的SKIIP83AC128IST1划分规则】
数据对象的尺寸分为:位(BOOL)、字节(BYTE)、字(WORD)、双字(DWORD)。这似乎是个简单的概念,但如果,MW10=MB10+MB11,那么是不是说,MW11=MB12+MB13?如果你的回答是肯定的,我建议你继续看下去,不要跳过,因为这里的疏忽,会导致**终的程序的错误。
按位和字节来划分数据对象大小时,SKIIP83AC128IST1是以数据对象的bit来偏移。这句话就是说,0bit后就是1bit,1bit后肯定是2bit,以此类推直到7bit,完成一个字节大小的指定,再有一个bit的偏移,就进入下一个字节的0bit。
而按字和双字来划分数据对象大小时,是以数据对象的BYTE来偏移!这就是说,MW10=MB10+MB11,并不是说,MW11=MB12+MB13,正确的是MW11=MB11+MB12,然后才是MW12=MB12+MB13!
SKIIP83AC128IST1
这个概念的重要性在于,如果你在程序中使用了MW10,那么,就不能对MW11进行任何的操作,因为,MB11是MW10和MW11的交集。
也就是说,对于“将DB100中的1-11数据字,传送到MW1-11中”这个具体任务而言,我们只需要对DBW1、DBW3、DBW5、DBW7、DBW9、DBW11这6个字进行6次传送操作即可。这就是单独分出一节,说明数据对象尺寸划分规则这个看似简单的概念的目的所在。
【循环的结构】
要“将DB100中的1-11数据字SKIIP83AC128IST1,传送到MW1-11中”,我们需要将指针内容按照顺序逐一指向相应的数据字,这种对指针内容的动态修改,其实就是遍历。对于遍历,**简单的莫过于循环。 一个循环包括以下几个要素:
1、初始循环指针SKIIP83AC128IST1
2、循环指针自加减
2、继续或者退出循环体的条件判断
被循环的程序主体必须位于初始循环指针之后,和循环指针自加减之前。
比如:SKIIP83AC128IST1
初始循环指针:X=0
循环开始点M
被循环的程序主体:-------
SKIIP83AC128IST1
循环指针自加减: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 102
SKIIP83AC128IST1
M2: L MD 102
T #COUNTER_D
SKIIP83AC128IST1
OPN DB100
L DBW [MD 102]
T MW [MD 102]
L #COUNTER_DSKIIP83AC128IST1
L L#2 // +2,是因为数据字的偏移基准是字节。
+D
SKIIP83AC128IST1
T MD 102 //自加减循环指针,这是动态修改了寻址指针的关键
L L#11 //循环次数=n-1。n=6。这是因为,首次进入循环是无条件的,
但已事实上执行了一次操作。
SKIIP83AC128IST1
<=D
JC M2
SKIIP83AC128IST1
有关于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 1SKIIP83AC128IST1
T MW 100
L L#1
T MD 102
M1: L MW 100 SKIIP83AC128IST1
T #COUNTER_W
M2: 对数据字循环传送程序,同上例
L #COUNTER_W
L 1 //这里不是数据字的偏移,只是编号的简单递增,因此+1
+I
T MW 100
L 9 //循环次数=n-1,n=10
<=I
SKIIP83AC128IST1
JC M1
通过示例分析,程序是让寻址指针在对要操作的数据对象范围内进行遍历来编程,完成这个任务。我们看到,这种对存储器间接寻址指针的遍历是基于字节和字的,如何对位进行遍历呢?
这就是下一个帖子要分析的寄存器间接寻址的实例的内容了。
L [MD100]
LAR1SKIIP83AC128IST1
与
L MD100
LAR1
有什么区别?
当将MD100以这种 [MD100] 形式表示时,你既要在对MD100赋值时考虑到所赋的值是否符合存储器间接寻址双字指针的规范,又要在使用这个寻址格式作为语句一部分时,是否符合语法的规范。
在你给出**个例程的**句SKIIP83AC128IST1:L [MD100]上,我们看出它犯了后一个错误。
存储器间接寻址指针,是作为指定的存储区域的确切数值单元来运用的。也就是说,指针不包含区域标识,它只是指明了一个数值。因此,要在 [MD100]前加上区域标识如: M、DB、I、Q、L等,还要加上存储区尺寸大小如:X、B、W、D等。SKIIP83AC128IST1在加存储区域和大小标识时,要考虑累加器加载指令L不能对位地址操作,因此,只能指定非位的地址。