Assemblée: Y86 de la Pile et de l'appeler, pushl/popl et ret instructions

À moins que j'ai copié une erreur, le code ci-dessus a été écrit dans le tableau dans une classe par un élève, avec l'aide et/ou corrections de l'enseignant:

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

Comme vous pouvez le voir, il ya un tas de commentaires dans toutes les instructions et j'ai eu (je pense) la plupart d'entre eux, ce qui est déroutant moi, c'est l'appel, pushl/popl et ret instructions. Je n'arrive pas à comprendre et je ne comprends pas ce qui se passe dans la pile, et où tous les dossiers sont à pointer du doigt. En gros, les lignes de commentaires (//) qui n'ont rien écrit sur eux.

C'est vraiment important je comprends comment tout cela fonctionne, nous l'espérons, certains d'entre vous peut faire la lumière sur tout ce gâchis.

Quelques notes sur mes commentaires:

  • 0xsum: Cela ne veut pas dire que l'adresse est "somme", ce serait impossible. Juste un moyen de comprendre de quoi je parle sans utilisant exactement la même adresse mémoire.
  • [somme = 0]: Cela signifie que dans notre code en C, la variable somme sera réglée sur 0 à ce stade.
  • i + 1 => i: Cela signifie que nous sommes en incrémentant la valeur de " i "par un et que, dans la ligne suivante" i " représente véritablement que la valeur incrémentée.

OriginalL'auteur Ricardo Amaral | 2009-06-20