section .data

	msg db 10,13,"Entered Array is"
	msg_l equ $-msg

	msg1 db 10,13,"Select Operation:"
	msg_l1 equ $-msg1

	msg2 db 10,13,"1.Overlapped Transfer"
	msg_l2 equ $-msg2

	msg3 db 10,13,"2.Non-Overlapped Transfer"
	msg_l3 equ $-msg3

	msg6 db 10,13,"4.Non-Overlapped Transfer with String Instruction"
	msg_l6 equ $-msg6

	msg7 db 10,13,"3.Overlapped Transfer with String Instruction"
	msg_l7 equ $-msg7

	msg4 db 10,13,"5.Exit"
	msg_l4 equ $-msg4

	msg5 db 10,13,"Enter Overlap position"
	msg_l5 equ $-msg5

	msg0 db 10,13,"Transferred Array is"
	msg_l0 equ $-msg0
	
	nwline db 10

	arr dd 11111111h,22222222h,33333333h,44444444h
	newarr times 8 dd 0


section .bss
	opt resb 2
	pos resb 1
	cnt resb 1
	cnt1 resb 1
	temp resb 1
	disp_buff resb 8

%macro display 2
	mov eax,4
	mov ebx,1
	mov ecx,%1
	mov edx,%2
	int 80h
%endmacro

%macro accept 2
	mov eax,3
	mov ebx,0
	mov ecx,%1
	mov edx,%2
	int 80h
%endmacro


section .data
global _start
_start:
		
		
		display msg1,msg_l1
		display msg2,msg_l2
		display msg3,msg_l3
		display msg7,msg_l7
		display msg6,msg_l6
		display msg4,msg_l4
		
		display nwline,1

		accept opt,2

		sub byte [opt],30h

		
		cmp byte [opt],01h
		je OVP

		cmp byte [opt],02h
		je NON_OVP

		cmp byte [opt],03h
		je OVP_S

		cmp byte [opt],04h
		je NON_OVP_S

		cmp byte [opt],05h
		je exit
	
		call exit

;----------------------------------OVP-----------------------------------------

OVP:
	display msg,msg_l
	
	mov byte [cnt],4h
	mov edi,arr	
	call original_to_ascii

	call COPYNUM	
	
	call COPY

	display msg0,msg_l0
	mov al,[pos]
	mov byte [cnt],al
	mov edi,arr
	call original_to_ascii
	
	jmp _start
original_to_ascii:
		
		push ecx
		display nwline,1
		pop ecx
		mov ebx,[edi]
		mov ecx,8
		mov esi,disp_buff
		
	l4:
		rol ebx,4
		mov dl,bl
		and dl,0fh
		cmp dl,09h
		jbe l5
		add dl,07h
	l5:
		add dl,30h
		mov [esi],dl
		inc esi
		loop l4
		
		add edi,4
		
		
		display disp_buff,8
		dec byte [cnt]
		jnz original_to_ascii
		
		display nwline,1
		
		ret
COPYNUM:
	mov esi,arr
	mov edi,arr

	mov byte [cnt],4h
pos_esi:
	add esi,4
	dec byte [cnt]
	jnz pos_esi
	sub esi,4

	display msg5,msg_l5
	display nwline,1
	accept pos,2
	sub byte [pos],30h

	mov byte [cnt],4h	
	mov al,[pos]
	add al,[cnt]
	mov [cnt],al
	dec byte [cnt]
	
	mov [pos],al
	dec byte [pos]

pos_edi:
	add edi,4
	dec byte [cnt]
	jnz pos_edi
	sub edi,4

	ret

COPY:
	mov byte [cnt1],4h
lnew:
	mov eax,[esi]
	mov [edi],eax
	sub esi,4
	sub edi,4
	dec byte [cnt1]
	jnz lnew
	
	ret



;------------------------------------------------------NON_OVP-----------------------------------------------


NON_OVP:
	display msg,msg_l

	mov edi,arr
	mov byte [cnt],4h
	call original_to_ascii
	
	call COPYNUMA

	display msg0,msg_l0
	mov byte [cnt],4h
	mov edi,newarr
	call original_to_ascii

	jmp _start
	

COPYNUMA:
	mov esi,arr
	mov edi,newarr
	mov byte [cnt1],4h

		
lnewA:
	mov eax,[esi]
	mov [edi],eax
	add esi,4
	add edi,4
	dec byte [cnt1]
	jnz lnewA
	
	ret

;----------------------------------------------------OVP_STRING-----------------------------
OVP_S:

	mov edi,arr
	mov byte [cnt],4h
	display msg,msg_l
	call original_to_ascii


	call COPYNUM

	display msg0,msg_l0
	std
	mov ecx,4
l1O:
	movsd
	loop l1O

	
	mov al,[pos]
	mov byte [cnt],al
	mov edi,arr
	call original_to_ascii

	jmp _start



;--------------------------------------------NON_OVP_STRING----------------------------------

NON_OVP_S:

	display msg,msg_l

	mov edi,arr
	mov byte [cnt],4h
	call original_to_ascii
	
	mov esi,arr
	mov edi,newarr
	mov ecx,4
l1S:
	movsd
	loop l1S

	display msg0,msg_l0
	mov byte [cnt],4h
	mov edi,newarr
	call original_to_ascii

	jmp _start


;--------------------------------------------EXIT--------------------------------------------

exit:		mov eax,1
		mov ebx,0
		int 80h
