quote:以下是引用n次看你的背影在2011-12-01 13:05:22的发言:
也想说说我使用指针的感受,二:(字节、字、双字间接寻址)
1、在使用指针对字节、字、双字间接寻址时,大多是处理数据类型有规律的场合;
2、需注意字节、字、双字寻址指针和地址偏移量的关系;字节寻址时,指针偏移一个字节;字寻址时,指针偏移2个字节,双字寻址时,指针偏移4个字节;
3、尽量使用一个地址寄存器寻址,避免同时使用2个地址寄存器进行寻址,尽量做到干净利落;
4、要充分利用临时存储区(L),结合循环把某些运算在临时存储区完成,提高指针寻址的执行效率;
下面举一个例子参考:(DB11、DB12结构相同,里面各自存放了200个REAL类型的数据,比较DB11、DB12两个数据块对应地址里面的值,如果相等写到相同结构的DB13相对应的地址里面存储。)
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
LAR1 P#0.0
L 200 //循环200次
NEXT: T LW 100
OPN DB 13 //打开数据快DB13
L 0.000000e+000
T DBD [AR1,P#0.0] //将DB13当前的地址清零
OPN DB 11 //打开数据快DB11
L DBD [AR1,P#0.0] //读取DB11当前的数据
T LD 102 //★暂存到临时存储器 LD102里面
OPN DB 12 //打开数据快DB12
L DBD [AR1,P#0.0] //读取DB12当前的数据
T LD 106 //★暂存到临时存储器 LD106里面
L LD 102 //★比较DB11、DB12对应的地址里面的数据
L LD 106
==R //是否相等
JCN M001
OPN DB 13
L LD 102
T DBD [AR1,P#0.0] //相同的数据写到DB13对应的地址里面
M001: +AR1 P#4.0 //地址寄存器1的地址向前推进4个字节
L LW 100
LOOP NEXT
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
通过上面的例子,我们不难发现:合理、巧妙使用L区内存,可以只使用一个地址寄存器,提高指针寻址的执行效率!
A侠的程序有点小问题,保存到DB13中的数据是间断的,地址不是连续的。DB13中的数据要连续需要第二个指针。
此外可以用存储器间接寻址来取代AR1,AR1这样使用没有发挥出寄存器间接寻址偏移量和地址寄存器的值都可以改变的优势。