siggivara Skrevet 26. april 2009 Del Skrevet 26. april 2009 (endret) 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 26. april 2009 av siggivara Lenke til kommentar
x871kx6167ss7 Skrevet 28. april 2009 Del Skrevet 28. april 2009 (endret) 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 28. april 2009 av Blackslash Lenke til kommentar
LostOblivion Skrevet 30. april 2009 Del Skrevet 30. april 2009 (endret) # 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 30. april 2009 av LostOblivion Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå