Assembly-kieli ja x86-tason järjestelmäohjelmointi · Oppitunti

Aritmeettiset ja loogiset operaatiot

Opiskelkaa suorittamaan peruslaskutoimituksia (ADD, SUB, MUL, DIV) ja loogisia operaatioita (AND, OR, XOR, NOT) rekistereissä ja muistissa olevaan dataan.

Oppitunti 2/412 vaihetta

Aritmeettiset ja loogiset operaatiot on ilmainen Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssilla on yhteensä 4 oppituntia.

Johdatus assembly-operaatioihin

Tervetuloa x86-assemblyn keskeisten operaatioiden pariin! Tänään opitte, miten suorittimet tekevät peruslaskutoimituksia ja loogisia operaatioita.

Nämä käskyt ovat perustavanlaatuisia. Niiden avulla ohjelmanne voivat laskea arvoja, tehdä päätöksiä ja käsitellä dataa matalimmalla tasolla.

Yhteenlasku: ADD-käsky

ADD-käskyllä lasketaan yhteen kaksi lukua. Se ottaa kaksi operandia: kohteen ja lähteen.

  • Syntaksi: ADD destination, source
  • source-arvo lisätään destination-arvoon.
  • Tulos tallennetaan takaisin destination-operandiin.
  • Operandit voivat olla rekistereitä, muistipaikkoja tai vakioarvoja.

Esimerkiksi ADD EAX, EBX lisää EBX-rekisterin arvon EAX-rekisterin arvoon ja tallentaa summan EAX-rekisteriin.

ADD käytännössä

Katsotaan, miten ADD-käskyä käytetään yksinkertaisessa ohjelmassa. Lisäämme 3 lukuun 5 ja tallennamme tuloksen EAX-rekisteriin.

Kokeilkaa suorittaa tämä esimerkki:

section .text
  global _start

_start:
  mov eax, 5   ; Load 5 into EAX
  add eax, 3   ; Add 3 to EAX (EAX becomes 8)

  ; Exit the program (Linux 32-bit syscall)
  mov eax, 1   ; sys_exit syscall number
  xor ebx, ebx ; Exit code 0
  int 0x80     ; Call kernel

Vähennyslasku: SUB-käsky

SUB-käsky on ADD-käskyn vastakohta. Se vähentää lähdeoperandia kohdeoperandista.

  • Syntaksi: SUB destination, source
  • source-arvo vähennetään destination-arvosta.
  • Tulos tallennetaan takaisin destination-operandiin.

ADD-käskyn tavoin SUB voi käyttää operandeina rekistereitä, muistia tai vakioarvoja. Se on välttämätön peruslaskutoimituksissa ja vertailuissa.

SUB käytännössä

Tässä SUB-käsky on toiminnassa. Lataamme luvun 10 EAX-rekisteriin ja vähennämme siitä luvun 4.

Suorittakaa tämä koodi nähdäksenne vähennyslaskun:

section .text
  global _start

_start:
  mov eax, 10  ; Load 10 into EAX
  sub eax, 4   ; Subtract 4 from EAX (EAX becomes 6)

  ; Exit the program (Linux 32-bit syscall)
  mov eax, 1   ; sys_exit syscall number
  xor ebx, ebx ; Exit code 0
  int 0x80     ; Call kernel

Kertolasku: MUL ja IMUL

x86-assemblyssa kertolaskuun käytetään MUL-käskyä etumerkittömille luvuille ja IMUL-käskyä etumerkillisille luvuille.

  • MUL- ja IMUL-käskyt käyttävät usein implisiittisesti AX-, EAX- tai RAX-rekisteriä yhtenä operandina.
  • 32-bittisessä kertolaskussa, jossa EAX-rekisterin arvo kerrotaan toisella rekisterillä, kuten EBX-rekisterillä, 64-b bittinen tulos tallennetaan kahteen rekisteriin: alemmat 32 bittiä EAX-rekisteriin ja ylemmät 32 bittiä EDX-rekisteriin.

Muistakaa aina huomioida operandienne koko ja tuloksen mahdollinen koko!

Kertolaskuesimerkki

Kerrotaan luku 5 luvulla 6 käyttäen MUL-käskyä. Tulokseksi saadaan 30.

Suorituksen jälkeen EAX sisältää tuloksen alemman osan ja EDX ylemmän osan, joka on tässä tapauksessa 0.

section .text
  global _start

_start:
  mov eax, 5   ; Load 5 into EAX
  mov ebx, 6   ; Load 6 into EBX
  mul ebx      ; Multiply EAX by EBX. Result in EDX:EAX
               ; EAX will be 30, EDX will be 0

  ; Exit the program (Linux 32-bit syscall)
  mov eax, 1   ; sys_exit syscall number
  xor ebx, ebx ; Exit code 0
  int 0x80     ; Call kernel

Jakolasku: DIV ja IDIV

Jakolaskuun käytetään DIV-käskyä (etumerkittömät luvut) ja IDIV-käskyä (etumerkilliset luvut). Nämä käskyt ovat hieman monimutkaisempia.

  • 32-bittisessä jakolaskussa jaettava luku on odotetusti muodossa EDX:EAX (EDX sisältää ylemmät 32 bittiä ja EAX alemmat 32 bittiä).
  • Jakaja määritetään operandina, esimerkiksi rekisterinä tai muistipaikkana.
  • Jakolaskun jälkeen osamäärä (tulos) tallennetaan EAX-rekisteriin ja jäännös tallennetaan EDX-rekisteriin.

Varmistakaa aina, että EDX on asetettu oikein (usein nollattu) ennen etumerkitöntä jakolaskua, jos jaettava luku mahtuu EAX-rekisteriin.

Jakolaskuesimerkki

Jaetaan luku 10 luvulla 3. Odotamme osamääräksi 3 ja jäännökseksi 1.

Huomioikaa, miten EDX nollataan ennen jakolaskua, koska jaettava luku (10) mahtuu kokonaan EAX-rekisteriin.

section .text
  global _start

_start:
  mov eax, 10  ; Load 10 into EAX (low part of dividend)
  mov edx, 0   ; Clear EDX (high part of dividend for 32-bit)
  mov ebx, 3   ; Load 3 into EBX (divisor)
  div ebx      ; Divide EDX:EAX by EBX.
               ; Quotient in EAX (3), Remainder in EDX (1)

  ; Exit the program (Linux 32-bit syscall)
  mov eax, 1   ; sys_exit syscall number
  xor ebx, ebx ; Exit code 0
  int 0x80     ; Call kernel

Bittikohtainen logiikka: AND, OR, XOR, NOT

Aritmetiikan lisäksi assembly soveltuu erinomaisesti bittikohtaisiin operaatioihin. Näillä käskyillä käsitellään luvun yksittäisiä bittejä.

  • AND: Asettaa bitin arvoon 1, jos molemmat vastaavat bitit ovat 1. Hyödyllinen bittien maskauksessa.
  • OR: Asettaa bitin arvoon 1, jos ainakin toinen vastaavista biteistä on 1. Hyödyllinen tiettyjen bittien asettamisessa.
  • XOR: Asettaa bitin arvoon 1, jos vastaavat bitit ovat erilaiset. Hyödyllinen bittien vaihtamisessa tai rekisterin nopeassa nollaamisessa, esimerkiksi XOR EAX, EAX.
  • NOT: Kääntää kaikki bitit (muuttaa nollat ykkösiksi ja ykköset nolliksi). Tämä on unaarioperaatio, joka ottaa yhden operandin.

Nämä ovat keskeisiä matalan tason ohjauksessa, lippujen käsittelyssä ja datan muokkauksessa.

Pikatarkistus: bittikohtaiset operaatiot

Tarkastelkaa seuraavaa assembly-koodikatkelmaa:

mov al, 0b11001010
and al, 0b00001111

Mikä lopullinen arvo tallennetaan AL-rekisteriin näiden käskyjen suorittamisen jälkeen?

Kertaus: keskeiset operaatiot

Hienoa työtä! Olette oppineet x86-assemblyn keskeiset aritmeettiset ja bittikohtaiset loogiset operaatiot.

  • Aritmetiikka: ADD, SUB, MUL/IMUL, DIV/IDIV suorittavat laskutoimituksia.
  • Logiikka: AND, OR, XOR, NOT käsittelevät yksittäisiä bittejä maskaamista, asettamista, vaihtamista ja kääntämistä varten.

Nämä käskyt muodostavat monimutkaisten ohjelmien perustan ja mahdollistavat suorittimelle datan tehokkaan käsittelyn ja päätösten tekemisen. Jatkakaa harjoittelua!

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 ”Aritmeettiset ja loogiset operaatiot” ilmainen?

Kyllä – oppitunnin ”Aritmeettiset ja loogiset operaatiot” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssin, päivitä CoddyKit PROhon. Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Aritmeettiset ja loogiset operaatiot”?

Opiskelkaa suorittamaan peruslaskutoimituksia (ADD, SUB, MUL, DIV) ja loogisia operaatioita (AND, OR, XOR, NOT) rekistereissä ja muistissa olevaan dataan. Harjoittelet Assembly-kieli ja x86-tason järjestelmäohjelmointi-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Assembly-kieli ja x86-tason järjestelmäohjelmointi-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Aritmeettiset ja loogiset operaatiot”-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ä Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunnilla?

Kyllä. Jokainen Assembly-kieli ja x86-tason järjestelmäohjelmointi-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. Datan siirtokäskyt (MOV, PUSH, POP)
  2. Aritmeettiset ja loogiset operaatiot
  3. Ehdolliset hypyt ja silmukat
  4. Bittikohtaiset ja siirtokäskyt
← Takaisin: Assembly-kieli ja x86-tason järjestelmäohjelmointi