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

📄 messages.asm

📁 可在Intel x86上执行的最小OS,完全用组语撰写 可做DISK IO,Process Scheduling...等
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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]	push ebp	;;;;	call FindTask	jnc Int_SendAnswer0	;;;;	pop ebp	mov eax, RESULT_INVALID_TASKID	jmp Int_ScheduleCurr_errEax	;;;;Int_SendAnswer0:	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_SendAnswer1	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_SendAnswer1:	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;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------;------------------------------------------------------------------SysCall_Sleep:	xor eax, eax	mov [ebp + s_task.r_eax], eax	mov [ebp + s_task.r_ecx], eax	and [ebp + s_task.r_eflags], DWORD CF_AND	jmp Schedule;------------------------------------------------------------------SysCall_GetTickCount:	mov eax, [globalTime]	jmp Int_ScheduleCurr_succEax;------------------------------------------------------------------SysCall_FindTaskByName:	mov ecx, [ebp + s_task.r_ecx]	cmp ecx, (MAX_TASK_NAME + 1)	jc Sc_FindTaskByName0			mov eax, RESULT_INCORRECT_SYSCALL_PARAMS	jmp Int_ScheduleCurr_errEaxSc_FindTaskByName0:	mov esi, sc_findTaskName	mov edi, sc_findTaskName + 1	mov ecx, MAX_TASK_NAME	mov [esi], BYTE 0	rep movsb	mov esi, [ebp + s_task.r_esi]	add esi, [ebp + s_task.taskPageAddr]	mov edi, sc_findTaskName	mov ecx, [ebp + s_task.r_ecx]	jecxz Sc_FindTaskByName1	rep movsbSc_FindTaskByName1:	mov esi, sc_findTaskName	push ebp	call FindTaskByName	pop ebp	jnc Sc_FindTaskByName2	mov eax, RESULT_TASK_NOT_FOUND	jmp Int_ScheduleCurr_errEaxSc_FindTaskByName2:	jmp Int_ScheduleCurr_succEaxsc_findTaskName	times (MAX_TASK_NAME + 1) db 0;------------------------------------------------------------------SysCall_RmodeInt:	mov ecx, [ebp + s_task.r_ecx]	cmp ecx, krnl_RmodeInt.msize	jz Sc_RmodeInt0			mov eax, RESULT_INCORRECT_SYSCALL_PARAMS	jmp Int_ScheduleCurr_errEaxSc_RmodeInt0:	mov esi, [ebp + s_task.r_esi]	add esi, [ebp + s_task.taskPageAddr]	mov ax, [esi + krnl_RmodeInt.r_ax]	mov [rmode_ax], ax	mov ax, [esi + krnl_RmodeInt.r_bx]	mov [rmode_bx], ax	mov ax, [esi + krnl_RmodeInt.r_cx]	mov [rmode_cx], ax	mov ax, [esi + krnl_RmodeInt.r_dx]	mov [rmode_dx], ax	mov ax, [esi + krnl_RmodeInt.r_si]	mov [rmode_si], ax	mov ax, [esi + krnl_RmodeInt.r_di]	mov [rmode_di], ax	mov ax, [esi + krnl_RmodeInt.r_bp]	mov [rmode_bp], ax	mov ax, [esi + krnl_RmodeInt.r_ds]	mov [rmode_ds], ax	mov ax, [esi + krnl_RmodeInt.r_es]	mov [rmode_es], ax	mov ax, [esi + krnl_RmodeInt.r_flags]	mov [rmode_flags],ax	mov al, [esi + krnl_RmodeInt.intNum]	call RmodeInt	mov edx, [ebp + s_task.r_edx]	cmp edx, krnl_RmodeInt.msize	jnc Sc_RmodeInt1	mov eax, RESULT_BUFFER_TOO_SMALL	jmp Int_ScheduleCurr_errEaxSc_RmodeInt1:	mov edi, [ebp + s_task.r_edi]	add edi, [ebp + s_task.taskPageAddr]	mov ax, [esi + krnl_RmodeInt.intNum]	mov [edi + krnl_RmodeInt.intNum], ax	mov ax, [rmode_ax]	mov [edi + krnl_RmodeInt.r_ax], ax	mov ax, [rmode_bx]	mov [edi + krnl_RmodeInt.r_bx], ax	mov ax, [rmode_cx]	mov [edi + krnl_RmodeInt.r_cx], ax	mov ax, [rmode_dx]	mov [edi + krnl_RmodeInt.r_dx], ax	mov ax, [rmode_si]	mov [edi + krnl_RmodeInt.r_si], ax	mov ax, [rmode_di]	mov [edi + krnl_RmodeInt.r_di], ax	mov ax, [rmode_bp]	mov [edi + krnl_RmodeInt.r_bp], ax	mov ax, [rmode_ds]	mov [edi + krnl_RmodeInt.r_ds], ax	mov ax, [rmode_es]	mov [edi + krnl_RmodeInt.r_es], ax	mov ax, [rmode_flags]	mov [edi + krnl_RmodeInt.r_flags], ax	mov [ebp + s_task.r_eax], DWORD 0	mov [ebp + s_task.r_ecx], DWORD krnl_RmodeInt.msize	jmp Int_ScheduleCurr_succ;------------------------------------------------------------------SysCall_GetScanCode:	movzx eax, WORD [globalKey]	cmp [globalKeySet],BYTE 0	jnz Sc_GetScanCode0	jmp Int_ScheduleCurr_errEaxSc_GetScanCode0:	mov [globalKeySet], BYTE 0	jmp Int_ScheduleCurr_succEax;------------------------------------------------------------------SysCall_EnumTasksID:	mov eax, [ebp + s_task.r_ecx]	and eax, eax	jz Sc_EnumTasksID0	mov eax, RESULT_INCORRECT_SYSCALL_PARAMS	jmp Int_ScheduleCurr_errEaxSc_EnumTasksID0:	mov ecx, [tasksCount]	mov eax, ecx	shl eax, 2	cmp eax, [ebp + s_task.r_edx]	jbe Sc_EnumTasksID1	mov eax, RESULT_BUFFER_TOO_SMALL	jmp Int_ScheduleCurr_errEaxSc_EnumTasksID1:	mov [ebp + s_task.r_ecx],eax	jecxz Sc_EnumTasksID3	mov esi, tasksList	mov edi, [ebp + s_task.r_edi]	add edi, [ebp + s_task.taskPageAddr]Sc_EnumTasksID2:	movzx ebx, BYTE [esi]	imul ebx, s_task.msize	add ebx, tasks	mov eax, [ebx + s_task.taskID]	stosd	inc esi	loop Sc_EnumTasksID2Sc_EnumTasksID3:	jmp Int_ScheduleCurr_succ;------------------------------------------------------------------SysCall_GetTaskName:	mov eax, [ebp + s_task.r_ecx]	cmp eax, 4	jz Sc_GetTaskName0	mov eax, RESULT_INCORRECT_SYSCALL_PARAMS	jmp Int_ScheduleCurr_errEaxSc_GetTaskName0:	mov eax, [ebp + s_task.r_edx]	cmp eax, MAX_TASK_NAME + 1	jnc Sc_GetTaskName1	mov eax, RESULT_BUFFER_TOO_SMALL	jmp Int_ScheduleCurr_errEaxSc_GetTaskName1:	mov esi, [ebp + s_task.r_esi]	add esi, [ebp + s_task.taskPageAddr]	lodsd	push ebp	call FindTask	jnc Sc_GetTaskName2	pop ebp	mov eax, RESULT_INVALID_TASKID	jmp Int_ScheduleCurr_errEaxSc_GetTaskName2:	lea esi, [ebp + s_task.taskName]	pop ebp	mov edi, [ebp + s_task.r_edi]	add edi, [ebp + s_task.taskPageAddr]	mov ecx, MAX_TASK_NAME	xor edx, edxSc_GetTaskName3:	lodsb	and al, al	jz Sc_GetTaskName4	stosb	inc edx	loop Sc_GetTaskName3Sc_GetTaskName4:	xor al,al	stosb	inc edx	mov [ebp + s_task.r_ecx], edx	jmp Int_ScheduleCurr_succ;------------------------------------------------------------------SysCall_KillTask:	cmp [ebp + s_task.r_ecx], DWORD 4	jz Sc_KillTask0	mov eax, RESULT_INCORRECT_SYSCALL_PARAMS	jmp Int_ScheduleCurr_errEaxSc_KillTask0:	mov esi, [ebp + s_task.r_esi]	add esi, [ebp + s_task.taskPageAddr]	lodsd	cmp eax, [ebp + s_task.taskID]	jnz Sc_KillTask1	jmp Sc_Exit_Sc_KillTask1:	push ebp	call KillTask	pop ebp	jnc Sc_KillTask2	mov eax, RESULT_INVALID_TASKID	jmp Int_ScheduleCurr_errEaxSc_KillTask2:	mov eax, [ebp + s_task.taskID]	call FindTask	mov [currentTaskN], eax	xor eax,eax	jmp Int_ScheduleCurr_succEax;------------------------------------------------------------------SysCall_Exit:	mov eax, [ebp + s_task.r_ecx]	and eax, eax	jz Sc_Exit_	mov eax, RESULT_INCORRECT_SYSCALL_PARAMS	jmp Int_ScheduleCurr_errEaxSc_Exit_:	mov eax, [ebp + s_task.taskID]	call KillTask	dec DWORD [currentTaskN]	jmp Schedule;------------------------------------------------------------------dummy		dd 0SysCall_CreateTask:	mov ebx, [ebp + s_task.r_ecx]	cmp ebx, krnl_CreateTask.msize + 1	jnc Sc_CreateTask0	mov eax, RESULT_INCORRECT_SYSCALL_PARAMS	jmp Int_ScheduleCurr_errEaxSc_CreateTask0:	mov esi, [ebp + s_task.r_esi]	add esi, [ebp + s_task.taskPageAddr]	mov ecx, [esi + krnl_CreateTask.stackSize]	mov edx, [esi + krnl_CreateTask.dataSize]	push eax			;;	mov eax, [ebp + s_task.r_edi]	;;	cmp eax, 0x12345678		;;	jnz gg1				;;	mov eax, 1			;;	mov [dummy], eax		;;gg1:	pop eax				;;	mov eax, esi	add eax, krnl_CreateTask.taskCode	sub ebx, krnl_CreateTask.taskCode	push ebp	call CreateTask	pop ebp	push eax			;;	mov eax, [ebp + s_task.r_edi]	;;	cmp eax, 0x12345678		;;	jnz gg				;;	mov ax, 0x1111			;;	mov ds, ax			;;gg: 	pop eax				;;	xor eax, eax	jmp Int_ScheduleCurr_succEax

⌨️ 快捷键说明

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