code:incupc - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
0893 /* ------------------------- */
0894 .globl _incupc
0895 _incupc:
0896 mov r2,-(sp)
0897 mov 6(sp),r2 / base of prof with base,leng,off,scale
- R2保护入栈
- 于0920 从栈恢复
0898 mov 4(sp),r0 / pc
0899 sub 4(r2),r0 / offset
- R2 ← pprof
- R0 ← upc
0900 clc
- R0 ← upc - pprof->offset
- 将R0置为 upc相对于基准pc的偏移量
0901 ror r0
0902 mul 6(r2),r0 / scale
- R0 ← R0 / 2 (将字节单位化为字单位)
0903 ashc $-14.,r0
0904 inc r1
- R0,R1 ← R0 * pprof->scale / 2^14
- 将 偏移量 根据 缩放系数 进行缩放,存放到R0(高字)R1(低字)
- 后面将只取 低字R1 作为偏移量,并且R1以字节作单位
- 详细参看程序统计直方图
0905 bic $1,r1
0906 cmp r1,2(r2) / length
- R1 向上修正为偶地址
0907 bhis 1f
0908 add (r2),r1 / base
- 若 R1 超出统计数组总长,则转到0920,直接返回
0909 mov nofault,-(sp)
- R1 ← R1 + pprof->base
0910 mov $2f,nofault
- 保护 原出错处理函数 入栈
0911 mfpi (r1)
0912 inc (sp)
0913 mtpi (r1)
0914 br 3f加一 并写回
- 从用户态地址空间 取出 计算出的统计数组元素
0915 2:
0916 clr 6(r2)
0917 3:
0919 1:
0920 mov (sp)+,r2
0921 rts pc
0922