Microprocessor/Codes/Practical-7.asm

314 lines
5.4 KiB
NASM
Raw Normal View History

; THIS CODE HAS NOT BEEN TESTED AND IS NOT FULLY OPERATIONAL.
; Problem Statement: Write X86 Assembly Language Program (ALP) to implement following OS commands: i. TYPE, ii. COPY and iii. DELETE
; Using file operations. User is supposed to provide command line arguments in all cases.
; Code from Microprocessor (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-content/Microprocessor/
; BEGINNING OF CODE
%macro cmn 4 ;input/output
mov rax,%1
mov rdi,%2
mov rsi,%3
mov rdx,%4
syscall
%endmacro
%macro exit 0
mov rax,60
mov rdi,0
syscall
%endmacro
%macro fopen 1
mov rax,2 ;open
mov rdi,%1 ;filename
mov rsi,2 ;mode RW
mov rdx,0777o ;file permissions
syscall
%endmacro
%macro fread 3
mov rax,0 ;read
mov rdi,%1 ;filehandle
mov rsi,%2 ;buf
mov rdx,%3 ;buf_len
syscall
%endmacro
%macro fwrite 3
mov rax,1 ;write/print
mov rdi,%1 ;filehandle
mov rsi,%2 ;buf
mov rdx,%3 ;buf_len
syscall
%endmacro
%macro fclose 1
mov rax,3 ;close
mov rdi,%1 ;file handle
syscall
%endmacro
section .data
menu db 'MENU:',0Ah
db "1 -> TYPE",0Ah
db "2 -> COPY",0Ah
db "3 -> DELETE",0Ah
db "4 -> EXIT",0Ah
db "Choose an option (1-4): "
menulen equ $-menu
msg db "Command: "
msglen equ $-msg
cpysc db "Successfully copied the file.",0Ah
cpysclen equ $-cpysc
delsc db "File deletion successful.",0Ah
delsclen equ $-delsc
err db "Error!",0Ah
errlen equ $-err
cpywr db "Command does not exist.",0Ah
cpywrlen equ $-cpywr
err_par db "Insufficient parameter.",0Ah
err_parlen equ $-err_par
section .bss
choice resb 2
buffer resb 50
name1 resb 15
name2 resb 15
cmdlen resb 1
filehandle1 resq 1
filehandle2 resq 1
abuf_len resq 1 ;actual buffer length
dispnum resb 2
buf resb 4096
buf_len equ $-buf ;buffer initial length
section .txt
global _start
_start:
again: cmn 1,1,menu,menulen
cmn 0,0,choice,2
mov al,byte[choice]
cmp al,31h
jbe op1
cmp al,32h
jbe op2
cmp al,33h
jbe op3
exit
ret
op1:
call tproc
jmp again
op2:
call cpproc
jmp again
op3:
call delproc
jmp again
;type command procedure
tproc:
cmn 1,1,msg,msglen
cmn 0,0,buffer,50
mov byte[cmdlen],al
dec byte[cmdlen]
mov rsi,buffer
mov al,[rsi] ;search for correct type command
cmp al,'t'
jne skipt
inc rsi
dec byte[cmdlen]
jz skipt
mov al,[rsi]
cmp al,'y'
jne skipt
inc rsi
dec byte[cmdlen]
jz skipt
mov al,[rsi]
cmp al,'p'
jne skipt
inc rsi
dec byte[cmdlen]
jz skipt
mov al,[rsi]
cmp al,'e'
jne skipt
inc rsi
dec byte[cmdlen]
jnz correctt
cmn 1,1,err_par,err_parlen
call exit
skipt: cmn 1,1,cpywr,cpywrlen
exit
correctt:
mov rdi,name1 ;finding file name
call find_name
fopen name1 ;on success returns handle
cmp rax,-1H ;on failure returns -1
jle error
mov [filehandle1],rax
xor rax,rax
fread [filehandle1],buf,buf_len
mov [abuf_len],rax
dec byte[abuf_len]
cmn 1,1,buf,abuf_len ;printing file content on screen
ret
;copy command procedure
cpproc:
cmn 1,1,msg,msglen
cmn 0,0,buffer,50 ;accept command
mov byte[cmdlen],al
dec byte[cmdlen]
mov rsi,buffer
mov al,[rsi] ;search for copy
cmp al,'c'
jne skip
inc rsi
dec byte[cmdlen]
jz skip
mov al,[rsi]
cmp al,'o'
jne skip
inc rsi
dec byte[cmdlen]
jz skip
mov al,[rsi]
cmp al,'p'
jne skip
inc rsi
dec byte[cmdlen]
jz skip
mov al,[rsi]
cmp al,'y'
jne skip
inc rsi
dec byte[cmdlen]
jnz correct
cmn 1,1,err_par,err_parlen
exit
skip: cmn 1,1,cpywr,cpywrlen
exit
correct:
mov rdi,name1 ;finding first file name
call find_name
mov rdi,name2 ;finding second file name
call find_name
skip3: fopen name1 ;on success returns handle
cmp rax,-1H ;on failure returns -1
jle error
mov [filehandle1],rax
fopen name2 ;on success returns handle
cmp rax,-1H ;on failure returns -1
jle error
mov [filehandle2],rax
xor rax,rax
fread [filehandle1],buf,buf_len
mov [abuf_len],rax
dec byte[abuf_len]
fwrite [filehandle2],buf,[abuf_len] ;write to file
fclose [filehandle1]
fclose [filehandle2]
cmn 1,1,cpysc,cpysclen
jmp again
error:
cmn 1,1,err,errlen
exit
ret
;delete command procedure
delproc:
cmn 1,1,msg,msglen
cmn 0,0,buffer,50 ;accept command
mov byte[cmdlen],al
dec byte[cmdlen]
mov rsi,buffer
mov al,[rsi] ;search for copy
cmp al,'d'
jne skipr
inc rsi
dec byte[cmdlen]
jz skipr
mov al,[rsi]
cmp al,'e'
jne skipr
inc rsi
dec byte[cmdlen]
jz skipr
mov al,[rsi]
cmp al,'l'
jne skipr
inc rsi
dec byte[cmdlen]
jnz correctr
cmn 1,1,err_par,err_parlen
exit
skipr: cmn 1,1,cpywr,cpywrlen
exit
correctr:
mov rdi,name1 ;finding first file name
call find_name
mov rax,87 ;unlink system call
mov rdi,name1
syscall
cmp rax,-1H ;on failure returns -1
jle errord
cmn 1,1,delsc,delsclen
jmp again
errord:
cmn 1,1,err,errlen
exit
ret
find_name: ;finding file name from command
inc rsi
dec byte[cmdlen]
cont1: mov al,[rsi]
mov [rdi],al
inc rdi
inc rsi
mov al,[rsi]
cmp al,20h ;searching for space
je skip2
cmp al,0Ah ;searching for enter key
je skip2
dec byte[cmdlen]
jnz cont1
cmn 1,1,err,errlen
exit
skip2:
ret
; END OF CODE