为什么有了这段就模拟不了,这是300/400寻址的一段举例
刘玉蓉
发布于2014-11-03 17:17
23
0
标签:
L #DB_NO
T LW 0
OPN DB [LW 0]
L #DATA_1ST
T LD 2
L 0
T LD 8
L #LEN
next: T LW 6
L DBD [LD 2] //为什么有了这段就模拟不了 ??????
L LD 8
+R
T LD 8
L LD 2
L P#4.0
+D
T LD 2
L LW 6
LOOP next
L #LEN
ITD
DTR
T LD 12
L LD 8
TAK
/R
T #Average_out
佳答案
L为本地数据堆栈存储器,它是用来存储逻辑块(OB、FB、FC)中所使用的临时数据。在使用32位间接寻址时,必须注意对于字节、字和双字的寻址时,存储器中的指针必须要为8的整数倍;对于间接寻址务必考虑存储器中所有出现的数值对寻址结果的影响;对于字节寻址,存储器每次至少增加8,对于字寻址,存储器每次至少增加8,寻址,存储器每次至少增加16,对于双字寻址,存储器每次至少增加32,否则容易造成访问地址重复错误。
根据以上分析,暂态变量#DATA_1S内容必须是双整形数据,必须是8的整数倍,程序中务必不能送其他数据类型,如浮动数, 否则引用格式将产生混乱。字的起始地址必须是偶数,所以暂态变量#DATA_1S内容必须是偶数。之所以无法模拟的原因就在于:暂态变量#DATA_1S数据类型错误或存储的数据不是双整形数据,造成寻址冲突。下面简单对程序块解释如下:
L #DB_NO //将数据块装载到累加器1中的低字中;
T LW 0 //将数据块号传送到LWO
OPN DB [LW 0] //打开号为LW0 的数据块
L #DATA_1ST //将暂态变量#DATA_1S内容装载到累加器1中
T LD 2 //将 暂态变量#DATA_1S内容传送到LD2
L 0 //初始化LD8
T LD 8 // 将1送至LD8
L #LEN //将暂态变量 #LEN的内容装载到累加器1中
next: T LW 6 //将 暂态变量 #LEN的内容送至LW6
L DBD [LD 2] //将号为LD2的数据块双字装载到累加器1中