Inlining- ja silmukkamuunnosten tunnistaminen
Tunnista, miten kääntäjä upottaa funktioita ja muokkaa silmukoita (purkaminen ja vektorointi), jotta optimoitu assembler-koodi voidaan edelleen yhdistää lähdekoodin tarkoitukseen.
Inlining- ja silmukkamuunnosten tunnistaminen on ilmainen Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-kurssilla on yhteensä 4 oppituntia.
Optimoinnit muokkaavat rakennetta
Tunnette yleiset optimoinnit, osaatte lukea optimoitua assemblyä ja rekonstruoida logiikkaa. Kaksi muunnosta aiheuttavat eniten hämmennystä: funktioiden sisällyttäminen ja silmukoiden uudelleenmuotoilu.
Niiden tunnistaminen auttaa pitämään rekonstruktionne täsmällisenä.
Mitä sisällyttäminen tarkoittaa?
Sisällyttäminen korvaa funktiokutsun kutsutun funktion rungolla ja poistaa kutsun aiheuttaman yleiskustannuksen.
Alkuperäinen funktio voi kadota binääristä kokonaan; sen koodi näkyy yhdistettynä jokaisen kutsujan koodiin.
// source
static int sq(int x){ return x*x; }
int f(int a){ return sq(a) + 1; }
// after inlining f becomes: return a*a + 1;Sisällytetyn koodin tunnistaminen
Sisällyttämisen merkkejä:
- Erillisenä funktiona odottamaanne apufunktiota ei näy missään
- Sama käskykuvio toistuu useissa kutsujissa
- Vastaavaa
call-käskyä ei ole kohdassa, jossa lähdekoodissa oli sellainen
Silmukan avaus
Silmukan avaus suorittaa useita iteraatioita yhden silmukkakierroksen aikana haarautumisen aiheuttaman yleiskustannuksen pienentämiseksi.
Neljä kertaa suoritettavan silmukan rungosta voi näkyä neljä kopiota ilman sisäistä haarautumista.
; sum 4 elements, unrolled
mov eax, [rdi]
add eax, [rdi+4]
add eax, [rdi+8]
add eax, [rdi+12]Osittainen avaus
Kun iteraatioiden määrää ei tunneta, kääntäjä avaa silmukan osissa, esimerkiksi neljä iteraatiota kerrallaan, ja lisää loppuun jäännössilmukan jäljelle jääville iteraatioille.
Suuren lohkon ja sitä seuraavan pienen, yhden askeleen silmukan näkeminen on osittaisen avauksen klassinen tunnusmerkki.
Vektorointi (SIMD)
Vektorointi käsittelee useita tietoalkioita samanaikaisesti SIMD-rekistereillä, kuten XMM- ja YMM-rekistereillä.
Käskyt, kuten movdqu, paddd ja addps, ilmaisevat, että skalaarinen silmukka on muunnettu vektorioperaatioiksi.
movdqu xmm0, [rsi]
paddd xmm0, xmm1 ; add 4 ints in parallel
movdqu [rdi], xmm0Alkuperäisen silmukan rekonstruointi
Kun näette SIMD-koodia tai avattuja silmukan runkoja, tiivistäkää ne mielessänne takaisin yhdeksi skalaariseksi silmukaksi. Neljä rinnakkaista yhteenlaskua vastaa silmukkaa, joka laskee yhteen neljä alkiota.
Dokumentoikaa yksinkertainen tarkoitus, älkää optimoitua rakennetta.
Silmukkavakion koodin siirto
Kääntäjät siirtävät silmukan ulkopuolelle laskutoimitukset, jotka eivät muutu iteraatioiden aikana. Silmukan sisällä odottamanne kertolasku voi siis näkyä ennen silmukkaa.
Tämän tunteminen estää tulkitsemasta väärin, missä työ suoritetaan.
Vahvuuden vähentäminen
Silmukoiden sisäiset kertolaskut korvataan usein edullisemmilla yhteenlaskuilla (vahvuuden vähentäminen). Indeksi kerrottuna askeleella muuttuu osoittimeksi, jota kasvatetaan jokaisella kierroksella askeleen verran.
Tulkitkaa add ptr, 8 seuraavaksi alkioksi, älkää kirjaimelliseksi osoitinlaskennaksi.
Työkalut voivat auttaa
Dekompilaattorit (Ghidra, Hex-Rays) avaavat silmukoita ja palauttavat sisällytetyt funktiot usein automaattisesti, jolloin pseudokoodi on selkeämpää. Käyttäkää niitä, mutta varmistakaa toiminnan kannalta tärkeät kohdat assemblystä.
Häntäkutsun optimointi
Kun funktion viimeinen toiminto on kutsu, kääntäjä voi muuttaa sen hypyksi kutsun ja paluun sijaan ja käyttää nykyistä kehystä uudelleen.
Rutiinin lopussa oleva jmp toiseen funktioon, eikä call-käskyä seuraava ret, on häntäkutsun tunnusmerkki.
; tail call instead of call + ret
mov edi, eax
jmp helperPikatarkistus
Odotitte näkevänne pienen apufunktion, mutta se ei näy omana rutiininaan; sen sijaan sen koodi on monistettu jokaiseen kutsujaan. Mistä optimoinnista on kyse?
Kertaus
Osaatte nyt nähdä tehokkaiden optimointien läpi:
- Sisällyttäminen yhdistää kutsutut funktiot kutsujiin
- Silmukan avaus ja vektorointi levittävät silmukan rungon rinnakkaiseksi työksi
- Vakiokoodin siirto ja vahvuuden vähentäminen siirtävät tai keventävät operaatioita
Tiivistäkää nämä rekonstruktiossanne takaisin lähdekoodin yksinkertaiseksi tarkoitukseksi.
Opi Assembly tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Inlining- ja silmukkamuunnosten tunnistaminen” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppimispolun 3 oppituntia, myös oppitunnin “Inlining- ja silmukkamuunnosten tunnistaminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Inlining- ja silmukkamuunnosten tunnistaminen”?
Tunnista, miten kääntäjä upottaa funktioita ja muokkaa silmukoita (purkaminen ja vektorointi), jotta optimoitu assembler-koodi voidaan edelleen yhdistää lähdekoodin tarkoitukseen. Harjoittelet Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Inlining- ja silmukkamuunnosten tunnistaminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppitunnilla?
Kyllä. Jokainen Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Yleiset kääntäjän optimoinnit
- Optimoidun assemblyn analysointi
- Alkuperäisen lähdekoodilogiikan rekonstruointi
- Inlining- ja silmukkamuunnosten tunnistaminen