读书笔记---莱昂氏UNIX源代码分析(一.学习源代码前的准备知识)
1.寄存器:
处理机包含了一组1 6位寄存器,其中有8个是任何时候都可存访的“通用寄存器”。
这些寄存器被称之为:r 0、r 1、r 2、r 3、r 4、r 5、r 6以及r 7。
前6个通用寄存器可用作为累加器、地址指针或变址寄存器。U N I X使用这些寄存器的惯例是:
• r 0、r 1在表达式求值时用作临时累加器;在过程返回时存放返回值;在过程调用的某些情况下可用来传递实参。
• r 2、r 3和r 4在过程执行时可用作局部变量。在过程调用入口处存储这些寄存器的值,在退出过程时则恢复这些寄存器值。
• r5用作过程激活记录动态链的链首指针,该动态链存放在当前栈上。r 5被称为“环境指针”。
最后两个通用寄存器具有专门的意义和作用:
• r 6 (也称为s p )用作栈指针。P D P 11 / 4 0处理机有两个寄存器,分别在核心态和用户态下用作s p。而其他通用寄存器则没有这种双份使用方式。
• r7( 也称为p c )用作程序计数器,亦即指令地址寄存器。
2.指令集:
adc 将C位的内容加至目的操作数。
add 将源操作数加至目的操作数。
ash 按移位计数将指定寄存器的内容左移相应次数(负值表示右移次数)。
ashc 除涉及两个寄存器外,与a s h指令相同。
asl 所有位向左移1位。第0位装入0,而第1 5位的原值则装入C。
asr 所有位向右移1位。第1 5位保持原先值,而第0位的原先值则装入C。
beq 若等于,也就是若Z = 1则转移。
bge 若大于或等于,也就是若N = V则转移。
bhi 若高于,也就是若C=0以及Z=0则转移。
bhis 若高于或相同,也就是若C=0则转移。
bic 若源操作数中的位为非零值,则将目的操作数中的相应位清除为零。
bis 对源和目的操作数执行或操作,将结果存入目的操作数。
bit 对源和目的操作数执行逻辑与操作,设置条件码。
ble 若大于或等于,也就是若Z = 1或N = V则转移。
blo 若低于( 0 ),也就是若C=1则转移。
bne 若不等于( 0 ),也就是若Z = 0则转移。
br 转移到.-1 2 8和.+1 2 7之间的一个单元,其中,·表示当前单元的地址。
clc 清除C。
clr 将目的操作数清为0。
cmp 比较源和目的操作数,设置条件码位。若源操作数的值小于目的操作数值,则设置N位。
dec 将目的操作数的值减1。
div 存在r n和r ( n + 1 ) (其中,n是偶数)中的3 2位二进制补码整数被除以源操作数。商存在r n中,而余数则存在r ( n + 1 )中。
inc 将目的操作数的值加1。
jmp 跳转至目的地址。
jsr 跳转至子程序。寄存器值则按下列方式从左向右移动:p c、r n、-( s p ) = d e s t .、p c、r
nmfpi 将前地址空间中指定字的值压入当前栈。
mov 将源操作数值复制至目的操作数。
mtpi 从当前栈弹出一个字,将其值存入前地址空间中的指定字中。
mul 将r n的内容和源操作数相乘。若n是偶数,则将积存放在r n和r ( n + 1 )中。
reset 将U n i b u s中的I N I T线设置成1 0 m s。其作用是重新启动所有设备控制器。
ror 将目的操作数中各位循环右移1位。第0位的原先值装入至C,而C的原先值装入至第1 5位。
rts 从子程序中返回。从rn中重装pc,从栈中重装rn
rtt 从中断或陷入返回。从栈中弹出重装pc和ps
sbc 从目的操作数中减进位位
sob 从指定寄存器值中减一。若结果非0,则转移回“位移”(offset字)
sub 从目的操作数中减源操作数
swab 交换目的操作数中高、低字节
tst 按目的操作数中内容设置条件码,Z和N
wait 使处理器空转,释放Unibus,直至发生一硬件中断。
3.寻址方式:
3.1寄存器方式
操作数驻留在一个通用寄存器中,
例如:clr r0
mov r1,r0
add r4,42
在下列方式中,指定的寄存器包含一地址值,用其定位操作数。
3.2寄存器延迟方式
寄存器包含操作数的地址,例如:
inc (r1)
asr (sp)
add (r2),r1
3.3自动增1方式
寄存器包含操作数地址。作为一副作用,在操作后,寄存器值增1,例如:
clr (r1)+
mfpi (r0)+
mov (r1)+,r0
mov r2,(r0)+
cmp (sp)+,(sp)+
3.4自动减1方式
寄存器值先减1,然后用来定位操作数,例如:
inc -(r0)
mov -(r1),r2
mov (r0)+,-(sp)
clr -(sp)
3.5变址方式
操作数地址由两部分组成,一部分是寄存器包含的值,另一部分是紧跟指令后的一个1 6位字值,两者相加得到操作数地址,例如:
clr 2(r0)
movb 6(sp),(sp)
movb -reloc(r0),r0
mov -10(r2),(r1)
在这种寻址方式中,寄存器可被视为变址寄存器或基地址寄存器。m 4 0 . s采用后一种看法。上面的第三个例子是使用寄存器作为变址寄存器的少数几个实例中的一个。(注意,_ r e l o c是一个可接受的变量名。)
有两种寻址方式,它们只用于下列两个例子中:
jsr pc,*(r0)+
jmp *0f(r0)
其中,第一个例子涉及“自动增量延迟”方式的使用。(这用于例程c a l l中的0 7 8 5和0 7 9 9行。)企图执行的子程序的地址在r 0指向的地址字中找到,也就是说涉及到两级间接寻址。在此种使用中r 0增1的副作用并无任何实际影响。
第二个例子出现在1 0 5 5和1 0 6 6行,它是“变址延迟”方式的一个例子。“j u m p”(“跳转”)的目的地址是一个字的内容,该字的地址值是0 f加上r 0的值(一个小的正整数)。这是实现多路选择(multi-way switch)的标准方法。下列两种方式用程序计数器作为指定的寄存器,以达到某种特定的作用。
2.6立即方式
这是p c自动增1方式。操作数从程序串中取得,也就是这是一个立即操作数,例如:
add $2,r0
add $,(r1)
bic $!7,r0
mov $KISA0,r0
mov $77406,(r1)+
2.7相对方式
这是pc变址方式。相对于当前程序计数器值的地址从程序串中取得,并与pc值相加得到操作数的绝对地址,例如:
bic $430,ps
bit $1,ssr0
inc ssr0
mov (sp),KISA6
应当引起注意的是,“变址”、“变址延迟”、“立即”以及“相对”方式都将指令延长一个字。
4.状态寄存器:
除段寄存器外,P D P 11 / 4 0还有两个存储管理状态寄存器:
SR0 包含异常终止出错标志和其他有关操作系统的重要信息。特别地,当S R 0的第0位设置时,存储管理起作用。
SR2 在每条指令存取操作的开始处装入1 6位虚地址。
5.“i”和“d”空间:
P D P 11 / 4 5和11 / 7 0系统增加了段寄存器组。
p c寄存器( r 7 )引用的地址被称为属于“ i”空间,它由一组段寄存器翻译为物理地址;其余地址被称为属于“ d”空间,它由另一组段寄存器翻译。
这种安排的优点是“ i”和“d”空间可分别为3 2 K字,于是可分配给程序的最大地址空间较P D P 11 / 4 0扩大了1倍。
6.启动条件:
当系统第一次启动时,存管部件被禁止操作,处理机处于核心态。在这种环境下,变化范围在0~5 6 K字节的虚地址映照为相同的物理地址值。
但是,虚地址空间的最高页映照为物理地址空间的最高页,
在P D P 11 / 4 0或11 / 4 5中,地址区间0 1 6 0 0 0 0-0 1 7 7 7 7 7
被映照为下列物理地址区间0 7 6 0 0 0 0-0 7 7 7 7 7 7