Jump to content
Sign in to follow this  
Manuel

Segfault i asm-program.... Why?

Recommended Posts

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

;)

Edited by Manuel

Share this post


Link to post

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

Edited by kingkong

Share this post


Link to post

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.

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...