Project Description
- Implement the strcmp() function. The strcmp() function compares the two strings s1and s2. It returns an integer less than, equal to, or greater than zero if s1 is found, respectively, to be less than, to match, or be greater than s2. You should write a program that asks for two strings and print out the result of the comparison.
- Implement a function strreverse() that takes two strings s1 and s2. It should write the reverse of s1 into s2. For example, if s1 is “abc”, then after the function is invoked, s2 has the value of “cba”. Your program should ask for a string and print out its reverse
Submission Instructions:
Please submit via email the following:
– The assembly source code
– The outputs of the programs
Note on testing of the programs:
As part of testing, you should make sure that your program works for all the cases. Please test your code as thorough as possible.
Solution file consists of 3 files as below
Driver.c, first.asm and output.txt
Driver.c:
#include <stdio.h>
int strcmp2(const char *s1, const char *s2); // we use strcmp2, because libc already have function with name strcmp
void strreverse(const char *s1, char *s2);
int main()
{
char buffer[40];
printf(“strcmp(“abc”, “abc”) %dn”, strcmp2(“abc”, “abc”));
printf(“strcmp(“acc”, “abc”) %dn”, strcmp2(“acc”, “abc”));
printf(“strcmp(“abb”, “abc”) %dn”, strcmp2(“abb”, “abc”));
strreverse(“hello”, buffer);
printf(“strreverse for “hello” %sn”, buffer);
strreverse(“abc”, buffer);
printf(“strreverse for “abc” %sn”, buffer);
return 0;
}
First.asm
;
; file: skel.asm
; This file is a skeleton that can be used to start assembly programs.
%include “asm_io.inc”
segment .data
;
; initialized data is put in the data segment here
;
segment .bss
;
; uninitialized data is put in the bss segment
;
segment .text
global _strcmp2 ; this name only for testing, because libc already have function with name strcmp
global _strcmp ; export strcmp function
global _strreverse ; export strreverse function
_strcmp2:
_strcmp:
push edx ; save edx
push ecx ; save ecx
mov eax, [esp + 12] ; load s1 to eax
mov edx, [esp + 16] ; load s2 to edx
strcmp_1:
cmp byte [eax], 0 ; check on zero if (*s1 == ”)
je strcmp_2 ; if zero go out from loop
cmp byte [edx], 0 ; check on zero if (*s2 == ”)
je strcmp_2 ; if zero go out from loop
mov cl, [edx]
cmp [eax], cl ; if (*s1 != *s2)
jne strcmp_2
inc eax ; ++s1
inc edx ; ++s2
jmp strcmp_1 ; go to next iteration
strcmp_2:
mov cl, [eax] ; cl = *s1
sub cl, [edx] ; cl -= *s2
movsx eax, cl ; extend cl to eax
pop ecx ; restore ecx
pop edx ; restore edx
ret
_strreverse:
push eax ; save eax
push edx ; save edx
push ecx ; save ecx
push ebx ; save ebx
mov eax, [esp + 20] ; load s1 to eax
mov edx, eax ; edx = eax
strreverse_1:
cmp byte [edx], 0 ; if (*s1 == ”)
je strreverse_2 ; if zero go out from loop
inc edx ; ++s1
jmp strreverse_1 ; go to next iteration
strreverse_2:
dec edx ; –s1
mov ecx, [esp + 24] ; load s2 to ecx
strreverse_3:
cmp eax, edx ; if (eax > s1), eax – initial pointer to s1
ja strreverse_4 ; if greater go out from loop
mov bl, [edx]
mov [ecx], bl ; *s2 = *s1
dec edx ; –s1
inc ecx ; ++s2
jmp strreverse_3 ; go to next iteration
strreverse_4:
mov byte [ecx], 0
pop ebx ; restore ebx
pop ecx ; restore ecx
pop edx ; restore edx
pop eax ; restore eax
ret
Output.txt:
strcmp(“abc”, “abc”) 0
strcmp(“acc”, “abc”) 1
strcmp(“abb”, “abc”) -1
strreverse for “hello” olleh
strreverse for “abc” cba
Project Details
- Date April 2, 2015
- Tags Assembly language