📄 shell.asm
字号:
%include "orzmicro.inc"%include "floppy_device.inc"%include "console_library.inc"%include "keyboard_handler.inc"%include "exec_library.inc"%include "keytabs/keycodes.inc"%include "macro.inc"%define MAX_CMDLINE 0x100%define MAX_PARAMS (MAX_CMDLINE / 2) db "ORZEXE.0" ; Executable file revision 0 id dd 0x1000 ; Stack size dd _DATA_LEN ; Data size[ORG -0x10][BITS 32] mov [prnum], BYTE 0 mov esi, console_name mov ecx, console_len call Find mov [consoleID], eax mov esi, keyboard_name mov ecx, keyboard_len call Find mov [keyboardID], eax mov esi, exec_name mov ecx, exec_len call Find mov [execID], eax ;;;;;;;;;;;;;;;; mov al, 12 call SetColor mov ebx, [consoleID] mov eax, cons_PrintString mov esi, logo mov ecx, logo_len xor edx, edx int i_SendMessageW ;;;;;;;;;;;;;;;; mov al, 10 call SetColor mov ebx, [consoleID] mov eax, cons_PrintString mov esi, zversion mov ecx, zversion_len xor edx, edx int i_SendMessageW ;;;;;;;;;;;;;;;;MainLoop: mov al, 15 call SetColor mov ebx, [consoleID] mov eax, cons_PrintString mov esi, prompt mov ecx, prompt_len xor edx, edx int i_SendMessageW ;;;;;;;;;;;;;;;; mov al, 7 call SetColor mov edi, cmdLineEntCmd: call Sleep mov ebx, [keyboardID] mov eax, kbd_GetASCII xor ecx, ecx xor edx, edx int i_SendMessageW cmp ax, K_BS jnz EntCmd0 cmp edi, cmdLine jz EntCmd dec edi jmp EntCmd2EntCmd0: cmp ax, K_ENT jnz EntCmd1 jmp ExecuteCommandEntCmd1: cmp ax, ' ' jc EntCmd cmp ax, 128 jnc EntCmd cmp edi, cmdLine + MAX_CMDLINE jnc EntCmd stosbEntCmd2: mov [msg], al mov ebx, [consoleID] mov eax, cons_PrintChar mov esi, msg mov ecx, 1 xor edx, edx int i_SendMessageW jmp EntCmd;---------------------------------------------------------------ExecuteCommand: call NewLine mov [edi], BYTE 0 call Parse mov esi, command mov edi, TX_ps call strcmp jnz ExecuteCommand0 jmp CMD_psExecuteCommand0: mov esi, command mov edi, TX_kill call strcmp jnz ExecuteCommand1 jmp CMD_killExecuteCommand1: mov esi, command mov edi, TX_time call strcmp jnz ExecuteCommand2 jmp CMD_timeExecuteCommand2: jmp CMD_TryToRun;---------------------------------------------------------------NewLine: mov ah, [msg] push ax mov [msg], BYTE 0x0D mov ebx, [consoleID] mov eax, cons_PrintChar mov esi, msg mov ecx, 1 xor edx, edx int i_SendMessageW pop ax mov [msg], ah retSetColor: mov ah, [msg] push ax mov [msg], al mov ebx, [consoleID] mov eax, cons_SetTextColor mov esi, msg mov ecx, 1 xor edx, edx int i_SendMessageW pop ax mov [msg], ah retPrintTAB: mov ah, [msg] push ax mov [msg], BYTE 9 mov ebx, [consoleID] mov eax, cons_PrintChar mov esi, msg mov ecx, 1 xor edx, edx int i_SendMessageW pop ax mov [msg], ah retError: mov al, 4 + 8 call SetColor mov ebx, [consoleID] mov eax, cons_PrintString mov esi, error mov ecx, error_len xor edx, edx int i_SendMessageW ret;---------------------------------------------------------------Parse: mov esi, cmdLine mov edi, command mov [paramsCount], BYTE 0 call Parse_spc and al, al jnz Parse0 mov [edi], BYTE 0Parse2: retParse0: call Parse_cpToken mov edi, paramsParse1: call Parse_spc and al, al jz Parse2 push edi call Parse_cpToken pop edi add edi, MAX_CMDLINE + 1 inc BYTE [paramsCount] jmp Parse1Parse_spc: lodsb and al, al jz Parse_spc1Parse_spc0: cmp al, " " jz Parse_spcParse_spc1: dec esi retParse_cpToken: lodsb and al, al jz Parse_cpToken1 cmp al, " " jz Parse_cpToken0 stosb jmp Parse_cpTokenParse_cpToken0: xor al, alParse_cpToken1: stosb dec esi ret;;;;strcmp: xor al, alstrcmp0: cmp [esi], al jz strcmp1 cmp [edi], al jz strcmp1 cmpsb jz strcmp0 retstrcmp1: mov al, [esi] or al, [edi] ret;;;;strcpy: mov al, [esi] inc esi mov [edi], al inc edi and al, al jnz strcpy ret;---------------------------------------------------------------CMD_TryToRun: mov esi, command mov edi, msg + sexec_RunProgramm.taskName call strcpy mov esi, command mov edi, msg + sexec_RunProgramm.fileName call strcpy mov ebx, [execID] mov eax, exec_RunProgramm mov esi, msg mov ecx, sexec_RunProgramm.msize - 1 xor edx,edx int i_SendMessageW jmp MainLoop;---------------------------------------------------------------CMD_time: mov al, 14 call SetColor xor ebx, ebx xor ecx, ecx xor edx, edx mov eax, msg_GetTickCount int i_SendMessageW mov [prnum + 1],eax mov esi, prnum mov ecx, 5 mov ebx, [consoleID] xor edx, edx mov eax, cons_PrintNumber int i_SendMessageW call NewLine jmp MainLoop;---------------------------------------------------------------CMD_ps: xor ebx, ebx xor ecx, ecx mov edi, msg mov edx, msg_len mov eax, msg_EnumTasksID int i_SendMessageW jnc CMD_ps0 call Error jmp MainLoopCMD_ps0: shr ecx, 2 jecxz CMD_ps1l jmp CMD_ps1hCMD_ps1l: jmp CMD_ps1CMD_ps1h: push ecx mov esi, msg mov edi, tasksID rep movsd pop ecx mov esi, tasksIDCMD_ps2: push ecx, esi xor ebx, ebx mov ecx, 4 mov edi, msg mov edx, msg_len mov eax, msg_GetTaskName int i_SendMessageW jc CMD_ps3 mov [edi + ecx], BYTE 0 push esi mov al, 10 call SetColor pop esi lodsd mov [prnum + 1],eax mov esi, prnum mov ecx, 5 mov ebx, [consoleID] xor edx, edx mov eax, cons_PrintNumber int i_SendMessageW call PrintTAB mov al, 9 call SetColor mov esi, msg mov ecx, msg_len mov ebx, [consoleID] xor edx, edx mov eax, cons_PrintString int i_SendMessageW call NewLineCMD_ps3: pop esi, ecx add esi, 4 loop CMD_ps2CMD_ps1: jmp MainLoop;---------------------------------------------------------------CMD_kill: cmp BYTE [paramsCount], 1 jnz CMD_kill1 mov esi, params call ScanfHex jc CMD_kill1 mov [msg], eax xor ebx, ebx mov esi, msg mov ecx, 4 xor edx, edx mov eax, msg_KillTask int i_SendMessageW jnc CMD_kill2CMD_kill1: call ErrorCMD_kill2: jmp MainLoop;---------------------------------------------------------------;;;; IN: ESI = textPtr;;;; OUT: if (FLAG_C) error(); else EAX = num;ScanfHex: xor ebx, ebxScanfHex0: lodsb and al, al jnz ScanfHex1 clc mov eax, ebx retScanfHex1: cmp al, '0' jc ScanfHex5 cmp al, '9' + 1 jnc ScanfHex2 sub al, '0' jmp short ScanfHex4ScanfHex2: cmp al, 'A' jc ScanfHex5 cmp al, 'F' + 1 jnc ScanfHex3 sub al, 'A' - 10 jmp short ScanfHex4ScanfHex3: cmp al, 'a' jc ScanfHex5 cmp al, 'f' + 1 jnc ScanfHex5 sub al, 'a' - 10ScanfHex4: shl ebx, 4 or bl, al jmp short ScanfHex0ScanfHex5: xor eax, eax stc ret;---------------------------------------------------------------TX_ps db "ps", 0TX_kill db "kill", 0TX_time db "time", 0TX_test db "test", 0error db "Error", 0x0Derror_len equ $-errorlogo db " _sudZUZ#Z#XZo=_", 0x0D db " _jmZZ2!!~---~!!X##wa [Orz/Microkernel]", 0x0D db " .<wdP~~ -!YZL,", 0x0D db " .mX2' _%aaa__ XZ[. ____", 0x0D db " oZ[ _jdXY!~?S#wa ]Xb; | |_ _ __ ", 0x0D db " _#e' .]X2( ~Xw| )XXc | | |/ ` /", 0x0D db ".2Z` ]X[. xY| ]oZ(,|__| | /__", 0x0D db '.2#; )3k; _s!~ jXf`', 0x0D db ' 1Z> -]Xb/ ~ __#2(', 0x0D db " -Zo; +!4ZwaaaauZZXY'", 0x0D db " *#[, ~-?!!!!!!-~", 0x0D db " XUb;.", 0x0D db " )YXL,, Yes, Everything can be Orz!", 0x0D db " +3#bc,", 0x0D db " -)Orz,,", 0x0D db " ~~~~~", 0x0D db 0x0Dlogo_len equ $-logozversion db "Orz Microkernel x86 version 0.rz", 0x0Dzversion_len equ $-zversionprompt db "[jserv@sexmachine /]# "prompt_len equ $-prompt;---------------------------------------------------------------execID dd 0exec_name db "exec.library"exec_len equ $-exec_nameconsoleID dd 0console_name db "console.library"console_len equ $-console_namekeyboardID dd 0keyboard_name db "keyboard.handler"keyboard_len equ $-keyboard_nametestx dw 0x4321;---------------------------------------------------------------Find: xor ebx, ebx xor edx, edx mov eax, msg_FindTaskByName int i_SendMessageW jnc Find0 jmp BigErrorFind0: ret;;;;Sleep: xor ebx, ebx mov eax, msg_Sleep xor ecx, ecx xor edx, edx int i_SendMessageW ret;;;;BigError: mov ax, 0xFAC0 mov ds, ax%include "debug.inc";---------------------------------------------------------------;;;; DATA;---------------------------------------------------------------_DATA_START equ $msg equ _DATA_START_end_msg equ msg + 0x100msg_len equ _end_msg - msgcmdLine equ _end_msg_end_cmdLine equ cmdLine + MAX_CMDLINE + 1command equ _end_cmdLine_end_command equ command + MAX_CMDLINE + 1params equ _end_command_end_params equ params + (MAX_PARAMS * (MAX_CMDLINE + 1))paramsCount equ _end_params_end_paramsCount equ paramsCount + 1tasksID equ _end_paramsCount_end_tasksID equ tasksID + 0x100prnum equ _end_tasksID_end_prnum equ prnum + 5imgData equ _end_prnum_end_imgData equ imgData + 0xFC00_DATA_LEN equ _end_imgData - _DATA_START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -