DB块内数据移动的STL,看不太懂,请大侠帮忙解释一下!

L     MW   700
      L     1
      +I    
      T     MW   700                    

      TAR2  #TEMP_AR2                   
      L     8
      T     #TEMP_STEP                 
      A     #dir
      JCN   JP01                       
      L     -8
      T     #TEMP_STEP
JP01: AN    #dir                      
      =     #TEMP1                      
      JC    EXIT                        
      L     P##src                    
      LAR1                              
      L     0
      L     W [AR1,P#0.0]
      ==I   
      JZ    IF01
      T     #BLOCK_NO
      OPN   DB [#BLOCK_NO]
IF01: NOP   0
      L     D [AR1,P#2.0]
      LAR1  
      L     #num
      T     #TEMP_NUM
      L     0
      ==I   
      JZ    EXIT
      L     #len
      T     #TEMP_LEN
      L     0
      ==I   
      JZ    EXIT
      L     P##dest
      LAR2  
      L     0
      L     W [AR2,P#0.0]
      ==I   
      JZ    IF05
      T     #BLOCK_NO
      OPN   DI [#BLOCK_NO]
      L     DW#16#5000000
      L     D [AR2,P#2.0]
      OD    
      JU    IF06
IF05: L     D [AR2,P#2.0]
IF06: LAR2  
      A     #TEMP1
      JC    EXIT
      L     #offset
      L     4095
      >=I   
      TAK   
      JCN   JP10
      TAK   
      -I    
      L     32760
      +AR2  
      TAK   
JP10: L     8
      *D    
      +AR2  
      L     #TEMP_NUM
L00P: T     #TEMP_NUM
      L     #len
L00B: T     #TEMP_LEN
      L     B [AR1,P#0.0]
      T     B [AR2,P#0.0]
      L     #TEMP_STEP
      +AR1  
      +AR2  
      L     #TEMP_LEN
      LOOP  L00B
      L     #TEMP_NUM
      LOOP  L00P
EXIT: SET   
      JU    SBR
      CLR   
SBR:  SAVE  
      LAR2  #TEMP_AR2

问题补充:
谢谢,你的问答,这是一个实现数据块内部移动,一次移动七组数据,分别为一个字符串型,一个字符型,五个实型。七个组数据总长为34。一开始的累加和  L     DW#16#5000000
L     32760、     L     4095、这些常数和16#5000000
这些看的不太明白是什么意思?最好请大侠给个详细一点的解释,或者给我发一个实现数据内部移动的讲解实例。谢谢!

最佳答案

程序太长了,只能简单的说一下,其他的还得你自己去琢磨:
16#5000000和下面一个数OD的目的就是把这个数的第24和26位强制为1
4095(16#FFF)在你程序中也就是个偏移地址比较值,超过它就减去它。
32760=4095*8表达成32位指针格式就是p#4095.0
把下面这段程序给你注释一下,便于你理解:

 L     #offset
      L     4095
      >=I   
      TAK            //ACCU1= #offset,ACCU2= 4095
      JCN   JP10
      TAK            //ACCU1= 4095,ACCU2= #offset
      -I                //ACCU1=#offset-4095
      L     32760  //ACCU1=32760=p#4095.0;ACCU2=#offset-4095
      +AR2         //AR2=AR2+P#4095.0
      TAK           //ACCU1=#offset-4095,ACCU2=32760
JP10: L     8
      *D             //如果 #offset>=4095,此处是(#offset-4095)*8;如果小于4095,此处是(#offset)*8
      +AR2        //AR2=AR2+P#(#offset-4095).0或者AR2=AR2+P#(#offset).0

提问者对于答案的评价:
谢谢,你的回答!

专家置评

已阅,最佳答案正确。

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc247520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月2日
下一篇 2018年12月2日

相关推荐