HAKATEMIA
08Hands-on

Aritmetiikka

Keskitaso20MIN

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.

X86
1MOV EAX, 10
2MOV EBX, 32
3ADD EAX, EBX     ; EAX = EAX + EBX = 10 + 32 = 42
4; EBX on edelleen 32

Lähde voi olla rekisteri, vakio tai muistipaikka:

X86
1ADD EAX, 5           ; vakio
2ADD EAX, EBX         ; toinen rekisteri
3ADD EAX, [EBX]       ; muistipaikka, johon EBX osoittaa

SUB: vähennyslasku

SUB toimii samalla periaatteella, mutta vähentää. Tulos jää kohteeseen.

X86
1MOV EAX, 100
2SUB EAX, 58      ; EAX = 100 - 58 = 42

Huomaa, 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:

X86
1INC EAX          ; EAX = EAX + 1
2DEC EAX          ; EAX = EAX - 1
3INC [EBX]        ; kasvata muistissa olevaa arvoa, johon EBX osoittaa

INC 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ä.

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

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.

1 / 3
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

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