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

Source

参数配置 参看profil 参看程序统计直方图

0893 /* ------------------------- */

0894 .globl _incupc

0895 _incupc:

0896     mov r2,-(sp)

  • R2保护入栈
  • 于0920 从栈恢复
0897     mov 6(sp),r2 / base of prof with base,leng,off,scale

0898     mov 4(sp),r0 / pc

  • R2 ← pprof
  • R0 ← upc
0899     sub 4(r2),r0 / offset
  • R0 ← upc - pprof->offset
  • 将R0置为 upc相对于基准pc的偏移量
0900     clc

0901     ror r0

  • R0 ← R0 / 2 (将字节单位化为字单位)
0902     mul 6(r2),r0 / scale

0903     ashc $-14.,r0

  • R0,R1 ← R0 * pprof->scale / 2^14
  • 将 偏移量 根据 缩放系数 进行缩放,存放到R0(高字)R1(低字)
  • 后面将只取 低字R1 作为偏移量,并且R1以字节作单位
  • 详细参看程序统计直方图
0904     inc r1

0905     bic $1,r1

  • R1 向上修正为偶地址
0906     cmp r1,2(r2) / length

0907     bhis 1f

  • 若 R1 超出统计数组总长,则转到0920,直接返回
0908     add (r2),r1 / base
  • R1 ← R1 + pprof->base
0909     mov nofault,-(sp)
  • 保护 原出错处理函数 入栈
0910     mov $2f,nofault
  • 置 0915 为出错处理函数(错误可能在mfpi/mtpi抛出)
0911     mfpi (r1)

0912     inc (sp)

0913     mtpi (r1)

  • 用户态地址空间 取出 计算出的统计数组元素
加一 并写回
0914     br 3f

0915 2:

0916     clr 6(r2)

0917 3:

0918     mov (sp)+,nofault

0919 1:

0920     mov (sp)+,r2

0921     rts pc

0922

Ref

Caller

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