该文件提供了多个用于系统调用的接口。用户进程通过这些接口使用操作系统提供的核心功能。
install_all_external_handle:安装用户层可调用的外部接口;
draw_point:画点;
draw_rectangle_0:画矩形;
get_cmd:获取来自系统的命令;
task_close:关闭用户进程,回到系统进程;
task_sleep:用户进程休眠;
task_win:获取进程窗口左上角位置以及横、宽长度;
;===============================================================================
;=== 本程序提供各类对用户层接口 ===
;===============================================================================
;-------------------------------------------------------------------------------
install_all_external_handle: ;安装用户层可调用的外部接口
;安装画点调用接口
mov eax, draw_point
mov ebx, flat_mode_code
call Set_gate_sel
mov word [far_caller_1 + 4], cx ;保存远程调用的选择子
;安装sleep调用接口
mov eax, task_sleep
mov ebx, flat_mode_code
call Set_gate_sel
mov word [far_caller_2 + 4], cx ;保存远程调用的选择子
;安装画矩形调用接口
mov eax, draw_rectangle_0
mov ebx, flat_mode_code
call Set_gate_sel
mov word [far_caller_3 + 4], cx ;保存远程调用的选择子
;安装获取命令字调用接口
mov eax, get_cmd
mov ebx, flat_mode_code
call Set_gate_sel
mov word [far_caller_4 + 4], cx ;保存远程调用的选择子
;安装获取命令字调用接口
mov eax, task_win
mov ebx, flat_mode_code
call Set_gate_sel
mov word [far_caller_5 + 4], cx ;保存远程调用的选择子
ret
;-------------------------------------------------------------------------------
draw_point: ;画点
;EAX=Y值
;EBX=X值
;CL=颜色
pushad
xor edx, edx ;edx清零,为乘法做准备
push ebx
mov ebx, 320
mul ebx ;Y乘以320
pop ebx
add eax, ebx ;结果再加上X,得到点在图形缓存中的偏移
mov [pic_mem_addr + eax], cl ;写入点颜色
popad
retf
;-------------------------------------------------------------------------------
draw_rectangle_0: ;画矩形
;EAX-低16位为Y值,高16位为Y的高度
;EBX-低16位为X值,高16位为X的宽度
;CL=颜色
call draw_rectangle
retf
;-------------------------------------------------------------------------------
get_cmd: ;获取来自系统的命令
;输出参数:al-cmd的值
push ebx
mov ebx, [_task_now] ;当前进程控制结构
add ebx, proc_ctrl.cmd
mov al, [ebx]
mov byte [ebx], 0
pop ebx
retf
;-------------------------------------------------------------------------------
task_close: ;关闭用户进程,回到系统进程
;输入参数: eax--用户进程的编号
;iretd
pushad
mov eax, [_task_now] ;当前进程控制结构
add eax, proc_ctrl.state
mov word [eax], task_closed ;进程状态为 退出
popad
retf
;-------------------------------------------------------------------------------
task_sleep: ;用户进程休眠
;输入参数: eax--休眠时间(10毫秒的倍数)
pushad
mov edx, [_task_now] ;edx指向当前进程
mov ebx, dword [sys_click] ;当前的ticks
add ebx, eax ;增加休眠的ticks
mov [edx + proc_ctrl.wakeup], ebx ;休眠截止时间
call mount_task_run_to_pend_que ;将进程放入暂定队列
popad
retf
;-------------------------------------------------------------------------------
task_win: ;获取进程窗口左上角位置以及横、宽长度
;输出参数:eax-高16位为x的宽度,低16位为x的值
;输出参数:ebx-高16位为y的宽度,低16位为y的值
push ecx
push edx
mov edx, [_task_now] ;edx指向当前进程
xor eax, eax
mov ax, [edx + proc_ctrl.len_x]
sub ax, 2
shl eax, 16 ;eax高16位为x的宽度
mov ax, [edx + proc_ctrl.left_x]
add ax, 1 ;eax低16位为x的值
xor ebx, ebx
mov bx, [edx + proc_ctrl.len_y]
sub bx, 6
shl ebx, 16 ;ebx高16位为y的宽度
mov bx, [edx + proc_ctrl.left_y]
add bx, 5 ;ebx低16位为y的值
pop edx
pop ecx
retf
;--------------------------------全局变量---------------------------------------
align 4
;远程调用的地址
far_caller_1 dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
far_caller_2 dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
far_caller_3 dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
far_caller_4 dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
far_caller_5 dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
far_caller_6 dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
far_caller_7 dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
far_caller_8 dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
align 4