Welcome to my stream. hope u don't drown.

Wrote the power function with proper rules and conventions. Learnt a lot

# There need to be made some rules for function calling otherwise large programs might spiral out of control
# 1. Every function will put it's return in value in %eax register
# 2. After any function is called and has returned we need to remove it's parameters from call stack
# 3. We can't rely on just the %esp register to get the parameters off the top of stack because it can change (for eg. if we decide to call another function inside a function we will push the parameters on top or we can reserve extra space for local variables by subl $8, %esp), therefore we'll point %ebp register to the top of stack.
# 4. We can't use registers to store local variables because they should be free for use for any other function we might call



.section .data

.section .text

.globl _start

_start:

pushl $2
pushl $3

call power #at this point return address was pushed to the top of stack

addl $8, %esp #remove the parameters of power from the top of stack

movl %eax, %ebx #move the result to %ebx

movl $1, %eax #prepare to call exit system call

int $0x80

#exponent would be at the top of the stack
#base would be second item of the stack
.type power, @function

power:
  #first we need to put the old base pointer at the top of stack
  pushl %ebp
  #now we need to point the new base pointer to the top of the stack
  movl %esp, %ebp
  #now we'll reserve 2 words for local variables  
  subl $8, %esp
  #we'll store current power in -8 (%ebp) and current result in -4 (%ebp)
  movl 8(%ebp),%ebx
  movl %ebx, -8(%ebp) 

  movl 12(%ebp),%ebx
  movl %ebx, -4(%ebp) #stack looks like this rn: 3, 2, old bp, retun addr, 3, 2
  jmp power_loop_start

  power_loop_start:
    cmpl $1,-8(%ebp)
    je power_loop_end

    #prepare to call multiply
    pushl -4(%ebp)
    pushl 12(%ebp)
    call multiply
    addl $8, %esp #remove the parameters of multiply from the top of stack
    #result of multiply is in %eax
    movl %eax, -4(%ebp)
    subl $1, -8(%ebp)
    jmp power_loop_start
  
  power_loop_end:
    movl -4(%ebp), %eax #stores the result in %eax register
    movl %ebp, %esp #remove the space reserved for local variables. Now at the top of stack is the old base pointer i.e value of base pointer before calling the power function
    popl %ebp #restore the old base pointer
    ret

  
.type multiply, @function
multiply:

  movl 4(%esp), %eax
  movl 8(%esp), %ebx

  imull %ebx, %eax
  ret
Hosted on streams.place.