技术论坛

 一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

返回主题列表
作者 主题
爱学习的我
侠客

经验值: 734
发帖数: 42
精华帖: 0
楼主    2023-02-28 10:44:02
主题:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

以下是源代码:

    SET   

      SAVE                              // BIE setzen

      L     P##IN1                      // Pointer

      LAR1                              // in Adre?register 1 ablegen             

      L     W [AR1,P#0.0]               // DB-Nr. aus Lokaldaten IN1

      T     #w_DBNR1                    // zwischenspeichern

      OPN   DB [#w_DBNR1]               // Quell-DB, falls vorhanden

      L     D [AR1,P#2.0]               // Pointer auf String IN1 laden

      LAR1                              // ins Adre?register 1

      T     #d_AR_IN1

      L     B [AR1,P#1.0]               // L?nge String 1

      T     #yAnzIN1

      L     P##IN2                      // Pointer

      LAR2                              // in Adre?register 2 ablegen

      L     W [AR2,P#0.0]               // DB-Nr. aus Lokaldaten IN1

      T     #w_DBNR2                    // zwischenspeichern

      OPN   DB [#w_DBNR2]               // Quell-DB, falls vorhanden

      L     D [AR2,P#2.0]               // Pointer auf String IN2 laden

      LAR2  

      T     #d_AR_IN2                   // zwischenspeichern

      L     B [AR2,P#1.0]               // res. L?nge String 2

      T     #yAnzIN2

      L     P##RET_VAL                  // Pointer

      LAR2                              // in Adre?register 2 ablegen

      L     W [AR2,P#0.0]               // DB-Nr. aus Lokaldaten RET_VAL

      T     #w_Temp                     // zwischenspeichern

      OPN   DI [#w_Temp]                // Quell-DB, falls vorhanden

      L     D [AR2,P#2.0]               // Pointer auf String RET_VAL

      OD    DW#16#1000000               // Pointer-Bereichskennung DI

      LAR2                              // ins Adre?register 2

      L     B [AR2,P#0.0]               // res. L?nge Ziel

      T     #yMaxZiel

以下是经过加工的代码:

 SET   

      SAVE                              // BIE setzen

      L     P##IN1                      //  输入1,指针起始地址(p#dbn.dbn.0 输入是如何转换成地址数据的?

      LAR1                              // in Adre?register 1 ablegen   加载到AR1          

      L     W [AR1,P#0.0]               // DB-Nr. aus Lokaldaten IN1   读取DB块号所在的地址?W是什么意思?输入如何转换的?

      T     #数据源1的DB编号                    // zwischenspeichern

      OPN   DB [#数据源1的DB编号]               // Quell-DB, falls vorhanden   打开DB块

      L     D [AR1,P#2.0]               // Pointer auf String IN1 laden   D又是什么?doubleword?

      LAR1                              // ins Adre?register 1     ACCU1装载到AR1

      T     #地址寄存器IN1

      L     B [AR1,P#1.0]               // L?nge String 1 这是读取的什么?从哪里读的数据长度?

      T     #IN1的字符长度          

      L     P##IN2                      // Pointer   输入2,指针起始地址(p#dbn.dbn.0)下面跟上面差不多

      LAR2                              // in Adre?register 2 ablegen

      L     W [AR2,P#0.0]               // DB-Nr. aus Lokaldaten IN1

      T     #数据源2的DB编号                    // zwischenspeichern

      OPN   DB [#数据源2的DB编号]               // Quell-DB, falls vorhanden

      L     D [AR2,P#2.0]               // Pointer auf String IN2 laden

      LAR2  

      T     #地址寄存器IN2                   // zwischenspeichern

      L     B [AR2,P#1.0]               // res. L?nge String 2

      T     #IN2的字符长度        

      L     P##RET_VAL                  // Pointer   返回值接入位置,也是指针起始地址

      LAR2                              // in Adre?register 2 ablegen

      L     W [AR2,P#0.0]               // DB-Nr. aus Lokaldaten RET_VAL

      T     #w_Temp                     // zwischenspeichern     润滑标记

      OPN   DI [#w_Temp]                // Quell-DB, falls vorhanden  源数据库(如果可用)

      L     D [AR2,P#2.0]               // Pointer auf String RET_VAL

      OD    DW#16#1000000               // Pointer-Bereichskennung DI

      LAR2                              // ins Adre?register 2

      L     B [AR2,P#0.0]               // res. L?nge Ziel

      T     #目标保存长度  






进无止境
zhangli0
至圣

经验值: 43548
发帖数: 15773
精华帖: 61
1楼    2023-02-28 11:54:47
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

以下是经过加工的代码:

 SET   

      SAVE                              // BIE setzen

      L     P##IN1                      //  输入1,指针起始地址(p#dbn.dbn.0 输入是如何转换成地址数据的?

P##IN1是间接寻址指针。这个32位的指针的每一个位的物理意义是固定的,你需要看指针的说明

      LAR1                              // in Adre?register 1 ablegen   加载到AR1          

      L     W [AR1,P#0.0]               // DB-Nr. aus Lokaldaten IN1   读取DB块号所在的地址?W是什么意思?输入如何转换的?

W是字长度,他是一个word,这句话的意思是读取AR1这里保存的db中的起始地址,P#0.0指的是偏移量是0.0的位置开始

      T     #数据源1的DB编号                    // zwischenspeichern

      OPN   DB [#数据源1的DB编号]               // Quell-DB, falls vorhanden   打开DB块

      L     D [AR1,P#2.0]               // Pointer auf String IN1 laden   D又是什么?doubleword?

      LAR1                              // ins Adre?register 1     ACCU1装载到AR1

      T     #地址寄存器IN1

      L     B [AR1,P#1.0]               // L?nge String 1 这是读取的什么?从哪里读的数据长度?

这里是读取一个字符串,字符串的开始有一个特殊字符表示字符串开始,第二个字节是字符串的长度,这里只是取了字符串的长度信息给了下面的T指令对应的变量。

      T     #IN1的字符长度          

      L     P##IN2                      // Pointer   输入2,指针起始地址(p#dbn.dbn.0)下面跟上面差不多

      LAR2                              // in Adre?register 2 ablegen

      L     W [AR2,P#0.0]               // DB-Nr. aus Lokaldaten IN1

      T     #数据源2的DB编号                    // zwischenspeichern

      OPN   DB [#数据源2的DB编号]               // Quell-DB, falls vorhanden

      L     D [AR2,P#2.0]               // Pointer auf String IN2 laden

      LAR2  

      T     #地址寄存器IN2                   // zwischenspeichern

      L     B [AR2,P#1.0]               // res. L?nge String 2

      T     #IN2的字符长度        

      L     P##RET_VAL                  // Pointer   返回值接入位置,也是指针起始地址

      LAR2                              // in Adre?register 2 ablegen

      L     W [AR2,P#0.0]               // DB-Nr. aus Lokaldaten RET_VAL

      T     #w_Temp                     // zwischenspeichern     润滑标记

      OPN   DI [#w_Temp]                // Quell-DB, falls vorhanden  源数据库(如果可用)

      L     D [AR2,P#2.0]               // Pointer auf String RET_VAL

      OD    DW#16#1000000               // Pointer-Bereichskennung DI

      LAR2                              // ins Adre?register 2

      L     B [AR2,P#0.0]               // res. L?nge Ziel

      T     #目标保存长度 


活到老,学到老!为了生活学习吧!
爱学习的我
侠客

经验值: 734
发帖数: 42
精华帖: 0
2楼    2023-02-28 17:15:07
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

我把问题清析了一下,请赐教!




进无止境
爱学习的我
侠客

经验值: 734
发帖数: 42
精华帖: 0
3楼    2023-02-28 17:17:50
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

前辈,恳请赐教!

进无止境
zhangli0
至圣

经验值: 43548
发帖数: 15773
精华帖: 61
4楼    2023-02-28 17:44:52
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

1、加载的指针是db57.dbx512.0这个地址,后面的计算的偏移量都是以512.0开始计算的。

2、打开的db是db57,这你需要看指针的地址定义。

活到老,学到老!为了生活学习吧!
爱学习的我
侠客

经验值: 734
发帖数: 42
精华帖: 0
5楼    2023-03-02 11:27:41
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

   您能已这段为例详细的给我讲一下吗。我还是看不明白,DB块内的值跟ACCU1中的值对不上呀,输入#IN1   以P#DB1.DBX0.0为例,您在详细的一行一行给我讲一下呗

     SET   

      SAVE                              // 

      L     P##IN1                      // Pointer   =P#DB1.DBX0.0

      LAR1                              //              

      L     W [AR1,P#0.0]               // 

      T     #w_DBNR1                    //

      OPN   DB [#w_DBNR1]               //

      L     D [AR1,P#2.0]               // 

      LAR1                              // 

      T     #d_AR_IN1


进无止境
zhangli0
至圣

经验值: 43548
发帖数: 15773
精华帖: 61
6楼    2023-03-02 13:19:14
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

     SET  //置位rlo

      SAVE                              //保存rlo结果到br 

      L     P##IN1                      // 这里取得是in1的地址,你外部输入的是db57.dbx512.0,那么指针指向的就是db57.dbx512.0

      LAR1                              //    把指针指向的地址放到地址寄存器1中          

      L     W [AR1,P#0.0]               // 取地址寄存器中偏移量为0的一个字,即读取db57.dbw512

      T     #w_DBNR1                    //保存到变量中#w_DBNR1

      OPN   DB [#w_DBNR1]               //打开#w_DBNR1中的值对应的db块

      L     D [AR1,P#2.0]               // 读取当前打开的db块中偏移量为2的dword

      LAR1                              // 把当前累加器中的值装在到地址寄存器1中

      T     #d_AR_IN1//当前累加器的值保存到变量中


活到老,学到老!为了生活学习吧!
爱学习的我
侠客

经验值: 734
发帖数: 42
精华帖: 0
7楼    2023-03-02 16:59:40
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

前辈,还有最后一个疑问,下面红字部分,请赐教。

 SET  //置位rlo

      SAVE                              //保存rlo结果到br 

      L     P##IN1                      // 这里取得是in1的地址,你外部输入的是db57.dbx512.0,那么指针指向的就是db57.dbx512.0

      LAR1                              //    把指针指向的地址放到地址寄存器1中          

      L     W [AR1,P#0.0]               // 取地址寄存器中偏移量为0的一个字,即读取db57.dbw512

      T     #w_DBNR1                    //保存到变量中#w_DBNR1

      OPN   DB [#w_DBNR1]               //打开#w_DBNR1中的值对应的db块

      L     D [AR1,P#2.0]               // 读取当前打开的db块中偏移量为2的dword ---》这个偏移的起始位置是将AR1交叉寻址解析后的起始地址吗?还是其他的呀

      LAR1                              //把当前累加器中的值装在到地址寄存器1中

      T     #d_AR_IN1//当前累加器的值保存到变量中


进无止境
zhangli0
至圣

经验值: 43548
发帖数: 15773
精华帖: 61
8楼    2023-03-06 08:50:29
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

从地址寄存器保存的值开始的2个字节的偏移量呀,最后一次读到的地址是db57.dbx512.0,那么你当前指令读取的就是db57.dbd514.

活到老,学到老!为了生活学习吧!
爱学习的我
侠客

经验值: 734
发帖数: 42
精华帖: 0
9楼    2023-03-06 15:45:07
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

哦,跟后来打开的DB块没关系啊,我一直迷惑的就是它打开OPN   DB [#w_DBNR1]  后,后续的指令是与这个打开的DB块有关系呢

进无止境
自控龙龙
奇侠

经验值: 5889
发帖数: 796
精华帖: 1
10楼    2023-03-06 21:30:00
主题:回复:一段STL代码,请帮忙解读一下具体的执行过程和一些指令的含义

这个需要看看ANY和pointer指针的使用方法,掌握了它们,就知道是怎么回事了 。

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。