| | |
How to put internal Shell Commands in NASM?
Please support our Assembly advertiser: Programming Forums - DaniWeb Sister Site
Thread Solved |
•
•
Join Date: Oct 2007
Posts: 34
Reputation:
Solved Threads: 0
I have this kernel with the shell, and I'm trying to put the time and date commands in it but can't seem to make it work. It shows no error while compiling but it doesn't do anything when I test it. Can anyone tell me what I'm doing wrong here?
Here's the code so far:
Here's the code so far:
Assembly Syntax (Toggle Plain Text)
;*****************start of the kernel code*************** [org 0x000] [bits 16] [SEGMENT .text] ;START ##################################################### mov ax, 0x0100 ;location where kernel is loaded mov ds, ax mov es, ax cli mov ss, ax ;stack segment mov sp, 0xFFFF ;stack pointer at 64k limit sti push dx push es xor ax, ax mov es, ax cli mov word [es:0x21*4], _int0x21 ; setup interrupt service mov [es:0x21*4+2], cs sti pop es pop dx mov si, strWelcomeMsg ; load message mov al, 0x01 ; request sub-service 0x01 int 0x21 call _shell ; call the shell int 0x19 ; reboot ;END ####################################################### _int0x21: _int0x21_ser0x01: ;service 0x01 cmp al, 0x01 ;see if service 0x01 wanted jne _int0x21_end ;goto next check (now it is end) _int0x21_ser0x01_start: lodsb ; load next character or al, al ; test for NUL character jz _int0x21_ser0x01_end mov ah, 0x0E ; BIOS teletype mov bh, 0x00 ; display page 0 mov bl, 0x07 ; text attribute int 0x10 ; invoke BIOS jmp _int0x21_ser0x01_start _int0x21_ser0x01_end: jmp _int0x21_end _int0x21_end: iret _shell: _shell_begin: ;move to next line call _display_endl ;display prompt call _display_prompt ;get user command call _get_command ;split command into components call _split_cmd ;check command & perform action ; empty command _cmd_none: mov si, strCmd0 cmp BYTE [si], 0x00 jne _cmd_ver ;next command jmp _cmd_done ; display version _cmd_ver: mov si, strCmd0 mov di, cmdVer mov cx, 4 repe cmpsb jne _cmd_cls ;next command call _display_endl mov si, strOsName ;display version mov al, 0x01 int 0x21 call _display_space mov si, txtVersion ;display version mov al, 0x01 int 0x21 call _display_space mov si, strMajorVer mov al, 0x01 int 0x21 mov si, strMinorVer mov al, 0x01 int 0x21 jmp _cmd_done _cmd_cls: mov si, strCmd0 mov di, cmdCls mov cx, 4 repe cmpsb jne _cmd_date ;next command call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl call _display_endl mov bh, 0 mov dl, 0 mov dh, 00 mov ah, 02 int 10h jmp _cmd_done _cmd_date: mov si, strCmd0 mov di, cmdDate mov cx, 4 repe cmpsb jne _cmd_time ;next command jmp overdata overdata: mov ah,4 int 1Ah mov di,datestring mov al,dh call byte2hex mov al,'-' stosb mov al,dl call byte2hex mov al,'-' stosb mov ax,cx call word2hex mov al,'$' stosb mov dx,datestring ;just like "Hello World!" mov ah,9 int 21h mov ah,4Ch int 21h word2hex: mov bx,ax shr ax,12 call nyb2hex mov ax,bx shr ax,8 call nyb2hex mov ax,bx byte2hex: mov bx,ax shr ax,4 call nyb2hex mov ax,bx nyb2hex: and al,0Fh cmp al,10 ;sbb al,105 ;das jc okdigit add al,7 okdigit: add al,30h ;int 029h stosb ret jmp _cmd_done _cmd_time: mov si, strCmd0 mov di, cmdTime mov cx, 4 repe cmpsb jne _cmd_hlp jmp _WasteTime global _WasteTime _WasteTime: mov bx, sp mov bx, [ss:bx+02h] push si push di mov ah, 00h int 1Ah mov di, cx mov si, dx .Waster: mov ah, 00h int 1Ah sub dx, si sbb cx, di cmp cx, 0 jne .EndOfProc cmp dx, bx jb .Waster .EndOfProc: pop di pop si ret jmp _cmd_done _cmd_hlp: mov si, strCmd0 mov di, cmdHlp mov cx, 4 repe cmpsb jne _cmd_abt ;next command call _display_endl mov si, strHelp ;display help mov al, 0x01 int 0x21 call _display_space mov si, txtHelp ;display help mov al, 0x01 int 0x21 mov si, strCmdOne ;display command mov al, 0x01 int 0x21 mov si, strCmdTwo mov al, 0x01 int 0x21 mov si, strCmdThree mov al, 0x01 int 0x21 mov si, strCmdFour mov al, 0x01 int 0x21 mov si, strCmdFive mov al, 0x01 int 0x21 mov si, strCmdSix mov al, 0x01 int 0x21 jmp _cmd_done _cmd_abt: mov si, strCmd0 mov di, cmdAbt mov cx, 4 repe cmpsb jne _cmd_exit ;next command call _display_endl mov si, txtAbout ;display about mov al, 0x01 int 0x21 call _display_space mov si, strAbout ;display about mov al, 0x01 int 0x21 call _display_space mov si, strMajorAbt mov al, 0x01 int 0x21 mov si, strMinorAbt mov al, 0x01 int 0x21 jmp _cmd_done ; exit shell _cmd_exit: mov si, strCmd0 mov di, cmdExit mov cx, 5 repe cmpsb jne _cmd_unknown ;next command je _shell_end ;exit from shell _cmd_unknown: call _display_endl mov si, msgUnknownCmd ;unknown command mov al, 0x01 int 0x21 _cmd_done: ;call _display_endl jmp _shell_begin _shell_end: ret _get_command: ;initiate count mov BYTE [cmdChrCnt], 0x00 mov di, strUserCmd _get_cmd_start: mov ah, 0x10 ;get character int 0x16 cmp al, 0x00 ;check if extended key je _extended_key cmp al, 0xE0 ;check if new extended key je _extended_key cmp al, 0x08 ;check if backspace pressed je _backspace_key cmp al, 0x0D ;check if Enter pressed je _enter_key mov bh, [cmdMaxLen] ;check if maxlen reached mov bl, [cmdChrCnt] cmp bh, bl je _get_cmd_start ;add char to buffer, display it and start again mov [di], al ;add char to buffer inc di ;increment buffer pointer inc BYTE [cmdChrCnt] ;inc count mov ah, 0x0E ;display character mov bl, 0x07 int 0x10 jmp _get_cmd_start _extended_key: ;extended key - do nothing now jmp _get_cmd_start _backspace_key: mov bh, 0x00 ;check if count = 0 mov bl, [cmdChrCnt] cmp bh, bl je _get_cmd_start ;yes, do nothing dec BYTE [cmdChrCnt] ;dec count dec di ;check if beginning of line mov ah, 0x03 ;read cursor position mov bh, 0x00 int 0x10 cmp dl, 0x00 jne _move_back dec dh mov dl, 79 mov ah, 0x02 int 0x10 mov ah, 0x09 ; display without moving cursor mov al, ' ' mov bh, 0x00 mov bl, 0x07 mov cx, 1 ; times to display int 0x10 jmp _get_cmd_start _move_back: mov ah, 0x0E ; BIOS teletype acts on backspace! mov bh, 0x00 mov bl, 0x07 int 0x10 mov ah, 0x09 ; display without moving cursor mov al, ' ' mov bh, 0x00 mov bl, 0x07 mov cx, 1 ; times to display int 0x10 jmp _get_cmd_start _enter_key: mov BYTE [di], 0x00 ret _split_cmd: ;adjust si/di mov si, strUserCmd ;mov di, strCmd0 ;move blanks _split_mb0_start: cmp BYTE [si], 0x20 je _split_mb0_nb jmp _split_mb0_end _split_mb0_nb: inc si jmp _split_mb0_start _split_mb0_end: mov di, strCmd0 _split_1_start: ;get first string cmp BYTE [si], 0x20 je _split_1_end cmp BYTE [si], 0x00 je _split_1_end mov al, [si] mov [di], al inc si inc di jmp _split_1_start _split_1_end: mov BYTE [di], 0x00 ;move blanks _split_mb1_start: cmp BYTE [si], 0x20 je _split_mb1_nb jmp _split_mb1_end _split_mb1_nb: inc si jmp _split_mb1_start _split_mb1_end: mov di, strCmd1 _split_2_start: ;get second string cmp BYTE [si], 0x20 je _split_2_end cmp BYTE [si], 0x00 je _split_2_end mov al, [si] mov [di], al inc si inc di jmp _split_2_start _split_2_end: mov BYTE [di], 0x00 ;move blanks _split_mb2_start: cmp BYTE [si], 0x20 je _split_mb2_nb jmp _split_mb2_end _split_mb2_nb: inc si jmp _split_mb2_start _split_mb2_end: mov di, strCmd2 _split_3_start: ;get third string cmp BYTE [si], 0x20 je _split_3_end cmp BYTE [si], 0x00 je _split_3_end mov al, [si] mov [di], al inc si inc di jmp _split_3_start _split_3_end: mov BYTE [di], 0x00 ;move blanks _split_mb3_start: cmp BYTE [si], 0x20 je _split_mb3_nb jmp _split_mb3_end _split_mb3_nb: inc si jmp _split_mb3_start _split_mb3_end: mov di, strCmd3 _split_4_start: ;get fourth string cmp BYTE [si], 0x20 je _split_4_end cmp BYTE [si], 0x00 je _split_4_end mov al, [si] mov [di], al inc si inc di jmp _split_4_start _split_4_end: mov BYTE [di], 0x00 ;move blanks _split_mb4_start: cmp BYTE [si], 0x20 je _split_mb4_nb jmp _split_mb4_end _split_mb4_nb: inc si jmp _split_mb4_start _split_mb4_end: mov di, strCmd4 _split_5_start: ;get last string cmp BYTE [si], 0x20 je _split_5_end cmp BYTE [si], 0x00 je _split_5_end mov al, [si] mov [di], al inc si inc di jmp _split_5_start _split_5_end: mov BYTE [di], 0x00 ret _display_space: mov ah, 0x0E ; BIOS teletype mov al, 0x20 mov bh, 0x00 ; display page 0 mov bl, 0x07 ; text attribute int 0x10 ; invoke BIOS ret _display_endl: mov ah, 0x0E ; BIOS teletype acts on newline! mov al, 0x0D mov bh, 0x00 mov bl, 0x07 int 0x10 mov ah, 0x0E ; BIOS teletype acts on linefeed! mov al, 0x0A mov bh, 0x00 mov bl, 0x07 int 0x10 ret _display_prompt: mov si, strPrompt mov al, 0x01 int 0x21 ret [SEGMENT .data] strWelcomeMsg db "Welcome to GeoLiz NaviOS", 0x00 strPrompt db "==>", 0x00 cmdMaxLen db 255 ;maximum length of commands strOsName db "GeoLiz", 0x00 ;OS details strMajorVer db "0", 0x00 strMinorVer db ".7", 0x0D, 0x0A, 0x00 strHelp db "List of ", 0x00 ;Help strCmdOne db "ver-Get version ", 0x0D, 0x0A, 0x00 strCmdTwo db "exit-Reboot ", 0x0D, 0x0A, 0x00 strCmdThree db "date-Get date today ", 0x0D, 0x0A, 0x00 strCmdFour db "time-Get time now ", 0x0D, 0x0A, 0x00 strCmdFive db "help-list commands ", 0x0D, 0x0A, 0x00 strCmdSix db "abt-about creator", 0x0D, 0x0A, 0x00 strAbout db "GeoLiz NaviOS", 0x0D, 0x0A, 0x00 ;about OS strMajorAbt db "Creators: Geo and Liz", 0x0D, 0x0A, 0x00 strMinorAbt db " Created: Sept.20,2007", 0x0D, 0x0A, 0x00 cmdVer db "ver", 0x00 ; internal commands cmdExit db "exit", 0x00 cmdDate db "date", 0x00 cmdTime db "time", 0x00 cmdHlp db "help", 0x00 cmdAbt db "abt", 0x00 cmdCls db "cls", 0x00 datestring times 0Eh db 0 txtVersion db "Version", 0x00 ;messages and other strings txtHelp db "Commands:", 0x0D, 0x0A, 0x00 txtAbout db "About", 0x0D, 0x0A, 0x00 msgUnknownCmd db "Unknown command!", 0x00 [SEGMENT .bss] strUserCmd resb 256 ;buffer for user commands cmdChrCnt resb 1 ;count of characters strCmd0 resb 256 ;buffers for the command components strCmd1 resb 256 strCmd2 resb 256 strCmd3 resb 256 strCmd4 resb 256 ;********************end of the kernel code********************
You have several "int 0x21" calls in your code. These are DOS calls:
http://www.ctyme.com/intr/int-21.htm
Since DOS is not loaded (indeed, you are writing your own OS), then you cannot use these functions. You must restrict yourself to just the BIOS calls.
Nathan.
http://www.ctyme.com/intr/int-21.htm
Since DOS is not loaded (indeed, you are writing your own OS), then you cannot use these functions. You must restrict yourself to just the BIOS calls.
Nathan.
while (CPU is present) {some assembly required}
![]() |
Similar Threads
- Help, Im A Unix Novice (Getting Started and Choosing a Distro)
- shell commands in python (Python)
- request help :listing directories with php >> changing to use shell commands: how to? (PHP)
- How to execute shell command form Java servlet? (Java)
- Linux shell commands on Windows (IT Professionals' Lounge)
- problem in using pppd in shell script (Shell Scripting)
- can I invoke dos commands thru Java? (Java)
- writing a script (Shell Scripting)
Other Threads in the Assembly Forum
- Previous Thread: CALENDAR in TASM!!(pls check my code!!:)
- Next Thread: .wav file on x86
Views: 875 | Replies: 2
| Thread Tools | Search this Thread |
Tag cloud for Assembly
3d 68hc11 6811 80386 adress array asm assembler assembly boot bootloader buffer compression cursor debug directory division docs dos draw emulator endtask error exceptions file int10h integer intel interrupt interrupts language loop nohau osdevelopment print program range read remainder shape string text theory tsr x86





