Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet · Oppitunti

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.

Oppitunti 4/413 vaihetta

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], xmm0

Alkuperä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 helper

Pikatarkistus

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.

Aloita maksutta

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

  1. Yleiset kääntäjän optimoinnit
  2. Optimoidun assemblyn analysointi
  3. Alkuperäisen lähdekoodilogiikan rekonstruointi
  4. Inlining- ja silmukkamuunnosten tunnistaminen
← Takaisin: Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet