Studiez modul în care structurile sunt transmise funcțiilor și sunt returnate din funcții. Acest cod:
Rețineți că funcția principală alocă 16 de octeți pe stivă, dar numai 8 octeți sunt eliberați atunci când stiva este aliniată. Restul de 8 octeți sunt ocupați de structură.
Să ne uităm din nou la acest loc în principal:
Și ce se va întâmpla în continuare în Makepoint. Este dificil să înțelegeți acest cod.
Totuși, există un astfel de lucru ca alinierea câmpurilor structurii. Pot vedea acest lucru în listă? Care este motivul pentru această aliniere?
setat la 25 aprilie la ora 2:07
În interiorul funcției makepoint se întâmplă următoarele:
este nimic ca domenii de umplere ale structurii locale a DWORD PTR [ebp + 0xc] și DWORD PTR [ebp + 0x10] (parametrii x și respectiv y), adică aceasta este
Presupunerea ta despre
nu este adevărat (dacă l-am înțeles corect).
Ați început cercetarea încă de la început din partea greșită. În funcție de dorințele compilatorului, poate face tot ce dorește cu structura dvs. Cu toate acestea, există așa-numitele acorduri de apel. care stabilesc o serie de reguli privind modul de transfer al parametrilor. Aș începe să studiez această problemă. Este mai bine să căutați imediat materialul în limba engleză (acolo se numește Convenția apelurilor). În plus, probabil ați dezasamblat codul în modul de depanare, iar în modul de optimizare completă poate fi destul de diferit. Mai mult decât atât, chiar problema de aliniere poate fi rezolvată de către compilator în diverse moduri pentru a-i spune dacă există directive speciale. Întrebarea despre cine alocă memoria și care îl eliberează este, de asemenea, rezolvată în moduri diferite. De exemplu, în convenția __ rapidcall, funcția apelată este eliberată.
Răspunsul a fost făcut 25 aprilie '16 la 14:38
@typemoon, în general, este imposibil să restabiliți fără echivoc codul sursă al unui limbaj de nivel înalt prin asamblare / cod mașină. Structurile pot fi determinate prin dovezi indirecte. Da, este folosit aici un pointer, care poate spune că aceasta este o structură. Dar există încă o ambiguitate: cum de determinat, de exemplu, această structură a fost cu două câmpuri de același tip sau o serie de două elemente? - insolor 25 aprilie '16 la ora 19:35
Formal, limba nu determină în nici un fel exact cum (în ce comenzi computere) compilatorul va efectua anumite acțiuni.
Nu aș fi surprins dacă compilatorul este așa
va face acest lucru - începe imediat să scrie la locul în memoria în cazul în care pt este situat. nu crearea unui tmp local - în C ++ aceasta este standard, adică stipulate în standard, optimizare. Și, cu o scurtă privire la cod, se pare că asta face el. Cu toate acestea, asamblorul din foaia pe care am citit nu contează :(
răspunsul dat 25 aprilie '16 la 3:11 pm