code:0806 ~ 0886 - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
0806 /* ------------------------- */
0807 .globl _fubyte, _subyte
0808 /* ------------------------- */
0809 .globl _fuibyte, _suibyte
0810 /* ------------------------- */
0811 .globl _fuword, _suword
0812 /* ------------------------- */
0813 .globl _fuiword, _suiword
fubyte fuibyte0814 _fuibyte:
- 从用户态地址空间,读取一个字节
- 输入 : 欲读取字节 在对应地址空间的地址
- R0低八位 : 返回读取的字节内容
- 若出错,则返回 -1 (由出错处理程序返回)
0815 _fubyte:
0816 mov 2(sp),r1
0817 bic $1,r1
0818 jsr pc,gword
- 输入参数 存入 R1
- R1 取偶 (末位置0)
0819 cmp r1,2(sp)
- 转入gword(0851),读取用户态地址空间中R1指向的字内容,存入R0
0820 beq 1f
0821 swab r0
0822 1:
0823 bic $!377,r0
0824 rts pc
0825
- 若 输入参数为偶数,则转入0822,直接取R0低八位返回
- 若 输入参数为奇数,要交换高低字节,取R0低八位返回
0826 _suibyte:
- subyte
- suibyte
0827 _subyte:
0828 mov 2(sp),r1
0829 bic $1,r1
0830 jsr pc,gword
- 输入参数 addr 存入 R1
- R1 取偶 (末位置0)
0831 mov r0,-(sp)
0832 cmp r1,4(sp)
- 转入gword(0851),读取用户态地址空间中R1指向的字内容,存入R0
- R0入栈
0833 beq 1f
0834 movb 6(sp),1(sp)
0835 br 2f
0836 1:
0837 movb 6(sp),(sp)
0838 2:
0839 mov (sp)+,r0
- 若 addr 为 偶数,则 欲写入字节 写入 刚才读出的字 的低字节
- 否则,欲写入字节 写入 刚才读出的字 的高字节
0840 jsr pc,pword
- 从堆栈恢复R0
- 之所以 向堆栈压入R0,再恢复,是因为 需要使用 字节寻址,这样使用比较方便
- 转入pword(0868),向用户态地址空间中R1指向的地址,写回 修改后的字
0841 clr r0
0842 rts pc
0843
- 返回值置0
- 正常函数返回
- 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
- 保护 nofault (出错处理函数) 入栈
0856 mfpi (r1)
- 将err(0880) 设置为出错处理函数
0857 mov (sp)+,r0
0858 br 1f
0859
- 转到 0875
- 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)
0873 mov r0,-(sp)
- 保护 nofault (出错处理函数) 入栈
0874 mtpi (r1)
0875 1:
0877 mov (sp)+,PS
0878 rts pc
0879
- 函数返回
0880 err:
0882 mov (sp)+,PS
0883 tst (sp)+
0884 mov $-1,r0
0885 rts pc
0886