?? messages.asm
字號:
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 + -