Tuesday, 14 April 2015

String Concatenation & Substring in Assembly Language

*****************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

1 comment: