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.
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) –
* facepalm * vous avez raison. Comment diable ai-je manqué cela? @Michael Petch – digitalXmage
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. :) –