作者 | 主题 |
---|---|
爱学习的我 侠客 经验值: 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指针的使用方法,掌握了它们,就知道是怎么回事了 。 |