Manuel Skrevet 15. september 2004 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
kingkong Skrevet 15. september 2004 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
Velmont Skrevet 15. september 2004 Skrevet 15. september 2004 AaaaaAaAaARgh! *løpe å gjemme seg* asm er seriøst skremmende. :|
Manuel Skrevet 15. september 2004 Forfatter 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.
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å