HAKATEMIA
11Hands-on

Loopit

Keskitaso25MIN

Loopit

Ohjelmat tekevät harvoin asiansa yhdellä askeleella. Yleensä sama operaatio toistetaan: käydään läpi taulukon alkiot, lasketaan summa, etsitään maksimi, kerrotaan yhteen. Assemblyssa toistorakenteet rakennetaan vertailusta ja hypystä, ihan kuten if-rakenteet, mutta nyt hyppäämme tarpeen tullen taaksepäin. Silmukan rakenne assemblyssä: label + ehdollinen hyppy taaksepäin, yleiset hyppyehdot ja LOOP-käsky.

Yksinkertainen silmukka CMP:n ja JNE:n avulla

Lasketaan luvut 1..5: kasvatetaan laskuria, lisätään summaan, toistetaan kunnes laskuri on saavuttanut viiden. Tämä vastaa korkeamman tason kielen for (i = 1; i <= 5; i++)-rakennetta.

Koodi
Konsoli
Rekisterit
EAX0
EBX0
ECX0
EDX0
EIP0
ESP256
ESI0
EDI0
EFLAGS
ZF0
SF0
OF0
CF0
DF0
PF0
Muisti
0000
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0010
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0020
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0030
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0040
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0050
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0060
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0070
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0080
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0090
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00a0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00b0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00c0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00d0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00e0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00f0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00

Tutki ohjelmaa askel kerrallaan emulaattorissa. Näet, miten EBX ja EAX päivittyvät jokaisella kierroksella ja miten suoritus palaa loop_alku-labeliin niin kauan kuin ehto pitää.

Yleisiä hyppyehtoja silmukoissa

  • JNE / JNZ: "ei vielä perillä, jatka kierroksia", eli yleinen kunnes-yhtäsuuri-ehto.
  • JL: jatka, kun laskuri on vielä alle rajan (etumerkillinen).
  • JG: jatka, kun laskuri on vielä yli rajan (esim. päinvastaiseen suuntaan käytetyissä silmukoissa).

Valitse ehto sen mukaan, mihin suuntaan laskurisi liikkuu ja millä ehdolla silmukasta poistutaan.

LOOP-käsky

x86:ssa on yhdistetty käsky nimeltä LOOP, joka tekee kerralla kolme asiaa:

  1. Vähentää ECX-rekisteristä yhden.
  2. Vertailee, onko ECX nolla.
  3. Hyppää annettuun labeliin, jos ECX ei ole nolla.

Eli yhdellä rivillä saadaan DEC + CMP + JNE. ECX on aina laskuri. Tämä on rekisterin vakiintunut erityisrooli.

Koodi
Konsoli
Rekisterit
EAX0
EBX0
ECX0
EDX0
EIP0
ESP256
ESI0
EDI0
EFLAGS
ZF0
SF0
OF0
CF0
DF0
PF0
Muisti
0000
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0010
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0020
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0030
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0040
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0050
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0060
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0070
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0080
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0090
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00a0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00b0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00c0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00d0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00e0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00f0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00

LOOP on tyylikäs mutta sisältää piilon: jos kosket ECX:ään silmukan sisällä muusta syystä, sotkeudut helposti. Reverse engineeringissä LOOP-käskyä ei nykyään juuri näe: modernit kääntäjät suosivat erillisiä DEC + JNZ -pareja, koska niiden suorituskyky on parempi.

Kahteen ehtoon perustuva silmukka

Joskus silmukka pitää keskeyttää ennenaikaisesti, esim. "jatka kunnes alkion arvo on tietty tai päädymme listan loppuun". Tämä vastaa korkean tason kielten break:iä. Toteutus: vertaa kahdesti ja hyppää silmukan ulkopuolelle, kun toinen ehto täyttyy.

Koodi
Konsoli
Rekisterit
EAX0
EBX0
ECX0
EDX0
EIP0
ESP256
ESI0
EDI0
EFLAGS
ZF0
SF0
OF0
CF0
DF0
PF0
Muisti
0000
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0010
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0020
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0030
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0040
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0050
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0060
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0070
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0080
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0090
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00a0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00b0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00c0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00d0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00e0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00f0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
1 / 3
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.