⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messages.asm

📁 可在Intel x86上执行的最小OS,完全用组语撰写 可做DISK IO,Process Scheduling...等
💻 ASM
📖 第 1 页 / 共 2 页
字号:
Int_GetMessage:	cli	GDT_Adjustment	;;;;	mov [task_ebp], ebp	mov ebp, [currentTaskP]	mov [ds:ebp + s_task.r_eax], eax	mov [ds:ebp + s_task.r_ebx], ebx	mov [ds:ebp + s_task.r_ecx], ecx	mov [ds:ebp + s_task.r_edx], edx	mov [ds:ebp + s_task.r_esi], esi	mov [ds:ebp + s_task.r_edi], edi	mov eax, [task_ebp]	mov [ds:ebp + s_task.r_ebp], eax	;;;;	pop eax	mov [ds:ebp + s_task.r_eip], eax	;;;;	pop eax		; task_cs	;;;;	pop eax	mov [ds:ebp + s_task.r_eflags], eax	;;;;	mov [ds:ebp + s_task.r_esp], esp	;;;;	mov ax, kernel_data - _GDT	mov ss, ax	mov esp, [kernel_esp]	mov esi, [ebp + s_task.qFirst]	cmp esi, [ebp + s_task.qLast]	jnz Int_GetMessage0	or [ebp + s_task.r_eflags], DWORD ZF_OR	jmp Int_ScheduleCurr_succInt_GetMessage0:	lodsd	push ebp	;;;;	call FindTask	jnc Int_GetMessage1	;;;;	pop ebp	mov eax, RESULT_INVALID_TASKID	jmp Int_ScheduleCurr_errEax	;;;;Int_GetMessage1:	pop edi	mov ecx, [ebp + s_task.r_ecx]	mov eax, [edi + s_task.r_edx]	cmp eax, ecx	jnc Int_GetMessage2	mov ebp, edi	mov eax, RESULT_BUFFER_TOO_SMALL	jmp Int_ScheduleCurr_errEaxInt_GetMessage2:	mov eax, [ebp + s_task.taskID]	mov [edi + s_task.r_ebx],eax	mov eax, [ebp + s_task.r_eax]	mov [edi + s_task.r_eax], eax	mov [edi + s_task.r_ecx], ecx	and [edi + s_task.r_eflags], DWORD ZF_AND	push edi	;;;;	mov eax, [edi + s_task.taskPageAddr]	mov edi, [edi + s_task.r_edi]	add edi, eax	;;;;	mov esi, [ebp + s_task.r_esi]	add esi, [ebp + s_task.taskPageAddr]	;;;;	rep movsb	;;;;	pop ebp	jmp Int_ScheduleCurr_succ;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------Int_SendMessageW:	cli	GDT_Adjustment	;;;;	mov [task_ebp], ebp	mov ebp, [currentTaskP]	mov [ds:ebp + s_task.r_eax], eax	mov [ds:ebp + s_task.r_ebx], ebx	mov [ds:ebp + s_task.r_ecx], ecx	mov [ds:ebp + s_task.r_edx], edx	mov [ds:ebp + s_task.r_esi], esi	mov [ds:ebp + s_task.r_edi], edi	mov eax, [task_ebp]	mov [ds:ebp + s_task.r_ebp], eax	;;;;	pop eax	mov [ds:ebp + s_task.r_eip], eax	;;;;	pop eax		; task_cs	;;;;	pop eax	mov [ds:ebp + s_task.r_eflags], eax	;;;;	mov [ds:ebp + s_task.r_esp], esp	;;;;	mov ax,kernel_data - _GDT	mov ss, ax	mov esp, [kernel_esp]	mov eax, [ebp + s_task.r_ebx]	and eax, eax	jz Int_SendMessageWkrnl	jmp Int_SendMessageWprcInt_SendMessageWkrnl:	mov eax, [ebp + s_task.r_eax]	cmp eax, msg_Sleep	jnz Sc0	jmp SysCall_SleepSc0:	cmp eax, msg_GetTickCount	jnz Sc1	jmp SysCall_GetTickCountSc1:	cmp eax, msg_FindTaskByName	jnz Sc2	jmp SysCall_FindTaskByNameSc2:	cmp eax, msg_RmodeInt	jnz Sc3	jmp SysCall_RmodeIntSc3:	cmp eax, msg_GetScanCode	jnz Sc4	jmp SysCall_GetScanCodeSc4:	cmp eax, msg_EnumTasksID	jnz Sc5	jmp SysCall_EnumTasksIDSc5:	cmp eax, msg_GetTaskName	jnz Sc6	jmp SysCall_GetTaskNameSc6:	cmp eax, msg_KillTask	jnz Sc7	jmp SysCall_KillTaskSc7:	cmp eax, msg_Exit	jnz Sc8	jmp SysCall_ExitSc8:	cmp eax, msg_CreateTask	jnz Sc9	jmp SysCall_CreateTaskSc9:	mov eax, RESULT_INCORRECT_SYSCALL	jmp Int_ScheduleCurr_errEaxInt_SendMessageWprc:	mov [senderP], ebp	call FindTask	jnc Int_SendMessageWprc1	mov ebp, [senderP]	mov eax, RESULT_INVALID_TASKID	jmp Int_ScheduleCurr_errEaxInt_SendMessageWprc1:	push ebp	mov ebp, [senderP]	mov eax, [ebp + s_task.taskID]	pop ebp	mov esi,[ebp + s_task.qLast]	lea edi,[ebp + (s_task.queue + (MAX_TASKS + 1) * 4)]	add esi, 4	cmp esi, edi	jc Int_SendMessageWprc2	lea esi, [ebp + s_task.queue]Int_SendMessageWprc2:	cmp esi, [ebp + s_task.qFirst]	jz Int_SendMessageWprc3	mov edi, [ebp + s_task.qLast]	stosd	mov [ebp + s_task.qLast], esi	mov ebp, [senderP]	mov [ebp + s_task.state], BYTE STATE_SENDW	jmp ScheduleInt_SendMessageWprc3:	mov ebp, [senderP]	mov eax, RESULT_TOO_MANY_MESSAGES	jmp Int_ScheduleCurr_errEaxsenderP		dd 0;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------Int_ProcessMessage:	cli	GDT_Adjustment	;;;;	mov [task_ebp], ebp	mov ebp, [currentTaskP]	mov [ds:ebp + s_task.r_eax], eax	mov [ds:ebp + s_task.r_ebx], ebx	mov [ds:ebp + s_task.r_ecx], ecx	mov [ds:ebp + s_task.r_edx], edx	mov [ds:ebp + s_task.r_esi], esi	mov [ds:ebp + s_task.r_edi], edi	mov eax, [task_ebp]	mov [ds:ebp + s_task.r_ebp], eax	;;;;	pop eax	mov [ds:ebp + s_task.r_eip], eax	;;;;	pop eax		; task_cs	;;;;	pop eax	mov [ds:ebp + s_task.r_eflags], eax	;;;;	mov [ds:ebp + s_task.r_esp], esp	;;;;	mov ax, kernel_data - _GDT	mov ss, ax	mov esp, [kernel_esp]	mov esi, [ebp + s_task.qFirst]	cmp esi, [ebp + s_task.qLast]	jnz Int_ProcessMessage0	mov eax, RESULT_NO_MORE_MESSAGES	jmp Int_ScheduleCurr_errEaxInt_ProcessMessage0:	lodsd	lea edi,[ebp + (s_task.queue + (MAX_TASKS + 1) * 4)]	cmp esi, edi	jnz Int_ProcessMessage1	lea esi,[ebp+s_task.queue]Int_ProcessMessage1:	mov [ebp+s_task.qFirst],esi	push ebp	;;;;	call FindTask	jnc Int_ProcessMessage2	;;;;	pop ebp	mov eax, RESULT_INVALID_TASKID	jmp Int_ScheduleCurr_errEax	;;;;Int_ProcessMessage2:	mov [ebp + s_task.state], DWORD STATE_RUNNING	;;;;	pop esi	mov ecx,[esi + s_task.r_ecx]	mov eax,[ebp + s_task.r_edx]	cmp eax, ecx	jnc Int_ProcessMessage3	mov [ebp + s_task.r_eax], DWORD RESULT_BUFFER_TOO_SMALL	or [ebp + s_task.r_eflags], DWORD CF_OR	mov ebp, esi	jmp Int_ScheduleCurr_succInt_ProcessMessage3:	mov eax, [esi + s_task.r_eax]	mov [ebp + s_task.r_eax], eax	mov [ebp + s_task.r_ecx], ecx	and [ebp + s_task.r_eflags], DWORD CF_AND	push esi	;;;;	mov eax, [esi + s_task.taskPageAddr]	mov esi, [esi + s_task.r_esi]	add esi, eax	;;;;	mov edi, [ebp + s_task.r_edi]	add edi, [ebp + s_task.taskPageAddr]	;;;;	rep movsb	;;;;	pop ebp	jmp Int_ScheduleCurr_succ;-------------------------------------------------------------------------------task_ebp	dd 0Int_ScheduleCurr_succEax:	mov [ebp + s_task.r_eax], eax	mov [ebp + s_task.r_ecx], DWORD 0Int_ScheduleCurr_succ:	and [ebp + s_task.r_eflags], DWORD CF_AND	jmp ScheduleCurr;;;;Int_ScheduleCurr_errEax:	mov [ebp + s_task.r_eax], eax	or [ebp + s_task.r_eflags], DWORD CF_OR	jmp ScheduleCurr;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------Int_RemoveMessage:	cli	GDT_Adjustment	;;;;	mov [task_ebp], ebp	mov ebp, [currentTaskP]	mov [ds:ebp + s_task.r_eax], eax	mov [ds:ebp + s_task.r_ebx], ebx	mov [ds:ebp + s_task.r_ecx], ecx	mov [ds:ebp + s_task.r_edx], edx	mov [ds:ebp + s_task.r_esi], esi	mov [ds:ebp + s_task.r_edi], edi	mov eax, [task_ebp]	mov [ds:ebp + s_task.r_ebp], eax	;;;;	pop eax	mov [ds:ebp + s_task.r_eip], eax	;;;;	pop eax		; task_cs	;;;;	pop eax	mov [ds:ebp + s_task.r_eflags], eax	;;;;	mov [ds:ebp + s_task.r_esp], esp	;;;;	mov ax, kernel_data - _GDT	mov ss, ax	mov esp, [kernel_esp]	mov esi, [ebp + s_task.qFirst]	cmp esi, [ebp + s_task.qLast]	jnz Int_RemoveMessage0	mov eax, RESULT_NO_MORE_MESSAGES	jmp Int_ScheduleCurr_errEaxInt_RemoveMessage0:	add esi, 4	lea edi, [ebp + (s_task.queue + (MAX_TASKS + 1) * 4)]	cmp esi, edi	jnz Int_RemoveMessage1	lea esi,[ebp + s_task.queue]Int_RemoveMessage1:	mov [ebp + s_task.qFirst], esi	jmp Int_ScheduleCurr_succ;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------Int_SendAnswer:	cli	GDT_Adjustment	;;;;	mov [task_ebp], ebp	mov ebp, [currentTaskP]	mov [ds:ebp + s_task.r_eax], eax	mov [ds:ebp + s_task.r_ebx], ebx	mov [ds:ebp + s_task.r_ecx], ecx	mov [ds:ebp + s_task.r_edx], edx	mov [ds:ebp + s_task.r_esi], esi	mov [ds:ebp + s_task.r_edi], edi	mov eax, [task_ebp]	mov [ds:ebp + s_task.r_ebp], eax	;;;;	pop eax	mov [ds:ebp + s_task.r_eip], eax	;;;;	pop eax		; task_cs	;;;;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -