A struktúrák áthelyezése a funkciókra és a visszatérő struktúrák függvényekből - verem túlcsordulás oroszul

Tanulmányozom, hogy a struktúrák átkerülnek-e a függvényekhez és visszakerülnek-e a funkciókból Ez a kód:

Ne feledje, hogy a főfunkció 16 bájtot oszt a kötegen, de csak 8 bájt szabadul fel, amikor a köteg igazodik. A fennmaradó 8 byte-ot a struktúra foglalja el.

Nézzük meg újra ezt a helyet:

És mi történik ezután a makepointben. Nehéz megérteni ezt a kódot.

Még mindig létezik olyan dolog, mint a struktúra területeinek összehangolása. Látom ezt a listában? Mi az oka ennek az összehangolásnak?

április 25-én

A makepoint funkció belsejében a következő történik

ez nem más, mint a helyi struktúra mezõinek a DWORD PTR [ebp + 0xc] és a DWORD PTR [ebp + 0x10] (x és y paraméterek) kitöltése, pl. ez így van

A feltételezésed

nem igaz (ha jól értettem).

A kutatás kezdettől fogva rossz oldalon kezdődött. A fordító kívánságaitól függően mindent megtesz, amit a struktúrájával akar. Vannak azonban úgynevezett hívásmegállapodások. amelyek egy sor szabályt állítottak fel a paraméterek átadására vonatkozóan. Elkezdtem tanulmányozni ezt a kérdést. Jobb, ha azonnal keresni az anyagot angolul (ott hívják hívás egyezmény). Ezenkívül valószínűleg szétszedte a kódot hibakeresési módban, és teljes optimalizálási módban egészen más lehet. Ezenkívül még az összehangolás kérdését a fordító számos módon megoldhatja, hogy elmondja neki, vannak-e speciális irányelvek. Az a kérdés, hogy kik kiosztja a memóriát, és aki szabadítja azt, szintén különböző módon megoldódott. Például az __ fastcall egyezményben a hívott függvény felszabadul.

A válasz április 25-én, 14:38 órakor készült

@typemoon általában nem lehet egyértelműen visszaállítani egy magas szintű nyelv forráskódját az assembler / gép kóddal. A struktúrákat közvetett bizonyítékokkal lehet meghatározni. Igen, itt egy mutatót használnak, ami azt mondhatja, hogy ez egy szerkezet. De még mindig van kétértelműség: hogyan lehetne meghatározni például, hogy ez a struktúra két azonos típusú mezővel vagy két elemből állt? - Insolor április 25-én, 19: 35-kor

Formálisan a nyelv nem határozza meg pontosan, hogy a fordító milyen műveletekkel (melyekben a számítógép parancsai) végez bizonyos műveleteket.

Nem lennék meglepve, ha ez a fordító

megteszi - azonnal elkezd írni a helyet, ahol a pt található. nem helyi Tmp létrehozása - a C ++-ban ez normál, azaz a szabványban meghatározott, optimalizálásra. És a körvonalazó pillantással a kódra, úgy tűnik, hogy ezt teszi. Azonban az összeszerelő az olvasott lapról nem számít: (

válaszolt április 25-én, 16: 15-kor

Kapcsolódó cikkek