*****************PROGRAM************************
STRING CONCATENATION & SUBSTRING
*******************************************************
PROGRAM 1:
global m2,l2,m3,l3,m4,l4,m5,l5,m6,l6,str1,str2,cnt1,cnt2
extern strcat,substr
%macro read 2
mov rax,0
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro write 2
mov rax,1
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro exit 0
mov rax,60
mov rdi,0
syscall
%endmacro
section .data
m1 db 10,"MENU",10
db "1.String Concatenation",10
db "2.Substring",10
db "3.Exit",10
db "Enter Your Choice: "
l1 equ $-m1
m2 db 10, "Enter First String: "
l2 equ $-m2
m3 db "Enter Second String: "
l3 equ $-m3
m4 db 10,"The New String is: "
l4 equ $-m4
m5 db 10,"It is a Substring"
l5 equ $-m5
m6 db 10,"It is not a Substring"
l6 equ $-m6
section .bss
choice resb 2
cnt1 resq 1
cnt2 resq 1
str1 resb 30
str2 resb 30
section .text
global _start
_start:
menu: write m1,l1
read choice,2
cmp byte[choice],31h
je ch1
cmp byte[choice],32h
je ch2
cmp byte[choice],33h
je ch3
ch1:call strcat
jmp menu
ch2: call substr
jmp menu
ch3:exit
PROGRAM 2:
global strcat,substr
extern m2,l2,m3,l3,m4,l4,m5,l5,m6,l6,str1,str2,cnt1,cnt2,ctr
%macro read 2
mov rax,0
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro write 2
mov rax,1
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
section .data
section .bss
section .text
global _start:
strcat: write m2,l2
read str1,30
dec rax
mov qword[cnt1],rax
write m3,l3
read str2,30
dec rax
mov qword[cnt2],rax
mov rcx,qword[cnt1]
add qword[cnt2],rcx
mov rsi,str1
add rsi,qword[cnt1]
mov rdi,str2
cpy1: mov bl,byte[rdi]
mov byte[rsi],bl
inc rsi
inc rdi
dec rax
jnz cpy1
write m4,l4
write str1,qword[cnt2]
ret
substr: write m2,l2
read str1,30
dec rax
mov qword[cnt1],rax
write m3,l3
read str2,30
dec rax
mov qword[cnt2],rax
mov rcx,rax
mov rsi,str1
mov rdi,str2
mov rbx,00
logic: mov al,byte[rsi]
cmp al,byte[rdi]
je same
cmp rbx,02
je up
mov rdi,str2
mov rcx,qword[cnt2]
inc rbx
jmp logic
up: inc rsi
dec qword[cnt1]
jz nt
jmp logic
same: inc rsi
inc rdi
dec rcx
jz st
dec qword[cnt1]
jz nt
jmp logic
st: write m5,l5
ret
nt: write m6,l6
ret
*********************OUTPUT*********************
sourabh@ubuntu:~$ nasm -f elf64 prog1.asm
sourabh@ubuntu:~$ nasm -f elf64 prog2.asm
sourabh@ubuntu:~$ ld -o prog1.exe prog1.o prog2.o
sourabh@ubuntu:~$ ./prog1.exe
MENU
1.String Concatenation
2.Substring
3.Exit
Enter Your Choice: 1
Enter First String: GOOD
Enter Second String: MORNING
The New String is: GOODMORNING
MENU
1.String Concatenation
2.Substring
3.Exit
Enter Your Choice: 2
Enter First String: HELLO
Enter Second String: LOL
It is not a Substring
STRING CONCATENATION & SUBSTRING
*******************************************************
PROGRAM 1:
global m2,l2,m3,l3,m4,l4,m5,l5,m6,l6,str1,str2,cnt1,cnt2
extern strcat,substr
%macro read 2
mov rax,0
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro write 2
mov rax,1
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro exit 0
mov rax,60
mov rdi,0
syscall
%endmacro
section .data
m1 db 10,"MENU",10
db "1.String Concatenation",10
db "2.Substring",10
db "3.Exit",10
db "Enter Your Choice: "
l1 equ $-m1
m2 db 10, "Enter First String: "
l2 equ $-m2
m3 db "Enter Second String: "
l3 equ $-m3
m4 db 10,"The New String is: "
l4 equ $-m4
m5 db 10,"It is a Substring"
l5 equ $-m5
m6 db 10,"It is not a Substring"
l6 equ $-m6
section .bss
choice resb 2
cnt1 resq 1
cnt2 resq 1
str1 resb 30
str2 resb 30
section .text
global _start
_start:
menu: write m1,l1
read choice,2
cmp byte[choice],31h
je ch1
cmp byte[choice],32h
je ch2
cmp byte[choice],33h
je ch3
ch1:call strcat
jmp menu
ch2: call substr
jmp menu
ch3:exit
PROGRAM 2:
global strcat,substr
extern m2,l2,m3,l3,m4,l4,m5,l5,m6,l6,str1,str2,cnt1,cnt2,ctr
%macro read 2
mov rax,0
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro write 2
mov rax,1
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
section .data
section .bss
section .text
global _start:
strcat: write m2,l2
read str1,30
dec rax
mov qword[cnt1],rax
write m3,l3
read str2,30
dec rax
mov qword[cnt2],rax
mov rcx,qword[cnt1]
add qword[cnt2],rcx
mov rsi,str1
add rsi,qword[cnt1]
mov rdi,str2
cpy1: mov bl,byte[rdi]
mov byte[rsi],bl
inc rsi
inc rdi
dec rax
jnz cpy1
write m4,l4
write str1,qword[cnt2]
ret
substr: write m2,l2
read str1,30
dec rax
mov qword[cnt1],rax
write m3,l3
read str2,30
dec rax
mov qword[cnt2],rax
mov rcx,rax
mov rsi,str1
mov rdi,str2
mov rbx,00
logic: mov al,byte[rsi]
cmp al,byte[rdi]
je same
cmp rbx,02
je up
mov rdi,str2
mov rcx,qword[cnt2]
inc rbx
jmp logic
up: inc rsi
dec qword[cnt1]
jz nt
jmp logic
same: inc rsi
inc rdi
dec rcx
jz st
dec qword[cnt1]
jz nt
jmp logic
st: write m5,l5
ret
nt: write m6,l6
ret
*********************OUTPUT*********************
sourabh@ubuntu:~$ nasm -f elf64 prog1.asm
sourabh@ubuntu:~$ nasm -f elf64 prog2.asm
sourabh@ubuntu:~$ ld -o prog1.exe prog1.o prog2.o
sourabh@ubuntu:~$ ./prog1.exe
MENU
1.String Concatenation
2.Substring
3.Exit
Enter Your Choice: 1
Enter First String: GOOD
Enter Second String: MORNING
The New String is: GOODMORNING
MENU
1.String Concatenation
2.Substring
3.Exit
Enter Your Choice: 2
Enter First String: HELLO
Enter Second String: LOL
It is not a Substring
Why have we linked 2 object files?
ReplyDelete