Compare Two Strings with Assembly (Linux x86 & NASM)

Programming, for all ages and all languages.
Locked
nicoobe
Posts: 8
Joined: Wed Feb 22, 2012 12:19 am

Compare Two Strings with Assembly (Linux x86 & NASM)

Post by nicoobe »

Hello,
I need help debuging my code. Basically it compares str1 with str2. If str1 is equal to str2 it prints on screen "Good". If they are not equal it prints "Bad".
My problem is that the result I get when 2 strings are equal is:

Good
Bad
abcdeabcde

And when they are diferent:

Bad
abcdeabbde

Here I leave my code:

Code: Select all


section .data
	msg1:		db	'Good',10 ; msg1
	msg2:		db	'Bad',10 ; msg2

	str1:		db	'abcde' ; str1
	str2:		db	'abcde' ; str2

	lenmsg1:	equ	$-msg1 ; length msg1
	lenmsg2:	equ	$-msg2 ; length msg2

	lenstr1:	equ	$-str1 ; length str1
	lenstr2:	equ	$-str2 ; length str2

section .text

	global _start

_start:
	mov esi,str1
	mov edi,str2
	mov ecx,lenstr2
	cld
	repe cmpsb
	jecxz good

	; If bad

	mov eax,4
	mov ebx,1
	mov ecx,msg2
	mov edx,lenmsg2
	int 80h
	jmp exit

good:
	mov eax,4
	mov ebx,1
	mov ecx,msg1
	mov edx,lenmsg1
	int 80h


exit:
	mov eax,1
	mov ebx,0
	int 80h
Thanks for reading.
nicoobe
Posts: 8
Joined: Wed Feb 22, 2012 12:19 am

Re: Compare Two Strings with Assembly (Linux x86 & NASM)

Post by nicoobe »

I know it seems i make 2 equal topics but they are diferent. The code and the help I am asking for is diferent.
User avatar
bubach
Member
Member
Posts: 1223
Joined: Sat Oct 23, 2004 11:00 pm
Location: Sweden
Contact:

Re: Compare Two Strings with Assembly (Linux x86 & NASM)

Post by bubach »

How about terminating the string with a zero? It's pretty obvious that the function for printing doesn't know when to stop and just keeps going.

EDIT: Oh my bad. Noticed now that you use "lenmsg1: equ $-msg1 ; length msg1"... But since it calculates length based on start of string to current position ($) this should be located DIRECTLY after the string in question otherwise it will hold the length of everything from the start of that string down to where you put it.
"Simplicity is the ultimate sophistication."
http://bos.asmhackers.net/ - GitHub
nicoobe
Posts: 8
Joined: Wed Feb 22, 2012 12:19 am

Last Bug

Post by nicoobe »

Thanks you very much. Now my code is almost perfect.

The only problem is that my program is not comparing the last char of the strings.

For example:

If STR1 = 'ABCDE' and STR2 = 'ABCDD', my program would say that both strings are equal.

The rest works fine.

How can I fix that bug?
User avatar
VolTeK
Member
Member
Posts: 815
Joined: Sat Nov 15, 2008 2:37 pm
Location: The Fire Nation

Re: Compare Two Strings with Assembly (Linux x86 & NASM)

Post by VolTeK »

nicoobe wrote:   mov ecx,lenstr2
   cld
   repe cmpsb
   jecxz good

Glad it works. A forewarning however,

-Do NOT ask us to debug your code to help find out whats wrong. I do not believe in leaving a troublesome animal at someone else's door and hoping they will take care of it (posting code and asking for help). This is usually a problem in the programming skills portion of the developer, and it is skills that are in need of practice. Combuster had referred to you a link to better your assembler skills, follow it.

-And do NOT post double topics to raise your chance of getting a better answer. I know its the same question, both code compare, and both code had problems.



As for your next question, it sounds like a counter error, or finding the string termination to early. This is another example of what assembler practice can do for you. Saves time, and questions.
nicoobe
Posts: 8
Joined: Wed Feb 22, 2012 12:19 am

Re: Compare Two Strings with Assembly (Linux x86 & NASM)

Post by nicoobe »

Thanks for the help. But I can still not found a solution for the problem I mention before.

Maybe I could write:

Code: Select all

mov ecx, lenstr2 + 1 
But I don't think is a very elegant solution.
Any idea?
User avatar
VolTeK
Member
Member
Posts: 815
Joined: Sat Nov 15, 2008 2:37 pm
Location: The Fire Nation

Re: Compare Two Strings with Assembly (Linux x86 & NASM)

Post by VolTeK »

Compile it and see. If not, run it through a debugger and check the values your self.

Emu8086 is a nice one.
nicoobe
Posts: 8
Joined: Wed Feb 22, 2012 12:19 am

Re: Compare Two Strings with Assembly (Linux x86 & NASM)

Post by nicoobe »

Yes, that solve my problem. :D =D>

Thank you very much.

Here is my final code working correctly:

Code: Select all

section .data

   msg1:      db   'Good',10 ; msg1
   lenmsg1:   equ   $-msg1 ; length msg1

   msg2:      db   'Bad',10 ; msg2
   lenmsg2:   equ   $-msg2 ; length msg2

   str1:      db   'abcde' ; str1
   lenstr1:   equ   $-str1 ; length str1

   str2:      db   'abcde' ; str2
   lenstr2:   equ   $-str2 ; length str2

section .text

   global _start

_start:
   mov esi,str1
   mov edi,str2
   mov ecx,lenstr2+1
   cld
   repe cmpsb
   jecxz good

   ; If bad

   mov eax,4
   mov ebx,1
   mov ecx,msg2
   mov edx,lenmsg2
   int 80h
   jmp exit

good:
   mov eax,4
   mov ebx,1
   mov ecx,msg1
   mov edx,lenmsg1
   int 80h


exit:
   mov eax,1
   mov ebx,0
   int 80h
PD: Im sorry for making 2 topics :( I wont do it again
Locked