title: asm X86 - segmentation fault?
body: <p><strong>Introduction</strong></p>
  
  <p>I'm following "ProgrammingGroundUp" book. and I've followed the example of creating a function to raise the power of two numbers and adding them. "2^3 + 5^2". However when I go to compile the code, and then run the program. I receive a segmentation fault.</p>
  
  <p>From my understanding a segmentation fault occurs when a program attempts to do an illegal read or write from a memory location. I think it could be occurring inside the function itself, however confused of where the segmentation fault has occurred.</p>
  
  <p><strong>Source Code - power.s</strong></p>
  
  <pre><code>#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 &amp; 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
  </code></pre>
  
  <p><strong>Compiling</strong></p>
  
  <pre><code>as --32 power.s -o power.o
  ld -m elf_i386 power.o -o power
  ./power
  </code></pre>
  
  <blockquote>
    <p>Segmentation fault</p>
  </blockquote>
  
  <p><strong>Summary</strong></p>
  
  <p>Segmentation fault occurring in code, Not sure where is exactly, very new to assembly, tried to explain as best I can. BTW used the "--32" as the code is 32bit and I'm on a 64bit machine.</p>
  
  <p>*Also if my question doesn't meet stack overflow standards please let me know so I can improve.   </p>