code:0806 ~ 0886 - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

0806 /* ------------------------- */

0807 .globl _fubyte, _subyte

0808 /* ------------------------- */

0809 .globl _fuibyte, _suibyte

0810 /* ------------------------- */

0811 .globl _fuword, _suword

0812 /* ------------------------- */

0813 .globl _fuiword, _suiword

fubyte fuibyte
  • 用户态地址空间,读取一个字节
  • 输入 : 欲读取字节 在对应地址空间的地址
  • R0低八位 : 返回读取的字节内容
  • 若出错,则返回 -1 (由出错处理程序返回)
0814 _fuibyte:

0815 _fubyte:

0816     mov 2(sp),r1

0817     bic $1,r1

  • 输入参数 存入 R1
  • R1 取偶 (末位置0)
0818     jsr pc,gword
  • 转入gword(0851),读取用户态地址空间中R1指向的字内容,存入R0
0819     cmp r1,2(sp)

0820     beq 1f

0821     swab r0

0822 1:

0823     bic $!377,r0

0824     rts pc

  • 若 输入参数为偶数,则转入0822,直接取R0低八位返回
  • 若 输入参数为奇数,要交换高低字节,取R0低八位返回
0825
subyte
suibyte
  • 用户态地址空间,写入一个字节
  • 共输入两个参数 : 设为 addr 和 c
    • addr : 写入字节的地址(用户态地址空间)
    • c : 欲写入的字节
  • 返回值
    • 若出错,则返回 -1 (由出错处理程序返回)
    • 否则,返回0
0826 _suibyte:

0827 _subyte:

0828     mov 2(sp),r1

0829     bic $1,r1

  • 输入参数 addr 存入 R1
  • R1 取偶 (末位置0)
0830     jsr pc,gword

0831     mov r0,-(sp)

  • 转入gword(0851),读取用户态地址空间中R1指向的字内容,存入R0
  • R0入栈
0832     cmp r1,4(sp)

0833     beq 1f

0834     movb 6(sp),1(sp)

0835     br 2f

0836 1:

0837     movb 6(sp),(sp)

0838 2:

  • 若 addr 为 偶数,则 欲写入字节 写入 刚才读出的字 的低字节
  • 否则,欲写入字节 写入 刚才读出的字 的高字节
0839     mov (sp)+,r0
  • 从堆栈恢复R0
  • 之所以 向堆栈压入R0,再恢复,是因为 需要使用 字节寻址,这样使用比较方便
0840     jsr pc,pword
  • 转入pword(0868),向用户态地址空间中R1指向的地址,写回 修改后的字

0841     clr r0

0842     rts pc

  • 返回值置0
  • 正常函数返回
0843
fuiword
fuword
  • 用户态地址空间,读取一个字
  • 输入 : 欲读取字 在对应地址空间的地址
  • R0 : 返回读取的字内容
  • 若出错,则返回 -1 (由出错处理程序返回)

0844 _fuiword:

0845 _fuword:

0846     mov 2(sp),r1

0847 fuword:

0848     jsr pc,gword

0849     rts pc

0850

0851 gword:

0852     mov PS,-(sp)

0853     bis $340,PS

0854     mov nofault,-(sp)

  • 保护 nofault (出错处理函数) 入栈

0855     mov $err,nofault

  • 将err(0880) 设置为出错处理函数
0856     mfpi (r1)

0857     mov (sp)+,r0

  • 用户态地址空间 取出 (r1) 指向的值
  • MFPI出错,则通过trap转入nofault指向的err(0880) 函数,进行错误处理
  • 若不出错,则将读出的值传入R0,作为函数返回值

0858     br 1f

  • 转到 0875
0859
suiword
suword
  • 用户态地址空间 (R1) 位置 写入 (R0)
  • 输入两个参数: R1,R0

0860 _suiword:

0861 _suword:

0862     mov 2(sp),r1

0863     mov 4(sp),r0

0864 suword:

0865     jsr pc,pword

0866     rts pc

0867

0868 pword:

0869     mov PS,-(sp)

0870     bis $340,PS

0871     mov nofault,-(sp)

0872     mov $err,nofault

  • 保护 nofault (出错处理函数) 入栈
0873     mov r0,-(sp)

0874     mtpi (r1)

  • 用户态地址空间 (r1) 指向的地址,写入R0的值
  • MTPI出错,则通过trap转入nofault指向的err(0880) 函数,进行错误处理
0875 1:

0876     mov (sp)+,nofault

0877     mov (sp)+,PS

  • 从堆栈恢复 nofaultPS
  • 将err(0880) 设置为出错处理函数
0878     rts pc
  • 函数返回
0879
  • err 为 出错处理函数
  • 从堆栈恢复 nofaultPS
  • 从堆栈弹出 本级函数(gword,pword)的返回地址
  • 返回值 R0 置 -1
  • 向 上一级函数(例如fubyte等)返回地址 返回
0880 err:

0881     mov (sp)+,nofault

0882     mov (sp)+,PS

0883     tst (sp)+

0884     mov $-1,r0

0885     rts pc

0886

Ref

Caller

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