Gå til innhold

Anbefalte innlegg

Jeg skal altså skrive en funksjon i AT&T assembly som skal sammenligne to char-arrayer sendt med som parametere fra et C-program.

Kallet i C ser slik ut

int arrcomp(char *s, char *format)

Funksjonen skal sjekke hvert element i arrayene mot hverandre og returnere -1 hvis noen av elementene i samme index-posisjon er ulike fra hverandre og returnere 1 hvis de er like.

 

Jeg er ikke veldig god på assembly men dette er forsøket jeg har gjort.

.globl arrcomp

arrcomp:
pushl 	%ebp			
movl 	%esp,%ebp
movl 	$0,%ecx				#Counter = 0
movl 	$0,%eax					   #%eax = 0

movl	12(%ebp),%ebx		#parameter 2
movl	 8(%ebp),%edx		#parameter 1.



loop:
addl	(%ebx,%ecx,1),%eax	   #Parameter2[i] store in %eax
subl	(%edx,%ecx,1),%eax	   #parameter1[i]-%eax store in %eax
jnz	b_exit			   #jump to b_exit if %ecx == 0

addl	$0,%eax						  #Reset %eax to 0
incl	%ecx							   #++Counter
jmp	loop	


a_exit:
addl $1, %eax							  #%eax = 1
ret											   #return 1


b_exit:
addl $-1,%eax							  #%eax = -1
ret											   #return -1

Meningen er at elementene blir subrahert hverandre og hvis svaret noengang ikke blir 0 så returneres -1.

 

Koden over gir "Segmentation fault" under kjøring, så det jeg trenger hjelp til er om denne koden vil fungere og hvis ideen er riktig, hvordan fikser jeg segmentation faulten?

Endret av siggivara
Lenke til kommentar
Videoannonse
Annonse

Aldri programmert assembly, og bare bittelitt c for ett år siden, så kan være jeg er helt på bærtur...

 

Det som ser ut som hovedproblemet er vel det at du ikke stopper når du kommer til null som terminerer stringen. Det du også må ta hensyn til er dersom to stringen er like helt til et punkt, der den ene slutter arrcomp("abcd", "abc").

 

edit: Går ikke ann å skrive '\ 0' uten mellomrom ser det ut som. :S

Endret av Blackslash
Lenke til kommentar

# int arrcmp(char *str, char *fmt);
.globl
arrcmp:
# Push ebp.
pushl	%ebp
movl	%esp, %ebp

# Init eax to 1.
movl	$1, %eax

# Move str to esi and fmt to edi.
movl	8(%ebp), %esi
movl	12(%ebp), %edi

# Check for null ptrs.
cmpl	$0, %esi
je	mismatch
cmpl	$0, %edi
je	mismatch
iter:
# while (*str && *fmt)
cmpb	$0, (%esi)
je	ret
cmpb	$0, (%edi)
je	ret

# if (*str == *fmt)
movb	(%esi), %dl
cmpb	%dl, (%edi)
jne	mismatch
incl	%esi
incl	%edi
jmp	iter
mismatch:
movl	$-1, %eax
ret:
# Pop ebp.
popl	%ebp
ret

Du må huske å poppe ebp på slutten, ellers ødelegger du stakken for kallern. :)

Endret av LostOblivion
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...