code:copyseg - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 传入2个参数,参数1:块A地址,参数2:块B地址
- 将A块中的内容拷贝到B块中
0694 /* -------------------------*/
0695 .globl _copyseg
0696 _copyseg:
0697 mov PS,-(sp)
- 汇编函数调用的现场保护后的堆栈状态:
0698 mov UISA0,-(sp)
0699 mov UISA1,-(sp)
0700 mov $30340,PS
- 将PS,UISA0,UISA1保护进栈
0701 mov 10(sp),UISA0
0702 mov 12(sp),UISA1
0703 mov UISD0,-(sp)
- 将参数1(块A地址)读入UISA0,将参数2(块B地址)读入UISA1,参见遗留问题
0704 mov UISD1,-(sp)
0705 mov $6,UISD0
- 将UISD0,UISD1保护进栈
0706 mov $6,UISD1
0707 mov r2,-(sp)
- 将UISD0,UISD1置为可读写状态,参见Pdp11:页说明寄存器
0708 clr r0
- 将R2保护进栈
0709 mov $8192.,r1
0710 mov $32.,r2
0711 1:
- 置R0=0=0000000000000000(16位2进制),下图为(R0)的寻址过程
- 置R1=8192=0010000000000000(16位2进制),下图为(R1)的寻址过程
- 详见Pdp11:内存管理
- 置R2=32,表示拷贝次数
- 由于一内存块为64个字节,而每次拷贝为1个字(2个字节),所以拷贝一块需拷贝32次
0712 mfpi (r0)+
0713 mtpi (r1)+
- (R0)入栈,(R0)++,指向下一个字
0714 sob r2,1b
- 弹出栈顶至(R1)中,(R1)++,指向下一个字
0715 mov (sp)+,r2
- 将块A中的内容一个字一个字拷贝给块B
0716 mov (sp)+,UISD1
0717 mov (sp)+,UISD0
0718 mov (sp)+,UISA1
0719 mov (sp)+,UISA0
0720 mov (sp)+,PS
0721 rts pc
- 从栈中恢复R2,UISA0,UISA1,UISD0,UISD1,PS的值
0722
- 恢复原PC值,程序继续执行