Comment l'assemblage fait-il le passage de paramètre: par valeur, référence, pointeur pour différents types / tableaux?

Essayer de regarder cela, j'ai écrit ce code simple où je viens de créer des variables de différents types et les a transmis à une fonction par valeur, par référence et par pointeur:

int i = 1;
char c = 'a';
int* p = &i;
float f = 1.1;
TestClass tc; //has 2 private data members: int i = 1 and int j = 2

la fonction des organes ont été laissés en blanc parce que je suis juste à la recherche à la façon dont les paramètres sont passés dans l'.

passByValue(i, c, p, f, tc); 
passByReference(i, c, p, f, tc); 
passByPointer(&i, &c, &p, &f, &tc);

voulais voir comment c'est différent pour un tableau et aussi la façon dont les paramètres sont ensuite accessibles.

int numbers[] = {1, 2, 3};
passArray(numbers); 

assemblée:

passByValue(i, c, p, f, tc)
mov EAX, DWORD PTR [EBP - 16]
mov DL, BYTE PTR [EBP - 17]
mov ECX, DWORD PTR [EBP - 24]
movss   XMM0, DWORD PTR [EBP - 28]
mov ESI, DWORD PTR [EBP - 40]
mov DWORD PTR [EBP - 48], ESI
mov ESI, DWORD PTR [EBP - 36]
mov DWORD PTR [EBP - 44], ESI
lea ESI, DWORD PTR [EBP - 48]
mov DWORD PTR [ESP], EAX
movsx   EAX, DL
mov DWORD PTR [ESP + 4], EAX
mov DWORD PTR [ESP + 8], ECX
movss   DWORD PTR [ESP + 12], XMM0
mov EAX, DWORD PTR [ESI]
mov DWORD PTR [ESP + 16], EAX
mov EAX, DWORD PTR [ESI + 4]
mov DWORD PTR [ESP + 20], EAX
call    _Z11passByValueicPif9TestClass
passByReference(i, c, p, f, tc)
lea EAX, DWORD PTR [EBP - 16]
lea ECX, DWORD PTR [EBP - 17]
lea ESI, DWORD PTR [EBP - 24]
lea EDI, DWORD PTR [EBP - 28]
lea EBX, DWORD PTR [EBP - 40]
mov DWORD PTR [ESP], EAX
mov DWORD PTR [ESP + 4], ECX
mov DWORD PTR [ESP + 8], ESI
mov DWORD PTR [ESP + 12], EDI
mov DWORD PTR [ESP + 16], EBX
call    _Z15passByReferenceRiRcRPiRfR9TestClass
passByPointer(&i, &c, &p, &f, &tc)
lea EAX, DWORD PTR [EBP - 16]
lea ECX, DWORD PTR [EBP - 17]
lea ESI, DWORD PTR [EBP - 24]
lea EDI, DWORD PTR [EBP - 28]
lea EBX, DWORD PTR [EBP - 40]
mov DWORD PTR [ESP], EAX
mov DWORD PTR [ESP + 4], ECX
mov DWORD PTR [ESP + 8], ESI
mov DWORD PTR [ESP + 12], EDI
mov DWORD PTR [ESP + 16], EBX
call    _Z13passByPointerPiPcPS_PfP9TestClass
passArray(numbers)
mov EAX, .L_ZZ4mainE7numbers
mov DWORD PTR [EBP - 60], EAX
mov EAX, .L_ZZ4mainE7numbers+4
mov DWORD PTR [EBP - 56], EAX
mov EAX, .L_ZZ4mainE7numbers+8
mov DWORD PTR [EBP - 52], EAX
lea EAX, DWORD PTR [EBP - 60]
mov DWORD PTR [ESP], EAX
call    _Z9passArrayPi
//parameter access
push    EAX
mov EAX, DWORD PTR [ESP + 8]
mov DWORD PTR [ESP], EAX
pop EAX

Je suis en supposant que je suis à la recherche à la droite de l'assemblée concernant le passage de paramètres, car il y a des appels à la fin de chaque!

Mais en raison de ma connaissance très limitée de l'assemblée, je ne peux pas dire ce qui se passe ici. J'ai appris à propos de ccall convention, donc je suis en supposant que quelque chose se passe qui a à voir avec la préservation de l'appelant-sauvé registres et puis en poussant les paramètres sur la pile. De ce fait, je m'attends à voir les choses chargées dans les registres et les "pousser" un peu partout, mais n'ont aucune idée de ce qui se passe avec le movs et leas. Aussi, je ne sais pas ce que DWORD PTR est.

Je ne l'ai appris sur les registres: eax, ebx, ecx, edx, esi, edi, esp et ebpafin de voir quelque chose comme XMM0 ou DL juste me confond. Je suppose que cela a du sens pour voir lea quand il s'agit de passage par référence/pointeur parce qu'ils utilisent des adresses de mémoire, mais je ne peux pas vraiment dire ce qui se passe. Quand il s'agit de passage par valeur, il semble que il ya beaucoup d'instructions, ce qui pourrait avoir à faire avec la copie de la valeur dans des registres. Aucune idée de quand il s'agit de la façon dont les tableaux sont passés et sont accessibles en tant que paramètres.

Si quelqu'un pouvait expliquer l'idée générale de ce qui se passe avec chaque bloc de montage pour moi, je serais très apprécier.

source d'informationauteur kayla