Gå til innhold

Segfault i asm-program.... Why?


Manuel

Anbefalte innlegg

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 av Manuel
Lenke til kommentar
Videoannonse
Annonse

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 av kingkong
Lenke til kommentar

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

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...