À moins que je copiais mal, le code ci-dessus a été écrit dans le tableau dans une classe par un étudiant avec l'aide/corrections de l'enseignant:Assemblée: Y86 Stack et appeler, pushl/popl et instructions RET
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 y a un tas de commentaires dans toutes les instructions et j'ai (je pense) la plupart d'entre eux, ce qui me dérange est l'appel, pushl/popl et ret instructions. Je ne les comprends pas très bien et je ne comprends pas non plus ce qui se passe dans la pile et où tous les records pointent. Fondamentalement, les lignes avec des commentaires (//) qui n'ont rien d'écrit dessus.
Il est vraiment important que je comprenne comment tout cela fonctionne, j'espère que certains d'entre vous peuvent faire la lumière sur tout ce gâchis.
Quelques notes sur mes commentaires:
- 0xsum: Cela ne signifie pas que l'adresse est "somme", il serait impossible. C'est juste un moyen de comprendre de quoi je parle sans utiliser l'adresse mémoire exacte.
- [sum = 0]: Cela signifie que dans notre code C, la somme des variables sera définie sur 0 à ce stade. Cela signifie que nous incrémentons la valeur de 'i' de un et que, dans la ligne suivante, 'i' représentera réellement cette valeur incrémentée.
En lisant votre article et en même temps faire quelques dessins de pile, je pense que je comprends un peu cela, il y a seulement quelques petites choses que je ne comprends toujours pas: a) Pourquoi poussons-nous et pop% ebx? Si je l'ai bien fait, c'est -4 (% ebp), auquel nous n'accédons jamais et il n'y a aucune valeur dans% ebx pour sauvegarder au début et revenir à la fin. b) Pourquoi poussons-nous% eax s'il n'y a pas de valeur dans% eax pour sauvegarder? Ne pourrions-nous pas décrémenter le% esp pour économiser l'espace nécessaire? Et pourquoi avons-nous besoin de cet espace? Nous sauvons la valeur de% eax dans la pile pour quoi? Nous n'en lisons jamais. –
J'ai essayé de faire un diagramme pour voir si j'ai tout compris correctement, j'espère que tout va bien et je l'ai eu, mais j'ai le sentiment de ne pas l'avoir fait, le voici: http://images.nazgulled.net/ tmp/stack.jpg - Encore, les questions a) et b) dans le premier commentaire, s'appliquent toujours. Et j'en ai un nouveau c) Pourquoi avons-nous même besoin de pousser/pop% ebp et faire "rrmovl% esp,% ebp"? Il ne semble pas que ça change quelque chose ... –
J'ai ajouté une réponse dans la réponse. – Guffa