系统的简单注解 - 10 07_external_interface.asm文件



该文件提供了多个用于系统调用的接口。用户进程通过这些接口使用操作系统提供的核心功能。

 

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
					  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值