Aritmetiikka
Aritmetiikka
Edellisissä moduuleissa siirsimme dataa MOV:lla ja teimme päätöksiä CMP:lla. Nyt opetellaan tekemään oikeita laskutoimituksia. x86:n perusaritmetiikka on yllättävän yksinkertainen: yhteenlasku, vähennyslasku ja kahden askeleen muutos kerralla.
ADD: yhteenlasku
ADD lisää lähde-operandin arvon kohde-operandiin. Tulos jää kohteeseen, lähde pysyy ennallaan.
1MOV EAX, 10
2MOV EBX, 32
3ADD EAX, EBX ; EAX = EAX + EBX = 10 + 32 = 42
4; EBX on edelleen 32Lähde voi olla rekisteri, vakio tai muistipaikka:
1ADD EAX, 5 ; vakio
2ADD EAX, EBX ; toinen rekisteri
3ADD EAX, [EBX] ; muistipaikka, johon EBX osoittaaSUB: vähennyslasku
SUB toimii samalla periaatteella, mutta vähentää. Tulos jää kohteeseen.
1MOV EAX, 100
2SUB EAX, 58 ; EAX = 100 - 58 = 42Huomaa, että vähennys voi tuottaa negatiivisen tuloksen. 32-bittinen rekisteri pitää negatiivisen luvun two's complement -muodossa, jos tämä tuntuu vieraalta, palaa kertaamaan moduulia "Datatyypit ja negatiiviset numerot".
INC ja DEC: yhden askeleen muutos
Kun haluat kasvattaa tai pienentää arvoa tasan yhdellä, on lyhyemmät käskyt:
1INC EAX ; EAX = EAX + 1
2DEC EAX ; EAX = EAX - 1
3INC [EBX] ; kasvata muistissa olevaa arvoa, johon EBX osoittaaINC ja DEC ovat melko yleisiä silmukoissa, joissa indeksiä kasvatetaan kierros kerrallaan. Suoritusarvoltaan ne ovat samat kuin ADD/SUB 1:llä; ero on lähinnä lyhyempi konekielen koodaus.
Liput laskutoimituksissa
ADD ja SUB päivittävät kaikki EFLAGS-liput (mukaan lukien kantolipun CF). INC ja DEC päivittävät kaikki muut paitsi CF:n, ja juuri siksi niitä suositaan silmukoissa, joissa kantolippu pitää säilyä laskennan yli. Joka tapauksessa voit ketjuttaa laskutoimituksen ja ehdollisen hypyn ilman erillistä CMP:tä.
ADC ja SBB: useamman sanan aritmetiikka
Kun lasket lukuja, jotka eivät mahdu yhteen 32-bittiseen rekisteriin (esim. 64-bittinen luku jaettuna kahteen rekisteriin), tarvitset ADC (Add with Carry) ja SBB (Subtract with Borrow). Nämä lisäävät tai vähentävät myös edellisen operaation Carry-lipun, jolloin ylivuoto kulkeutuu sanasta toiseen.
Useimmissa kurssin tehtävissä et tarvitse näitä, mutta hyvä silti tietää, että ne ovat olemassa: reverse engineeringissä törmäät niihin kääntäjän tuottamassa tarkkuutta vaativassa koodissa.
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.