Manuel Skrevet 15. september 2004 Del Skrevet 15. september 2004 (endret) Lurer på om noen kan se feilen i dette programmet: .globl maximum ##START maximum-funksjon #maximum analyserer en streng med tall, og returnerer det største tallet i %eax. Funksjonen tar 2 #argumenter #1. argumentet er pekeren til den strengen som skal analyseres #2. argumentet er lengden på strengen i WORDS .type maximum,@function maximum: #%edx - Adressen til strengen #%ecx - Lengden på strengen i "words" #%eax - Inneholder det største tallet #%ebx - Tallet som skal analyseres pushl %ebp movl %esp,%ebp movl 8(%ebp),%edx #Adressen til strengen movl 12(%ebp),%ecx #Lengden på strengen som skal analyseres movl $0,%eax #%eax nullstilles compare_loop: movl (%edx),%ebx cmpl $0,%ecx je max_end decl %ecx addl $4,%edx cmpl %ebx,%eax jge compare_loop movl %ebx,%eax jmp compare_loop max_end: movl %ebp,%esp pushl %ebp ret ##AVSLUTT maximum-funksjon .section .data number_array: .long 123,255,165,234,0,54,32 .section .text .globl _start _start: movl $number_array,%eax movl $6,%ebx pushl %eax #1. argumentet,strengadressen pushl %ebx #2. argumentet,lengden på strengen call maximum movl %eax,%ebx movl $1,%eax int $0x80 Poster den her da det er relatert til assembly-programmering i GNU/Linux .... Endret 15. september 2004 av Manuel Lenke til kommentar
kingkong Skrevet 15. september 2004 Del Skrevet 15. september 2004 (endret) Virker som du push'er på stakken uten å pop'e ut igjen det du har lagt inn, noe som vil føre til at stakken har feil returadresse og at instruksjonspekeren forsøker å hoppe tilbake til en adresse utenfor gjeldende page - noe som medfører en segfault. Veldig viktig at stakken har samme innhold når man går inn i en subrutine som når man går ut igjen (som med "ret" her). Endret 15. september 2004 av kingkong Lenke til kommentar
Velmont Skrevet 15. september 2004 Del Skrevet 15. september 2004 AaaaaAaAaARgh! *løpe å gjemme seg* asm er seriøst skremmende. :| Lenke til kommentar
Manuel Skrevet 15. september 2004 Forfatter Del Skrevet 15. september 2004 Jeg fant feilen nå. Til dels skyldes den at jeg ikke pop'et det jeg hadde lagret på stacket, slik at %esp ikke inneholdt returadressen som call pushet på stacket, men den gamle verdien i %ebp. I tillegg "speilvendte" ble argumentene hentet på feil måte, slik at "telleren", %ecx, inneholdt adressen, mens %edx inneholdt lengden.... Riktig kode er iallfall: .section .data number_array: .long 123,255,165,234,0,54,32 .section .text .globl _start _start: movl $number_array,%eax movl $6,%ebx pushl %eax #1. argumentet,strengadressen pushl %ebx #2. argumentet,lengden på strengen call maximum movl %eax,%ebx addl $8,%esp movl $1,%eax int $0x80 .globl maximum ##START maximum-funksjon #maximum analyserer en streng med tall, og returnerer det største tallet i %eax. Funksjonen tar 2 #argumenter #1. argumentet er pekeren til den strengen som skal analyseres #2. argumentet er lengden på strengen i WORDS .type maximum,@function maximum: #%edx - Adressen til strengen #%ecx - Lengden på strengen i "words" #%eax - Inneholder det største tallet #%ebx - Tallet som skal analyseres pushl %ebp movl %esp,%ebp movl 12(%ebp),%edx #Adressen til strengen movl 8(%ebp),%ecx #Lengden på strengen som skal analyseres movl $0,%eax #%eax nullstilles compare_loop: movl (%edx),%ebx cmpl $0,%ecx je max_end decl %ecx addl $4,%edx cmpl %ebx,%eax jge compare_loop movl %ebx,%eax jmp compare_loop max_end: movl %ebp,%esp popl %ebp ret ##AVSLUTT maximum-funksjon Det er også en liten praktisk feil her, i form av at funksjonsargumenter burde pushes fra siste til første argument. 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å