code:copyseg - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 传入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)

  • 将PS,UISA0,UISA1保护进栈

0700     mov $30340,PS
0701     mov 10(sp),UISA0

0702     mov 12(sp),UISA1

  • 将参数1(块A地址)读入UISA0,将参数2(块B地址)读入UISA1,参见遗留问题
0703     mov UISD0,-(sp)

0704     mov UISD1,-(sp)

  • 将UISD0,UISD1保护进栈

0705     mov $6,UISD0

0706     mov $6,UISD1

0707     mov r2,-(sp)
  • 将R2保护进栈

0708     clr r0

0709     mov $8192.,r1

0710     mov $32.,r2

  • 置R0=0=0000000000000000(16位2进制),下图为(R0)的寻址过程

  • 置R1=8192=0010000000000000(16位2进制),下图为(R1)的寻址过程

  • 详见Pdp11:内存管理
  • 置R2=32,表示拷贝次数
    • 由于一内存块为64个字节,而每次拷贝为1个字(2个字节),所以拷贝一块需拷贝32次
0711 1:

0712     mfpi (r0)+

  • (R0)入栈,(R0)++,指向下一个字

0713     mtpi (r1)+
  • 弹出栈顶至(R1)中,(R1)++,指向下一个字

0714     sob r2,1b
  • 将块A中的内容一个字一个字拷贝给块B
0715     mov (sp)+,r2

0716     mov (sp)+,UISD1

0717     mov (sp)+,UISD0

0718     mov (sp)+,UISA1

0719     mov (sp)+,UISA0

0720     mov (sp)+,PS

  • 从栈中恢复R2,UISA0,UISA1,UISD0,UISD1,PS的值
0721     rts pc
  • 恢复原PC值,程序继续执行
0722

Caller

⚠️ **GitHub.com Fallback** ⚠️