Hi,
Unless I copied it wrong, the code above was written in the blackboard in a class by a student with the help/corrections of the teacher:
int array[100], sum, i;
void ini() {
  for(i = 0; i < 100; i++)
    array[i] = i;
}
int main() {
  ini();
  sum = 0;
  for(i = 0; i < 100; i++)
    sum += array[i];
}
.pos 0
  irmovl Stack, %esp
  rrmovl Stack, %ebp
  jmp main
array:
.pos 430
sum: .long 0
i: .long 0
main:
  call ini                     //
  irmovl $0, %eax              // %eax = 0
  irmovl sum, %esi             // %esi = 0xsum
  rmmovl %eax, 0(%esi)         // 0(%esi) = %eax <=> 0(0xsum) = 0 [sum = 0]
  rmmovl %eax, 4(%esi)         // 4(%esi) = %eax <=> 4(0xsum) = 0 [i = 0]
compare:
  irmovl $100, %ebx            // %ebx = 100
  subl %eax, %ebx              // %ebx = %ebx - %eax <=> %ebx = 100 - i
  jle finish                   // Jumps to "finish" if SF=1 pr ZF=0
  mrmovl 0(%esi), %edx         // %edx = 0(%esi) <=> %edx = 0(0xsum) = sum
  addl %eax, %edx              // %edx = %edx + %eax <=> %edx = sum + i => sum
  rmmovl %edx, 0($esi)         // 0(%esi) = %edx <=> 0(0xsum) = sum
  irmovl $1, %ecx              // %ecx = 1
  addl %ecx, %eax              // %eax = %eax + %ecx <=> %eax = i + 1 => i
  rmmovl %eax, 4(%esi)         // 4($esi) = %eax <=> 4(0xsum) = i
  jmp compare                  // Jumps unconditionally to "compare"
ini:
  pushl %ebp                   //
  rrmovl %esp, %ebp            //
  pushl %ebx                   //
  pushl %eax                   //
  irmovl $0, %eax              // %eax = 0
  rmmovl %eax, -8(%ebp)        //
ini_compare:
  irmovl $100, %ecx            // %ecx = 100
  subl %eax, %ecx              // %ecx = %ecx - %eax <=> %ecx = 100 - i
  jle ini_finish               // Jumps to "ini_finish" if SF=1 pr ZF=0
  rrmovl %eax, %ebx            // %ebx = %eax <=> %ebx = i
  addl %eax, $ebx              // %ebx = %ebx + %eax <=> %ebx = i + i = 2i
  addl %ebx, %ebx              // %ebx = %ebx + %ebx <=> %ecx = 2i + 2i = 4i
  rmmovl %eax, array(%ebx)     // array(%ebx) = %eax <=> array(0x4i) = i
  irmovl %1, %ecx              // %ecx = 1
  addl %ecx, %eax              // %eax = %eax + %ecx <=> %eax = i + 1 => i
  rmmovl %eax, -8(%ebp)        //
  jmp ini_compare              // Jumps unconditionally to "ini_compare"
ini_finish:
  irmovl $4, %ebx              //
  addl %ebx, %esp              //
  popl %ebx                    //
  popl %ebp                    //
  ret                          //
.pos 600
  Stack .long 0
As you can see, there are a bunch of comments in all the instructions and I got (I think) most of them, what's confusing me is the call, pushl/popl and ret instructions. I don't quite understand them and I also don't understand what's happening to the stack and where all the records are pointing. Basically, the lines with comments (//) that don't have anything written on them.
It's really important I understand how all this works, hopefully, some of you can shed some light upon all this mess.
Some notes on my comments:
- 0xsum: This doesn't mean the address is "sum", it would be impossible. It just a means to understand what I'm talking about without using the exact memory address.
- [sum = 0]: This means that in our C code, the variable sum will be set as 0 at this point.
- i + 1 => i: This means that we are incrementing the value of 'i' by one and that in the following line 'i' will actually represent that incremented value.