您现在所在的是:

西门子SIEMENS

回帖:9个,阅读:9965 [上一页] [1] [下一页]
1370
Shyer
文章数:149
年度积分:50
历史总积分:1370
注册时间:2004/3/16
发站内信
发表于:2004/11/22 18:01:00
#0楼
我用网上的解密软件打开了标准库里的FC95(功能为把十六进制数转换为相应的ASCII),可是前面一些地方实在不明白,请高手指教,程序如下:
     TAR2  #TEMP_AR2                   // Save Address register 2 contents      
// If length to be converted is 0, return immediately
     L     #N
     L     0
     ==I  
     JC    DONE

// Open DB of ptr to hex input digits
     L     P##IN
     LAR1                              // Addr.Reg1 = Ptr to Src. Table
     L     W [AR1,P#0.0]               // load Block No. into accum 1
     T     #BLKNO                      // scrblk = Block No.
     OPN   DB [#BLKNO]                 // opens 1st Block, DB
     L     D [AR1,P#2.0]               // load Block Area Reference
     LAR1                              // load Block Addr.(area ref.)into Addr.Reg1
//---------------------------------------------------------------------------        
// Open ptr to output Ascii Locations as a DI
     L     P##OUT
     LAR2                              // Addr.Reg2 = Ptr to Output  
     L     W [AR2,P#0.0]               // load Block No. into accum 1
     L     0                           // CORRECTION ADDED BY STEVE LOVELL 5/98
     ==I  
     JZ    BEGN
     L     W [AR2,P#0.0]               // CORRECTION ADDED BY STEVE LOVELL 5/98
     T     #BLKNO                      // scrblk = Block No.
     OPN   DI [#BLKNO]                 // opens DI Block

//
// START OF CORRECTION ADDED BY STEVE LOVELL 5/98
//
     L     DW#16#5000000               // OR mask for DIX memory area in ptr
     L     D [AR2,P#2.0]               // load Block Area Reference; start addr.
     OD                                // Force memory area to DIX
     LAR2                              // Save into AR2
     JU    BEG2                        // Jump to label BEG2
//
// END OF CORRECTION
//

BEGN: L     D [AR2,P#2.0]               // start addr.      
     LAR2                              // load Block Addr.(area ref.)into Addr.Reg1
BEG2: NOP   0                           // CORRECTION ADDED BY STEVE LOVELL 5/98
//---------------------------------------------------------------------------        
     L     #N                          // Load length of HEX table
BYTS: T     #N
     L     B [AR1,P#0.0]               // Load byte from table
     T     #TMP1                       // and write it into TMP1 word
     T     #SAVTMP1                    // save a copy of the table's org. value

     L     2                           // number of hex input digits extracted
DIGT: T     #INDX_D                     // 1 byte (2 hex digits); 1 byte=2 nibbles
//-------------
     L     #SAVTMP1                    // save a copy of the table's org. value
     T     #TMP1

     L     2
     L     #INDX_D
     <>I  
     JC    MASK
     L     #TMP1
     SRW   4
     T     #TMP1
//-------------
MASK: L     #TMP1                       // Accum 2
     L     W#16#F                      // Accum 1
     AW                                // TMP1 AW 0x000F (mask off all but lower nibble)

     T     #ABYTE                      // convert from WORD to BYTE
     L     B#16#A                      // Load 0x0A
     <I                                // (Accum2 < Accum1)?  (ABYTE < 0x0A)?
     JC    A030                        // Jump to Add 0x30
     JU    A037                        // Jump to Add 0x37

// Add 0x30
A030: L     B#16#30
     L     #ABYTE
     +I                                // 0x30 + ABYTE
     T     #ABYTE
     JU    CONT                        // Jump to continue

// Add 0x37
A037: L     B#16#37
     L     #ABYTE
     +I                                // 0x37 + ABYTE
     T     #ABYTE

//---------------------------------------------------------------------------        
// Continue
CONT: L     #ABYTE
     T     B [AR2,P#0.0]               // Write BYTE to ouput
     +AR2  P#1.0                       // Increment pointer to output (by 1 byte)
//---------------------------------------------------------------------------        
     L     #SAVTMP1                    // Copy original table's BYTE value into TMP1          
     T     #TMP1
     L     #INDX_D
     LOOP  DIGT                        // }while (INDX_D <= 2)
//---------------------------------------------------------------------------        

     +AR1  P#1.0
     L     0                           // Clear out TMP1 WORD
     T     #TMP1                       // before reading next byte from table

     L     #N
     LOOP  BYTS                        // }while (N > 0)
     JU    DONE
//---------------------------------------------------------------------------        
DONE: SET  

     SAVE  
     LAR2  #TEMP_AR2                   // Restore Address Register 2 Contents

这是一个FC,怎么程序的开头还要用到OPN   DB [#BLKNO]    和 OPN   DI [#BLKNO] ?而且这两个数据块号是怎么来的?要是我的调用程序里没有这两个数据块呢?
1370
Shyer
文章数:149
年度积分:50
历史总积分:1370
注册时间:2004/3/16
发站内信
发表于:2004/11/23 14:50:00
#1楼
我做了一个多小时的实验,终于弄懂了!多谢!
原来在于定义形参时本来就是一个指针(比如IN0为Pointer类型),结果在程序里再用到P##IN0,则为指向指针的指针(这一点非常象C语言) 。
比如实参为P#DB1.DBX0.1,即为16#00 01 84 00 00 01,当你再一次用指针指令P##IN0时,即把16#00 01 84 00 00 01做为一个数字,P##IN0则为该数的指针!
所以在用到如下指令后:
比如:L     P##IN0
     LAR1
     L     W[AR1,P#0.0]  //这时取的是头一个字,即块号=1,DB1
     L     D[AR1,P#0.0]  //这时取的是头两个字,即16#00 01 84 00
     L     D[AR1,P#2.0]  //这时取的是后两个字,即P#DBX0.1=16#84 00 00 01

这是我猜测的过程,请高手指正.
6335
karl 版主
文章数:1703
年度积分:50
历史总积分:6335
注册时间:2003/12/26
发站内信
发表于:2004/11/23 17:53:00
#2楼
Shyer研究够细呀。加钻鼓励。
还请详细研究OPN指令(HELP on STL)和
间接寻址(http://www.ad.siemens.com.cn/service/e-training/PLC/download/pointer.zip)。
.
1370
Shyer
文章数:149
年度积分:50
历史总积分:1370
注册时间:2004/3/16
发站内信
发表于:2004/11/24 10:01:00
#3楼
多谢Karl提供的资料!
1088
lhdn123
文章数:116
年度积分:50
历史总积分:1088
注册时间:2003/7/6
发站内信
发表于:2005/3/6 10:58:00
#4楼
我的在学习啊
952
lulume
文章数:1
年度积分:50
历史总积分:952
注册时间:2006/5/30
发站内信
发表于:2006/5/30 15:35:00
#5楼
asasa
954
zv1981
文章数:2
年度积分:50
历史总积分:954
注册时间:2007/6/14
发站内信
发表于:2007/6/14 12:36:00
#6楼
dhgfdhgfdgfdgfdgfd
994
zhang1218000
文章数:20
年度积分:50
历史总积分:994
注册时间:2008/5/28
发站内信
发表于:2008/5/28 21:38:00
#7楼
此程序不是用STL编写的用的,是高级语言如SCL,没有源文件很难解密,有时解出也不对,我用过SCL其它我不知道 。
3472
dixinke
文章数:1062
年度积分:50
历史总积分:3472
注册时间:2004/9/9
发站内信
发表于:2008/6/29 11:52:00
#8楼
在SCL中也就一句话的事,另除了研究一下指针指令外,解开它没有任何意义!

坚定完毕!
956
北漂男孩
文章数:3
年度积分:50
历史总积分:956
注册时间:2008/8/19
发站内信
发表于:2008/8/19 11:35:00
#9楼
得学习了,要学的真多,我记得我学过汇编语言阿,都看懂了

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

124.8008