有一段程序,对于为什么要使用双字左移指令不是很理解,正好大家讨论左移、和右移指令存在的意义?
程序段如下:
L #Index //将操作数#Index的值加载进累加器1
L 1 //将#Index的值加载进累加器2,将操作数1的值加载进累加器1
- I //用累加器2中的值-累加器1的值,并将差值存入累加器1
SLD 5 //将累加器1中的值(内容:#Index-1)左移5位
L P# #Store //将#Store作为指针装入累加器1,将左移5位的值存入累加器2
+ D //将累加器1和累加器2相加(累加器1+累加器2)
L AR1 //将相加后的值存在累加器1中,并将累加器1中的值 加载进地址寄存器1
L #Data //将操作数#Data的值加载进累加器1
T DID [AR1,P#0.0] //将累加器1中的值(即#Data)传送进以AR1地址寄存器为起始地 址, 0.0为偏移量的地址中
-----------------------------------------------------------------------------------------------------------
以上是我个人对STL代码添加的注释,不对之处大家讨论改正,对于第4句 SLD 5 偏移5位的作用请知道其作用的大神给出一个详细的说明,谢谢!
最佳答案
至少要左移3位,即SLD 3,这是由于地址指针的格式决定的,和P#4.0类似,最低3位表示位,其他位表示地址,即xxx---xxxxx.xxx。
所以如果SLD 5
index=1时,地址指针是4.0;(B100.000)
index=2时,地址指针是8.0;(B1000.000)
因为用的是双字寻址,故左移5位
当然具体地址是多少,还要看index内容及P# #Store。
提问者对于答案的评价:
谢谢您的解答!我就是不明白这里为什么要写一句SLD 5,双字左移5位,您说的指针格式决定,是从哪里看出来的呢,是从SLD 或者SLW 语句中的D ,W看出来的吗?
最佳答案作者回复:
如果SLD 3后
index=1-1=0时,地址指针是0.0;(B#0000 000)31--3位是二进制0000,对应的是0
index=2-1=1时,地址指针是1.0;(B#0001 000)31--3位是二进制0001,对应的是1
index=3-1=2时,地址指针是2.0;(B#0010 000)31--3位是二进制0010,对应的是2
双字地址表示成DBD0,DBD1,DBD2,这样表示的话地址就重复了,
所以要左移5后就表示成DBD0,DBD4,DBD8了
从上面也知道为什么index需要减1了。
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc347804.html