2017-07-23 1 views
0

Introductionasm X86 - erreur de segmentation?

Je suis le livre "ProgrammingGroundUp". et j'ai suivi l'exemple de la création d'une fonction pour augmenter la puissance de deux nombres et les ajouter. "2^3 + 5^2". Cependant, quand je vais compiler le code, puis exécutez le programme. Je reçois une erreur de segmentation. D'après ce que je comprends, une erreur de segmentation se produit lorsqu'un programme tente de faire une lecture ou une écriture illégale à partir d'un emplacement de mémoire. Je pense qu'il pourrait se produire à l'intérieur de la fonction elle-même, cependant confus de l'endroit où la faute de segmentation s'est produite.

Code source - power.s

#purpose illustrate how functions work. Program will compute 2^3 + 5^2 
#using registers so nothing in data section 
.section .data 

.section .text 
.globl _start 
_start: 
pushl $3  #push 2nd arg on stack 
pushl $2  #push 1st arg on stack 
call power 

addl 8,%esp  #move stack pointer back 
pushl %eax  #push result to top of stack 

pushl $2  #push 2nd arg on stack 
pushl $5  #push 1st arg on stack 
call power 

addl 8,%esp  #move stack pointer back 

popl %ebx  #put function1 result into ebx reg 
addl %eax , %ebx  #add return result of function2 + function1 result 

movl $1 , %eax #exit system call 
int $0x80 

#PURPOSE: power function 
#REGISTERS: %ebx - holds base number ; %ecx - holds power; -4(%ebp) -holds current result ;%eax temp storage 

.type power,@function 
power: 
pushl %ebp  #save state of base pointer 
movl %esp,%ebp #make stack pointer the base pointer 
subl $4,%esp  #room for local storage 

movl 8(%ebp),%ebx #1st arg initialized, 
movl 12(%ebp),%ecx #2nd arg initialized, 
movl %ebx , -4(%ebp) #store current result 

power_loop_start: 
cmpl $1,%ecx  #if ^1 then jump to end_power & exit 
je end_power 

movl -4(%ebp),%eax #store current result 
imull %ebx,%eax #multiply 
movl %eax,-4(%ebp) #store result 

decl %ecx   #decrement ecx 
jmp power_loop_start #loop 

end_power:   #return 
movl -4(%ebp) , %eax  #move result in eax for return 
movl %ebp , %esp  #reset the stack pointer 
popl %ebp   #reset base pointer to original position 
ret    #return 

Compiler
as --32 power.s -o power.o 
ld -m elf_i386 power.o -o power 
./power 

Segmentation fault

Somm ary

Erreur de segmentation se produisant dans le code, je ne sais pas où est exactement, très nouveau à l'assemblage, a essayé d'expliquer le mieux possible. BTW a utilisé le "--32" car le code est 32bit et je suis sur une machine 64bit.

* Aussi, si ma question ne répond pas aux normes de débordement de pile, veuillez me le faire savoir afin que je puisse m'améliorer.

+2

Juste un coup d'oeil rapide. Des lignes comme 'addl 8,% esp' ne font pas ce que vous voulez. Il devrait être 'addl $ 8,% esp' (pas le' $ 'devant pour indiquer une valeur immédiate et pas un opérande de mémoire) –

+0

* facepalm * vous avez raison. Comment diable ai-je manqué cela? @Michael Petch – digitalXmage

+0

Il est probablement trop tard pour commenter, mais la raison * technique * que vous avez expérimenté un segfault est parce que "ADDL 8,% ESP" accède à une adresse mémoire qui est hors limites pour votre programme segment de mémoire sur votre ordinateur. :) –

Répondre

2

Grâce à @Michael Petch pour repérer l'erreur de syntaxe. Dans des lignes telles que "addl 8,% esp" je n'ai pas mis le signe dollar, ce qui signifie une valeur et non une adresse mémoire car l'instruction est l'adressage immédiat. Cependant j'ai mis le signe dollar qui en fait une adresse mémoire. Merci pour ton aide.