Pdp11:寻址方式 - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
寄存器直接寻址
形式为 OPR Rn
通过寄存器名称,直接寻址到相应寄存器,并对其中数据加以操作
ADD_R2,R4_
通过寄存器名_R2_R4,直接寻址到相应寄存器,并对其中数据加以操作
OPR_R
寄存器自增寻址
参考寄存器间接寻址
形式为 OPR (Rn)+,方便数列、堆栈等的操作
寄存器作为指针使用,指令对寄存器指所指向的地址的数据进行操作
在指令完成后对寄存器进行累加
对字节型操作累加1,对字型操作累加2,对R6,R7两个寄存器始终累加2
ADD_(R2)+,R4
通过R2指向100002地址,对其中数据进行操作,并对R2进行累加
OPR_(R)+
寄存器自减寻址
参考寄存器间接寻址
形式为 OPR -(Rn),方便数列、堆栈等的操作
先对寄存器进行自减
对字节型操作自减1,对字型操作自减2,对R6,R7两个寄存器始终自减2
再将寄存器作为指针使用,指令对寄存器指所指向的地址的数据进行操作
ADD_-(R3),R0
先对R3自减2,再通过R3指向77774地址,对其中数据进行操作
OPR_-(R)
寄存器索引寻址
参考寄存器间接寻址
形式为 OPR X(Rn)
通过 Rn的值+X 进行寻址,对其数据进行操作
ADD_30(R2),20(R5)
R2的值1100+30=1130
R5的值2000+20=2020
对1130地址和2020地址的数据进行操作
OPR_X(R)
形式为 OPR @Rn 或 OPR (Rn)
寻址到Rn值所指向的地址,对其数据进行操作
CLR_@R5
通过R5的数据1700,找到1700地址,对其数据进行操作
OPR_(R)
形式为 OPR @(Rn)+
寻址到Rn值指向的地址的值指向的地址,对其数据进行操作
并将Rn值自增,自增规则与直接寻址方式相同
INC_@(R2)+
R2的值指向10300,10300地址的值指向1010,对1010地址的值进行操作,并将R2的值自增
OPR_@(R)+
形式为 OPR @-(Rn)
将Rn值自减,自减规则与直接寻址方式相同
寻址到Rn值指向的地址的值指向的地址,对其数据进行操作
INC_@-(R2)
将R2的值自减,R2的值指向10300,10300地址的值指向1010,对1010地址的值进行操作
OPR_@-(R)
形式为 OPR @X(Rn)
寻址到 Rn的值+X 指向的地址的值指向的地址,对其数据进行操作
ADD_@1000(R2),R1
R2的值+1000=1100
1100地址的值指向1050,对1050地址的数据进行操作
OPR_@X(R)
pdp-11说明书上对这种寻址方式称为 "USE OF THE PC AS AGENERAL REGISTER"
下面的例子对比了这种寻址指令的编译和其他寻址指令的编译
ADD_#10,R0_编译为两条指令,#10编译到单独的地址,方便对10的改变而方便指令重用,其他寻址方式如ADD_R2,R4编译为单一指令
形式为 OPR #n,DD
Add_#10,R0
1020,1022地址的内容是汇编指令编译后的机器指令
将1022地址的数据10加入R0中,注意PC的位置调整
OPR_#n
形式为 OPR @#A
与间接寻址完全一样
ADD_@#2000,R3
1020,1022地址的内容是汇编指令编译后的机器指令
根据1022地址内容2000寻址,将2000地址内容300加入R3寄存器中
OPR_@#A
形式为 OPR A 或 OPR X(PC)
OPR X(PC)形式说明这种寻址方式与索引寻址相同,只是使用PC寄存器数据作为基地址
INC_A
1020,1022地址的内容是汇编指令编译后的机器指令
执行指令前PC指向下一指令地址1024
1024+54=1100
寻址至1100,对1100地址的数据进行操作
OPR_A
形式为 OPR @A 或 OPR @X(PC)
OPR @X(PC)形式说明这种寻址方式与索引间接寻址相同,只是使用PC寄存器数据作为基地址
CLR_@A
1020,1022地址的内容是汇编指令编译后的机器指令
执行指令前PC指向下一指令地址1024
1024+20=1044
1044地址的内容10100,寻址至10100,对其数据进行操作
OPR_@A