发布于 2006-07-25 20:40:21
0楼
地址寄存器存储的地址模式有两种格式:
1、地址指针格式包含被寻址数值所在存储单元地址的字节编号和位编号,至于对哪能个存储区寻址,则必须要在指令中明确地直接给出。
2、地址指针格式中在1种条件下还包含了数值所在存储区的说明位(存储区域标志位),这样可以通过改变这个存储区域标志位实现跨区间寻址。
32位指针格式具体如下:
X000_0rrr,0000_0bbb,bbbb_bbbb,bbbb_bXXX
位31=0表示区域内间接寻址,位31=1表示区域间寻址。
位24、25、26,区域标志位,具体如阿鸣帖子写讲。
位3~18:被寻址位的字节编号(共16位,范围:~65535)。
位0~2:被寻址的位编号(范围0-7)。
LAR1 P#1.1 装入的是1.1立即数,故是区域内寻址,位31=0,位24~26=0
LAR1 P#DBX0.0装入的是DBX0.0,属于区域间寻址,位31=1,位24~26=2#100
对于Harry dong的
L P#DBX 0.0
LAR1
L MW [AR1,P#2.0]
T MW 20
这和
L P#0.0
LAR1
L MW [AR1,P#2.0]
T MW 20
是一样的结果! 因为后面L MW [AR1,P#2.0]指定了区域标志,相当于把前面LAR1 P#DBX0.0装载的区域标志覆盖了!
对于Harry dong写的第二条,你自己已经解释了。即区域间寻址的时候位31必须等于1 !
当你用LAR1 P#DBX0.0时,系统会自动将位31置1,位24~26=2#100
而用LAR1 P#03000000时,仅仅是将位24~26=2#011表明这是对M区寻址(说明这是区域间寻址),但是同时位31却等于0(这又说明是区域内寻址), 这两处位的值是矛盾的,导致系统故障。
I can do it