Arhiva kategorije: Knjige o asembleru. Osnove montaže

Ovu ideju njegujemo već duže vrijeme. Vjerojatno smo ga nekoliko godina jurišali sa svih strana i svaki put nam se nešto ispriječilo na putu. S jedne strane, asembler je cool onoliko koliko mogućnost komunikacije s računalom na njegovom jeziku može biti cool za našeg čitača-hakera (cracker, reverser). Na drugoj strani - trenutni priručnici Prema ASMU-u, uključujući publikacije ovog stoljeća, postoji dovoljno, a ovi su dani liberalni, web-hakeri i ljubitelji JS-a možda nas neće razumjeti ili odobriti. 🙂 Uspjeh je stavio točku na spor između fizičara, tekstopisaca, starovjeraca, nikonijanaca, web hakera i lakrdijaša. Pokazalo se da sada, u 21. stoljeću, radnički krekeri još uvijek nisu odustali od svojih pozicija i to zanima naše čitatelje!

Ali što je samo programiranje u svojoj biti, bez obzira na bilo koji jezik? Raznolikost odgovora je nevjerojatna. Najčešće možete čuti ovu definiciju: programiranje je kompilacija uputa ili naredbi za sekvencijalno izvršavanje od strane stroja kako bi se riješio određeni problem. Ovaj je odgovor sasvim fer, ali, po mom mišljenju, ne odražava puninu, kao da smo književnost nazvali kompilacijom riječi iz rečenica za uzastopno čitanje od strane čitatelja. Sklon sam vjerovati da je programiranje bliže kreativnosti, umjetnosti. Kao i svaka vrsta umjetnosti - izražavanje kreativnih misli, ideja, programiranje je odraz ljudske misli. Ideja može biti i briljantna i potpuno osrednja.

No, bez obzira kojom se vrstom programiranja bavimo, uspjeh ovisi o praktičnim vještinama povezanim sa znanjem osnove i teorije. Teorija i praksa, učenje i rad – to su kamen temeljac na kojem se temelji uspjeh.

U U zadnje vrijeme asembler je nezasluženo u sjeni drugih jezika. To je zbog globalne komercijalizacije s ciljem maksimiziranja kratko vrijeme dobiti što je više moguće dobiti od proizvoda. Drugim riječima, masovnost je prevladala nad elitizmom. A asembler je, po mom mišljenju, bliži potonjem. Puno je isplativije obučiti studenta za npr. jezike kao što su C++, C#, PHP, Java, JavaScript, Python u relativno kratkom vremenu, tako da je više ili manje sposoban kreirati softver potrošačke razine bez postavljanja pitanja o tome zašto i zašto to čini nego osloboditi dobar stručnjak u asembleru. Primjer za to je ogromno tržište za sve vrste tečajeva programiranja na bilo kojem jeziku, s izuzetkom asemblera. Isti trend vidljiv je iu nastavi na sveučilištima iu obrazovnoj literaturi. U oba slučaja, do danas Većina materijala temelji se na ranim procesorima serije 8086, na takozvanom "stvarnom" 16-bitnom načinu rada, MS-DOS okruženje! Moguće je da je jedan od razloga to što su, s jedne strane, dolaskom IBM PC računala nastavnici morali prijeći na ovu platformu zbog nedostupnosti drugih. S druge strane, kako se linija 80x86 razvijala, ostala je mogućnost pokretanja programa u DOS načinu rada, što je omogućilo uštedu novca na kupnji novih obrazovnih računala i sastavljanju udžbenika za proučavanje arhitekture novih procesora. Međutim, sada je takav izbor platforme za studij potpuno neprihvatljiv. MS-DOS kao okruženje za izvršavanje programa beznadno je zastario sredinom devedesetih, a prelaskom na 32-bitne procesore, počevši od procesora 80386, sam sustav naredbi postao je puno logičniji. Stoga nema smisla gubiti vrijeme na proučavanje i objašnjavanje neobičnosti arhitekture pravi način rada, koji se sigurno nikada neće pojaviti ni na jednom procesoru.

Što se tiče odabira radnog okruženja za učenje asemblera, ako govorimo o 32-bitnom sustavu instrukcija, izbor je relativno mali. Ovi su ili operativni Windows sustavi, odnosno predstavnici UNIX obitelji.

Također biste trebali reći nekoliko riječi o tome koji asembler odabrati za određeno radno okruženje. Kao što znate, dvije vrste asemblerske sintakse koriste se za rad s x86 procesorima - AT&T sintaksa i Intel sintaksa. Ove sintakse predstavljaju iste naredbe na potpuno različite načine. Na primjer, naredba u Intelovoj sintaksi izgleda ovako:

Mov eax,ebx

Sintaksa AT&T imat će drugačiji oblik:

Movl %eax,%ebx

Sintaksa tipa AT&T ipak je popularnija u UNIX OS okruženju nastavna sredstva o njemu nema podataka, opisan je isključivo u referentnoj i tehničkoj literaturi. Stoga je logično odabrati asembler temeljen na Intelovoj sintaksi. Za UNIX sustave postoje dva glavna asemblera - NASM (Netwide Assembler) i FASM (Flat Assembler). Za Windows linije Popularni su FASM i MASM (Macro Assembler) iz Microsofta, a tu je bio i TASM (Turbo Assembler) iz Borlanda, koji je odavno prestao podržavati vlastitu kreaciju.

U ovoj seriji članaka proučavat ćemo Windows okruženje temeljeno na asemblerskom jeziku MASM (jednostavno zato što mi se više sviđa). Mnogi autori na početno stanje asembler za učenje uklapa ga u ljusku jezika C, na temelju razmatranja da je navodno prilično teško prijeći na praktične primjere u radnom okruženju: morate poznavati i osnove programiranja u njemu i procesorske naredbe. Međutim, ovaj pristup također zahtijeva barem najmanje rudimente znanja u jeziku C. Od samog početka, ova serija članaka će se fokusirati samo na sam asembler, bez zbunjivanja čitatelja s nečim drugim što mu je nerazumljivo, iako će se u budućnosti pratiti veza s drugim jezicima.

Valja napomenuti da je kod učenja osnova programiranja, a to se ne odnosi samo na asemblersko programiranje, iznimno korisno imati razumijevanje kulture konzolnih aplikacija. I potpuno je nepoželjno započeti s učenjem odmah stvaranjem prozora, gumba, odnosno aplikacija s prozorima. Postoji mišljenje da je konzola arhaični relikt prošlosti. Međutim, nije. Konzolna aplikacija gotovo je lišena bilo kakve vanjske ovisnosti o prozorskoj ljusci i fokusirana je uglavnom na izvođenje određenog zadatka, što pruža izvrsnu priliku, bez da vas bilo što drugo ometa, da se usredotočite na učenje osnovnih osnova i programiranja i asemblera sebe, uključujući poznavanje algoritama i njihov razvoj za rješavanje praktični problemi. I kad dođe vrijeme da prijeđemo na upoznavanje prozorske aplikacije, već ćete imati impresivnu zalihu znanja iza sebe, jasno razumijevanje rada procesora i, što je najvažnije, svijest o svojim postupcima: kako i što radi, zašto i zašto.

Što je asembler?

Sama riječ asembler(assembler) preveden je s engleskog kao "sastavljač". Zapravo, ovo je naziv programa prevoditelja koji uzima kao ulazni tekst koji sadrži simbole strojnih naredbi koje su prikladne za ljude, i prevodi te simbole u niz odgovarajućih kodova strojnih naredbi koje su razumljive procesoru. Za razliku od strojnih instrukcija, njihove konvencije, također tzv mnemotehnika, relativno je lako zapamtiti jer su kratice engleskih riječi. U nastavku ćemo, radi jednostavnosti, mnemotehniku ​​nazivati ​​uputama za sastavljanje. Jezik konvencija naziva se asemblerski jezik.

U osvit računalne ere, prva su računala zauzimala cijele prostorije i bila su teška više od jedne tone, s kapacitetom memorije veličine mozga vrapca ili čak i manje. Jedini način programiranja u to doba bio je ubacivanje programa u memoriju računala izravno u digitalnom obliku, prebacivanjem prekidača, žica i gumba. Broj takvih prekidača mogao je doseći nekoliko stotina i rastao je kako su programi postajali složeniji. Postavilo se pitanje uštede vremena i novca. Stoga je sljedeći korak u razvoju bila pojava krajem četrdesetih godina prošlog stoljeća prvog prevoditelja-assemblera, koji je omogućio praktično i jednostavno pisanje strojnih naredbi u ljudski jezik i kao rezultat, automatizirati cijeli proces programiranja, pojednostaviti i ubrzati razvoj programa i otklanjanje pogrešaka. Zatim su došli jezici visoka razina I sastavljači(inteligentniji generatori koda iz jezika koji je čitljiviji ljudima) i tumači(izvršitelji ljudsko napisanog programa u hodu). Poboljšavali su se i poboljšavali - i konačno je došlo do toga da možete jednostavno programirati pomoću miša.

Dakle, asembler je strojno orijentirani jezik programiranje, koje vam omogućuje izravan rad s računalom, jedan na jedan. Otuda i njegova puna formulacija - druga generacija programskog jezika niske razine (nakon strojni kod). Naredbe asemblera odgovaraju jedan prema jedan naredbama procesora, ali budući da postoje razni modeli procesori s vlastitim skupom instrukcija, onda, sukladno tome, postoje varijante ili dijalekti asemblerskog jezika. Stoga upotreba izraza "jezik za sklapanje" može dovesti do pogrešnog uvjerenja da postoji jedan jezik niske razine ili barem standard za takve jezike. Ne postoji. Stoga je pri imenovanju jezika na kojem je pojedini program napisan potrebno razjasniti kojoj je arhitekturi namijenjen i na kojem je dijalektu jezika napisan. Budući da je asembler vezan za procesorski uređaj, a tip procesora strogo određuje skup dostupne naredbe strojni jezik, tada programi na asemblerskom jeziku nisu prenosivi na druge računalne arhitekture.

Budući da je asembler samo program koji je napisala osoba, ne postoji ništa što bi spriječilo drugog programera da napiše svoj vlastiti asembler, što se često događa. Zapravo, nije toliko važno koji asemblerski jezik proučavati. Glavna stvar je razumjeti sam princip rada na razini naredbi procesora, a tada neće biti teško svladati ne samo drugi asembler, već i bilo koji drugi procesor s vlastitim skupom naredbi.

Sintaksa

Ne postoji općeprihvaćen standard za sintaksu asemblerskih jezika. Međutim, većina programera asemblerskih jezika slijedi općenite tradicionalne pristupe. Glavni takvi standardi su Intelova sintaksa I AT&T sintaksa.

Opći format za snimanje uputa isti je za oba standarda:

[oznaka:] operativni kod [operandi] [;komentar]

Opcode je zapravo naredba za sklapanje, mnemotehnika uputa procesoru. Mogu mu se dodati prefiksi (na primjer, ponavljanja, promjene u vrsti adresiranja). Operandi mogu biti konstante, imena registara, adrese u RAM-u i tako dalje. Razlike između standarda Intel i AT&T odnose se uglavnom na redoslijed kojim su operandi nabrojani i njihovu sintaksu kada različite metode adresiranje.

Naredbe koje se koriste obično su iste za sve procesore iste arhitekture ili obitelji arhitektura (među poznatima su naredbe za Motorola, ARM, x86 procesore i kontrolere). Oni su opisani u specifikacijama procesora.

Da bi stroj mogao izvršavati ljudske naredbe razini hardvera, potrebno je postaviti određeni slijed radnji jezikom "nula i jedinica". Monter će postati pomoćnik u ovom pitanju. Ovo je uslužni program koji radi s prevođenjem naredbi u strojni jezik. Međutim, pisanje programa je vrlo naporan i složen proces. Ovaj jezik nije namijenjen za stvaranje pluća i jednostavne akcije. Na ovaj trenutak bilo koji programski jezik koji se koristi (Assembler radi odlično) omogućuje pisanje posebnih, učinkovitih zadataka koji uvelike utječu na rad hardvera. Glavna svrha je stvaranje mikro-instrukcija i malih kodova. Ovaj jezik daje više mogućnosti nego npr. Pascal ili C.

Kratak opis asemblerskih jezika

Svi programski jezici podijeljeni su na razine: niske i visoke. Svaki od sintaktičkih sustava asemblerove "obitelji" ističe se činjenicom da odmah kombinira neke od prednosti najčešćih i moderni jezici. Ono što im je zajedničko s ostalima jest da se u potpunosti mogu koristiti računalnim sustavom.

Izrazita značajka prevoditelja je njegova jednostavnost korištenja. To ga razlikuje od onih koji rade samo s visokim razinama. Ako uzmete u obzir bilo koji takav programski jezik, Assembler funkcionira dvostruko brže i bolje. Neće vam trebati previše vremena da u njemu napišete lagani program.

Ukratko o strukturi jezika

Ako govorimo općenito o radu i strukturi jezika, možemo sa sigurnošću reći da njegove naredbe u potpunosti odgovaraju naredbama procesora. To jest, asembler uglavnom koristi mnemoničke kodove ugodno za osobu za snimanje.

Za razliku od drugih programskih jezika, Assembly koristi specifične oznake umjesto adresa za pisanje memorijskih ćelija. Zajedno s procesom izvršavanja koda, oni se prevode u tzv. Ovaj relativne adrese, koji ne utječu na rad procesora (nisu prevedeni na strojni jezik), ali su neophodni za prepoznavanje od strane samog programskog okruženja.

Svaka linija procesora ima svoje U ovoj situaciji svaki proces, uključujući i prevedeni, bit će točan

Asemblerski jezik ima nekoliko sintaksi o kojima će biti riječi u članku.

Prednosti jezika

Najvažniji i najprikladniji uređaj asemblerskog jezika je da u njemu možete napisati bilo koji program za procesor, koji će biti vrlo kompaktan. Ako se kod pokaže da je ogroman, tada se neki procesi preusmjeravaju u RAM. Štoviše, sve rade prilično brzo i bez kvarova, osim ako, naravno, njima ne upravlja kvalificirani programer.

Upravljački programi, operativni sustavi, BIOS, kompajleri, tumači itd. svi su programi u asemblerskom jeziku.

Kada koristite disassembler koji izvodi prijevod sa stroja na stroj, lako možete razumjeti kako funkcionira ovaj ili onaj sistemski zadatak, čak i ako za to nema objašnjenja. Međutim, to je moguće samo ako su programi laki. Nažalost, netrivijalne kodove prilično je teško razumjeti.

Nedostaci jezika

Nažalost, programerima početnicima (a često i profesionalcima) je teško razumjeti jezik. Asembler zahtijeva detaljan opis potrebne naredbe. Zbog potrebe korištenja strojnih naredbi, povećava se vjerojatnost pogrešnih radnji i složenost izvršenja.

Da bi mogao napisati i najjednostavniji program, programer mora biti kvalificiran, a njegova razina znanja dovoljno visoka. Prosječni stručnjak, nažalost, često piše loš kod.

Ako je platforma za koju je program stvoren ažurirana, tada se sve naredbe moraju prepisati ručno - to zahtijeva sam jezik. Asembler ne podržava funkciju automatska regulacija operativnost procesa i zamjena bilo kojih elemenata.

Jezične naredbe

Kao što je gore spomenuto, svaki procesor ima vlastiti skup naredbi. Najjednostavniji elementi koje prepoznaje bilo koja vrsta su sljedeći kodovi:


Korištenje direktiva

Programiranje mikrokontrolera u jeziku (Assembler to omogućuje i dobro se nosi s funkcioniranjem) najniže razine u većini slučajeva završava uspješno. Najbolje je koristiti procesore sa ograničen resurs. Ovaj jezik je savršen za 32-bitnu tehnologiju. Često možete vidjeti direktive u kodu. Što je to? A za što se koristi?

Prvo, potrebno je naglasiti da se direktive ne prevode u strojni jezik. Oni reguliraju način na koji kompajler obavlja posao. Za razliku od naredbi, ovi parametri imaju razne funkcije, razlikuju se ne zbog različitih procesora, već zbog različitog prevoditelja. Među glavnim direktivama su sljedeće:


porijeklo imena

Kako je jezik dobio ime - "Assembler"? Govorimo o prevoditelju i kompajleru koji enkriptiraju podatke. Na engleskom asembler ne znači ništa više od asemblera. Program nije sastavljen ručno, korištena je automatska struktura. Štoviše, u ovom trenutku korisnici i stručnjaci već su izgubili razliku između pojmova. Programski jezici se često nazivaju asemblerom, iako je to samo uslužni program.

Zbog zajedničkog zajedničkog naziva, neki ljudi pogrešno vjeruju da postoji jedan jezik niske razine (ili standardne norme za njega). Kako bi programer shvatio o kojoj strukturi govorimo, potrebno je razjasniti za koju se platformu koristi određeni asemblerski jezik.

Makro znači

Asemblerski jezici, koji su relativno novi, imaju makro značajke. Oni olakšavaju i pisanje i izvođenje programa. Zahvaljujući njihovoj prisutnosti, prevoditelj višestruko brže izvršava napisani kod. Kada stvarate uvjetni odabir, možete napisati ogroman blok naredbi, ali lakše je koristiti makro alate. Oni će vam omogućiti brzo prebacivanje između radnji ako je uvjet ispunjen ili ne.

Kada koristi direktive makro jezika, programer prima makronaredbe asemblera. Ponekad se može široko koristiti, a ponekad i funkcionalne značajke sveden na jedan tim. Njihova prisutnost u kodu olakšava rad, čineći ga razumljivijim i vizualnijim. Međutim, i dalje biste trebali biti oprezni - u nekim slučajevima makronaredbe, naprotiv, pogoršavaju situaciju.

Izvornik: Započnite s asemblerskim jezikom. 1. dio
Autor: Mike Saunders
Datum objave: 30. listopada 2015
Prijevod: A. Panin
Datum prijevoda: 10.11.2015

Dio 1: Prevladavanje ograničenja programskih jezika visoke razine i razumijevanje kako središnja procesorska jedinica zapravo radi.

Čemu služi?

  • Da bismo razumjeli kako rade prevoditelji.
  • Za razumijevanje CPU uputa.
  • Za optimizaciju vašeg koda za performanse.

Većina ljudi vjeruje da se asemblerski jezik ne razlikuje mnogo od crne magije i da je dio mračne magije strašni svijet, u koju riskira ulazak samo 0,01% najboljih programera softver. Ali zapravo je to lijep i vrlo pristupačan programski jezik. Trebali biste proučiti njegove osnove barem kako biste bolje razumjeli mehanizam generiranja koda od strane prevoditelja, princip rada središnjih procesora, kao i kako biste bolje razumjeli princip rada računala. Asemblerski jezik je u biti tekstualni prikaz instrukcija koje izvršava. CPU, s nekim dodatne mogućnosti, pojednostavljujući proces programiranja.

Danas se nitko pri zdravoj pameti ne bi razvijao moćna aplikacija Za stolno računalo u asemblerskom jeziku. Uostalom, kod takve aplikacije bit će previše zbunjujući, proces otklanjanja pogrešaka u aplikaciji bit će puno kompliciraniji, a osim toga, morat će se uložiti ogromni napori da se ova aplikacija prenese za rad s drugim središnjim procesorskim arhitekturama. Ali u isto vrijeme, asemblerski jezik se i dalje koristi u različite svrhe: mnogi upravljački programi uključeni u Linux kernel sadrže fragmente koda u asemblerskom jeziku, koji se koristi i zato što najbolji jezik programiranje za izravnu interakciju s hardverom, te iz razloga povećanja brzine upravljačkih programa. također u određenim slučajevima kod napisan rukom u asemblerskom jeziku može funkcionirati brži od koda, generiran od strane prevoditelja.

U člancima u ovoj seriji detaljno ćemo istražiti svijet asemblerskog jezika. U ovom članku osvrnut ćemo se samo na osnovne tehnike programiranja, u članku iz sljedećeg broja časopisa bavit ćemo se složenijim temama, nakon čega ćemo završiti razmatranje asemblerskog jezika pisanjem jednostavnog učitavanja operacijski sustav- ona neće moći izvesti nijedan koristan rad, ali će se temeljiti na vašem kodu i raditi izravno s hardverom bez potrebe za preuzimanjem OS-a treće strane. Zvuči dobro, zar ne? Počnimo

Vaš prvi program na asemblerskom jeziku

Mnogi vodiči za programiranje u asemblerskom jeziku započinju dugim, zbunjujućim i zamornim odjeljcima koji govore o binarnoj aritmetici i teoriji dizajna CPU-a, a da zapravo ne sadrže nikakav stvarni kod. Vjerujem da takvi materijali poništavaju interes čitatelja, pa ćemo započeti izravno s pregledom koda pravi program. Nakon toga ćemo pogledati svaku od linija koda ovog programa kako biste na praktičnom primjeru razumjeli princip asemblerskog jezika.

Neki uređivači teksta, poput Vima, omogućuju označavanje sintakse asemblerskog jezika (pokušajte koristiti naredbu set syn=nasm)

Kopirajte sljedeći kod u tekstualno polje bilo kojeg uređivač teksta i spremite ga u datoteku pod nazivom myfirst.asm u svom početnom direktoriju:

Odjeljak .text global _start _start: mov ecx, poruka mov edx, duljina mov ebx, 1 mov eax, 4 int 0x80 mov eax, 1 int 0x80 odjeljak .data poruka db "Pravila sklapanja!", 10 duljina equ $ - poruka

(Napomena: možete koristiti razmake ili tabulatore za uvlačenje koda - nije važno.) Ovaj program jednostavno ispisuje redak "Pravila sklapanja!" na ekran i izlazi.

Alat koji ćemo koristiti za pretvaranje ovog koda asemblerskog jezika u izvršnu binarnu datoteku ima prilično smiješan naziv "assembler". Postoji mnogo različitih asemblera, ali moj omiljeni asembler je NASM; nalazi se u repozitoriju softverskih paketa gotovo svake distribucije, tako da ga možete instalirati pomoću upravitelja softverskih paketa sa grafičko sučelje, yum install nasm , apt-get install nasm ili bilo koja druga naredba koja je relevantna za vašu distribuciju.

Sada otvorite prozor emulatora terminala i unesite sljedeće naredbe:

Nasm -f elf -o mojprvi.o mojprvi.asm ld -m elf_i386 -o mojprvi mojprvi.o

Prva naredba je generiranje datoteke objektnog koda pod nazivom myfirst.o pomoću NASM-a (format izvršne datoteke koji se koristi u Linuxu). Možete se zapitati: "Zašto se generira datoteka objektnog koda, budući da bi bilo logičnije generirati datoteku s uputama za središnji procesor koje treba izvršiti?" Pa, mogli biste koristiti izvršnu datoteku s CPU uputama u operativnim sustavima iz 80-ih, ali moderni operativni sustavi imaju više zahtjeva za izvršne datoteke. ELF binarne datoteke uključuju informacije o otklanjanju pogrešaka i dopuštaju odvajanje koda i podataka tako što imaju zasebne odjeljke kako bi se spriječilo prebrisanje podataka u tim odjeljcima.

Kasnije, u procesu razmatranja metodologije pisanja koda za izravni rad s hardverom (za naš minimalistički operativni sustav), u sklopu ove serije članaka, obratit ćemo pozornost na takve binarne datoteke s uputama iz središnjeg procesora.

Pogled u prošlost

Trenutno nam je na raspolaganju datoteka myfirst.o s izvršnim kodom našeg programa. Međutim, proces izgradnje programa još nije dovršen; Koristeći ld povezivač, moramo povezati kod iz ove datoteke s posebnim kodom za pokretanje sustava (tj. šablonskim kodom koji se izvršava kada se svaki program pokrene) kako bismo generirali izvršna datoteka nazvan moj prvi. (Parametar elf_i386 opisuje vrstu binarnog formata - in u ovom slučaju to znači da možete koristiti 32-bitni asemblerski kod čak i ako koristite 64-bitnu distribuciju.)

Ako proces izgradnje program će se održati uspješno, moći ćete izvršiti svoj program pomoću sljedeće naredbe:

Kao rezultat, trebali biste vidjeti izlaz: "Pravila sklapanja!". To znači da ste postigli svoj cilj - stvorili ste potpuno neovisni program za Linux, čiji je kod u potpunosti napisan u asemblerskom jeziku. Naravno ovaj program ne izvodi nikakvu korisne akcije, ali je u isto vrijeme izvrstan primjer koji pokazuje strukturu programa u asemblerskom jeziku i omogućuje vam praćenje procesa konverzije izvorni kod u binarnu datoteku.

Prije nego što zaronimo u kod, bilo bi dobro znati veličinu binarne datoteke našeg programa. Nakon pokretanja naredbe ls -l myfirst, vidjet ćete da je veličina binarne datoteke približno 670 bajtova. Sada procijenimo veličinu ekvivalentnog programa u C-u:

#uključi int main() (puts("Pravila sklapanja!"); )

Ako spremite ovaj kod u datoteku pod nazivom test.c, kompajlirate ga (gcc -o test test.c) i pogledate parametre dobivene binarne datoteke pod nazivom test, vidjet ćete da ova datoteka ima mnogo veće veličine- 8,4 tisuća kuna. Možete izbrisati iz ove datoteke informacije o otklanjanju pogrešaka(strip -s test), ali će se i nakon toga njegova veličina malo smanjiti, samo na 6 k. Ovo se objašnjava GCC prevodilac dodaje veliku količinu gore spomenutog koda za pokretanje i zaustavljanje aplikacije, a također povezuje aplikaciju s bibliotekom C programskog jezika velika veličina. Zahvaljujući ovaj primjer Lako je zaključiti da je asemblerski jezik najbolji programski jezik za razvoj aplikacija namijenjenih za korištenje u surovim uvjetima ograničenja kapaciteta medija za pohranu.

Vrijedno je spomenuti da mnogi programeri asemblerskog jezika primaju izvrsne plaće za razvoj koda za ugrađene uređaje s ograničenim resursima i zato je asemblerski jezik jedini stvarna opcija za razvoj igara za starije 8-bitne konzole i kućna računala.

Rastavljanje koda

Razvijanje novog koda je zabavno, ali čak i više od toga zanimljiva aktivnost može se pokazati kao istraživanje tuđeg rada. Zahvaljujući alatu nazvanom objdump (iz paketa Binutils), možete "rastaviti" izvršnu datoteku, odnosno pretvoriti CPU upute u njihove tekstualne ekvivalente. Pokušajte upotrijebiti ovaj alat protiv moje prve binarne datoteke na kojoj smo radili u ovom vodiču, ovako:

Objdump -d -M intel myfirst

Vidjet ćete popis uputa iz odjeljka koda binarne datoteke. Primjerice, prva instrukcija kojom smo smjestili informaciju o mjestu našeg stringa u ecx registru izgleda ovako:

Mov ecx,0x80490a0

Tijekom procesa sklapanja, NASM je zamijenio oznaku retka "poruka". numerička vrijednost, što odgovara lokaciji ove linije u podatkovnom odjeljku binarne datoteke. Stoga su rezultati rastavljanja binarnih datoteka manje korisni od njihovog izvornog koda, budući da im nedostaju stvari poput komentara i redaka, ali još uvijek mogu biti korisni za upoznavanje s implementacijama vremenski kritičnih funkcija ili razbijanjem sigurnosnih sustava aplikacija. Na primjer, u 80-ima i 90-ima mnogi su programeri koristili alate za rastavljanje softvera kako bi identificirali i neutralizirali sustave zaštite od kopiranja igara.

Također možete rastaviti programe razvijene pomoću drugih programskih jezika, ali rezultirajući rezultati rastavljanja mogu biti znatno složeniji. Na primjer, možete pokrenuti gornju naredbu objdump s binarnom datotekom /bin/ls i neovisno procijeniti tisuće redaka odjeljaka koda koje je generirao kompajler na temelju izvornog C izvornog koda uslužnog programa.

Analiza koda

Sada raspravimo svrhu svake linije koda u našem programu. Počnimo s ova dva retka:

Odjeljak .text global _start

Ovo nisu CPU upute, već asemblerske upute. NASM; Prva direktiva navodi da se kod u nastavku treba nalaziti u odjeljku koda "tekst" konačne izvršne datoteke. Pomalo neočigledna je činjenica da odjeljak pod nazivom "tekst" ne sadrži obične tekstualne podatke (kao što je naš redak "Pravila okupljanja!"), ali izvršni kod, tj. instrukcije središnjeg procesora. Sljedeća je globalna direktiva _start, koja govori ld povezivaču u kojem trenutku treba započeti izvršavanje koda iz naše datoteke. Ova direktiva može biti posebno korisna ako želimo započeti izvršavanje koda ne od samog početka odjeljka koda, već od neke zadane točke. Globalni parametar omogućuje čitanje ove direktive ne samo asembleru, već i drugim alatima, tako da je obrađuje ld povezivač.

Kao što je gore spomenuto, izvršavanje koda mora započeti na poziciji _start. Zbog toga izričito označavamo odgovarajuću poziciju u našem kodu:

Pojedinačne riječi s dvotočkom na kraju nazivaju se oznakama i namijenjene su označavanju pozicija u kodu na koje možemo skočiti (više o tome u sljedećem članku iz serije). Dakle, izvođenje programa počinje od ove linije! Štoviše, konačno smo stigli do prvog prave upute CPU:

Mov ecx, poruka

Asemblerski jezik je u suštini skup mnemotehnike za CPU (ili strojni kod) instrukcije. U ovom slučaju, mov je jedna takva instrukcija - također se može napisati u binarnom formatu razumljivom središnjem procesoru, poput 10001011. Ali rad s binarnim podacima može nam se pretvoriti u noćnu moru, obični ljudi, pa ćemo koristiti ove čitljivije opcije. Asembler jednostavno pretvara tekstualne upute u njihove binarne ekvivalente - iako se može izvršiti dodatni rad, o čemu ćemo govoriti u narednim člancima iz serije.

U svakom slučaju, da bismo razumjeli svrhu ove linije koda, također moramo razumjeti koncept registara. Centralne procesorske jedinice ne obavljaju nikakve posebne zadatke složene operacije- oni jednostavno premještaju podatke u memoriji, koriste ih za izvođenje izračuna i obavljaju druge operacije ovisno o rezultatima. Centralni procesor nema pojma što je monitor, miš ili printer. Jednostavno premješta podatke i izvodi nekoliko vrsta izračuna.

Trenutačno je glavna pohrana podataka koju koristi središnji procesor vaše banke RAM-a. Ali zbog činjenice da se RAM nalazi izvan središnjeg procesora, pristup mu oduzima puno vremena. Kako bi se ubrzao i pojednostavio opisani proces, središnja procesorska jedinica sadrži svoju malu skupinu memorijskih ćelija koje se nazivaju registri. CPU instrukcije mogu izravno koristiti te registre, au ovom retku koda koristimo registar koji se zove ecx.

To je 32-bitni registar (dakle, može pohraniti brojeve od 0 do 4,294,967,295). Revidiranjem sljedeće retke koda vidjet ćete da također radimo s registrima edx, ebx i eax - to su registri Opća namjena, koji se može koristiti za obavljanje bilo kojeg zadatka, za razliku od specijaliziranih registara o kojima ćemo učiti sljedeći mjesec. A ovo je malo objašnjenje za one koji su željni saznanja o podrijetlu imena registara: ecx registar se zvao c tijekom izdavanja 8-bitnih procesora, nakon čega je preimenovan u cx za pohranjivanje 16-bitnih vrijednosti i ecx za pohranu 32-bitnih vrijednosti x bitne vrijednosti. Dakle, iako nazivi registara danas izgledaju pomalo čudno, u dane starijih CPU-a, programeri su koristili registre opće namjene s različitim imenima a, b, c i d.

Kad jednom počnete, nećete moći stati.

Jedna od tema kojom ćemo se pozabaviti idući mjesec je korištenje stogova, pa ćemo vas sada pripremiti da to pokrijete. Stog je područje memorije u kojem se mogu pohraniti privremene vrijednosti kada se registri trebaju osloboditi za druge svrhe. Ali većina važna prilika Stog je način na koji pohranjujete podatke na njega: vrijednosti ćete "gurnuti" na stog i "iskočiti" ih iz njega. Stog koristi LIFO (zadnji ušao, prvi izašao) princip, što znači da će zadnja dodana vrijednost biti prva koja će biti izbačena iz njega.

Zamislite da imate, na primjer, praznu Pringles torbu iu nju stavljate stvari sljedećim redom: dvoslojni kreker, Alpha čip i GameCube disk. Ako počnete uklanjati ove stvari, prvo ćete ukloniti GameCube disk, zatim Alpha karakterni čip, i tako dalje. Kada radite s asemblerskim jezikom, stog se koristi na sljedeći način:

Pritisnite 2 pritisnite 5 pritisnite 10 pop eax pop ebx pop ecx

Nakon što se izvrši ovih šest instrukcija, eax registar će sadržavati vrijednost 10, ebx registar će sadržavati vrijednost 5, a ecx registar će sadržavati vrijednost 2. Dakle, korištenje stoga je izvrstan način za privremeno oslobađanje registri; Ako, na primjer, postoje važne vrijednosti u eax i ebx registrima, ali morate obaviti trenutni posao prije njihove obrade, možete gurnuti te vrijednosti na stog, obaviti trenutni posao i izvaditi ih iz stog, vraćanje u prijašnje stanje registri

Osim toga, stog se koristi pri pozivanju potprograma za pohranjivanje povratne adrese u glavni kod. Iz tog razloga morate biti posebno oprezni kada radite sa stogom - ako prebrišete podatke pohranjene u njemu, nećete se moći vratiti na prethodni položaj u glavnom kodu aplikacije, postavljajući se za jednosmjerni sudar!

Idemo dalje

Povratak na kod: instrukcija mov pomiče (zapravo kopira) broj s jednog mjesta na drugo, s desna na lijevo. Dakle, u ovom slučaju kažemo da "poruku treba smjestiti u ecx registar". Ali što je "poruka"? Ovo nije još jedan registar, to je pokazivač na lokaciju podataka. Pri kraju koda, u odjeljku "podaci", možete pronaći oznaku poruke nakon koje slijedi db parametar, koji pokazuje da se nekoliko bajtova treba staviti u kod umjesto oznake poruke. Ovo je vrlo zgodno, budući da ne moramo otkriti točnu lokaciju retka "Pravila montaže!". u odjeljku podataka - možemo se jednostavno pozvati na njega pomoću oznake poruke. (Broj 10 nakon našeg retka je samo simbol za prelazak na nova linija, slično znaku \n koji se dodaje nizovima pri radu s programskim jezikom C).

Stoga stavljamo podatke o lokaciji niza u ecx registar. Ali ono što ćemo sljedeće učiniti je posebno zanimljivo. Kao što je ranije spomenuto, CPU nema nikakav pravi koncept hardverskih uređaja - da biste išta ispisali na zaslon, morat ćete poslati podatke video kartici ili premjestiti podatke u RAM video kartice. Ali nemamo nikakvih informacija o lokaciji RAM-a ove video kartice, osim toga, svatko koristi različite video kartice, postavke X poslužitelja prozorskog sustava, upravitelji prozora itd. Na temelju toga, izravno prikazivanje nečega na ekranu pomoću malog programa u našem je slučaju praktički nemoguće.

Stoga ćemo tražiti od OS kernela da to učini umjesto nas. Linux kernelčini ga dostupnim aplikacijama niske razine veliki broj sistemske pozive, pomoću kojih aplikacije mogu pokrenuti izvođenje raznih operacija na razini jezgre. Jedan od ovih sistemskih poziva je za izlaz tekstualni niz. Nakon što se ovaj sistemski poziv iskoristi, jezgra OS-a obavlja sav potreban posao - i, naravno, pruža još dublju razinu apstrakcije u kojoj redak može biti ispisan uobičajenim tekstualnim terminalom, emulatorom terminala X prozor sustava ili čak i zapisana u prethodno otvorenu datoteku.

Međutim, prije nego što kažemo OS kernelu da ispiše tekstualni niz, morat ćemo mu reći Dodatne informacije, uz informacije o lokaciji niza koji je već u ecx registru. Također ćemo mu morati reći koliko znakova treba ispisati kako se ispis retka ne bi nastavio nakon njegovog kraja. To je upravo ono za što se koristi redak iz podatkovnog odjeljka pri kraju koda aplikacije:

Duljina equ $ - poruka

Ovaj redak koristi oznaku različite duljine, ali umjesto da koristimo parametar db da tu oznaku povežemo s nekim podacima, koristimo parametar equ da naznačimo da je ova oznaka ekvivalentna nečemu (ovo je pomalo poput direktive pretprocesora #define u C-u programski jezik). Znak dolara odgovara trenutnom položaju u kodu, tako da u ovom slučaju kažemo "oznaka duljine mora biti ekvivalentna trenutnom položaju u kodu minus položaj retka s oznakom "poruka"".

Vratimo se na odjeljak aplikacijskog koda gdje postavljamo dana vrijednost u edx registru:

Mov edx, duljina

Sve ide u redu: dva registra su ispunjena informacijama o mjestu retka i broju znakova u retku koji će biti ispisan. Ali prije nego što kažemo OS kernelu da obavi svoj dio posla, moramo mu dati malo više informacija. Prvo, moramo reći jezgri OS-a koja se "ručka datoteke" treba koristiti - drugim riječima, kamo treba usmjeriti izlaz. Ova tema je izvan opsega priručnika za asemblerski jezik, pa recimo samo da trebamo koristiti standardni izlazni tok stdout , što znači: ispisati niz na ekran. Standardni tok Izlaz koristi fiksni regulator od 1, koji stavljamo u ebx registar.

Sada smo vrlo blizu pozivu sustava, ali postoji još jedan registar koji treba popuniti. Jezgra OS-a može izvesti veliki broj različitih operacija, kao što su montiranje datotečnih sustava, čitanje podataka iz datoteka, brisanje datoteka i druge. Odgovarajući mehanizmi se aktiviraju pomoću spomenutih sistemskih poziva i prije nego što kontrolu prenesemo na jezgru OS-a, morat ćemo joj reći koji sistemski poziv treba koristiti. Na stranici možete pronaći informacije o nekim sistemskim pozivima, dostupnih programa- u našem slučaju je potrebno sistemski poziv sys_write ("upisati podatke u deskriptor datoteke") s brojem 4. Stoga ćemo njegov broj smjestiti u eax registar:

I to je sve! Izvršili smo sve potrebne pripreme za upućivanje sistemskog poziva, tako da ćemo sada jednostavno prenijeti kontrolu na OS kernel na sljedeći način:

Instrukcija int označava "interrrupt" i doslovno prekida tijek izvođenja određenog programa, premještajući se u prostor jezgre OS-a. (U ovom slučaju koristi se heksadecimalna vrijednost 0x80 - za sada ne morate brinuti o tome.) OS kernel će ispisati niz na koji ukazuje vrijednost u ecx registru i zatim vratiti kontrolu našem programu.

Da bismo prekinuli izvršavanje programa, moramo izvršiti sistemski poziv sys_exit koji ima broj 1. Stoga ovaj broj stavljamo u eax registar, ponovno prekidamo izvršenje našeg programa, nakon čega OS kernel pažljivo prekida izvršenje našeg programa i vraćamo se na pozdrav naredbene ljuske. Možemo reći da ste izvršili zadatak: implementirali ste kompletan (iako vrlo jednostavan) program u asemblerskom jeziku, čiji je kod razvijen ručno bez korištenja opsežnih biblioteka.

Pokrili smo dosta aspekata korištenja asemblerskog jezika u ovom vodiču i, kao što je ranije spomenuto, mogli bismo se umjesto toga usredotočiti samo na teorijske informacije. Ali ipak se tome nadam pravi primjer Program vam je bio koristan, au sljedećem broju časopisa posvetit ćemo više vremena pokrivanju nekih koncepata koji su obrađeni u ovom vodiču. Osim toga, poboljšat ćemo naš program dodavanjem logike i potprograma - verzija if i goto naredbi na asemblerskom jeziku.

Dok se upoznajete s kodom ovog programa, možete ga pokušati sami modificirati za izvođenje sljedećih operacija:

  • Ispišite drugačiji, dulji niz.
  • Ispišite dva retka, jedan za drugim.
  • Vratite modificirani izlazni kod aplikacije u naredbenu ljusku (za to ćete morati koristiti Google tražilicu!).

Ako naiđete na poteškoće i trebate pomoć, posjetite naš forum na http://forums.linuxvoice.com - autor vodiča će biti u blizini i rado će vas uputiti na pravi put. Sretno programiranje!

Kada pišete program u asemblerskom jeziku, jednostavno pišete upute procesoru. Naredbe procesoru su jednostavno kodovi ili operativni kodovi ili operativni kodovi. Operativni kodovi su u biti verzije heksadecimalnih kodova "čitljivog teksta". Zbog toga se asembler smatra najviše jezik niske razine programiranja, sve se u asembleru izravno pretvara u heksadecimalni kodovi. Drugim riječima, nemate kompilator koji pretvara jezik visoke razine u jezik niske razine, asembler samo pretvara asemblerske kodove u podatke.

U ovom vodiču raspravljat ćemo o nekoliko operativnih kodova koji su povezani s računanjem, operacijama po bitovima itd. Drugi op kodovi: skok, usporedba, itd. upute će se raspravljati kasnije.

Komentari u vašim programima ostavljaju se iza točke i zareza. Baš kao u Delphiju ili C-u preko //.

Brojevi u asemblerskom jeziku mogu biti predstavljeni u binarnom, decimalnom ili heksadecimalnom obliku. Kako biste pokazali u kojem se sustavu broj koristi, morate staviti slovo iza broja. Za binarni sustav piše se slovo b (primjer: 0000010b, 001011010b), za decimalni sustav ne možete označiti ništa iza broja ili označiti slovo d (primjeri: 4589, 2356d), za heksadecimalni sustav morate navesti slovo h, heksadecimalni broj potrebno je pisati s nulom na početku (primjeri: 00889h, 0AC45h, 056Fh, pogrešno F145Ch, C123h).

Prva naredba bit će dobro poznata MOV. Ova se naredba koristi za kopiranje (ignoriranje naziva naredbe) vrijednosti s jedne lokacije na drugu. Ova "lokacija" može biti registar, memorijska lokacija ili neposredna vrijednost (sve dok izvorna vrijednost). Sintaksa naredbe:

Mov prijemnik, izvor

Možete kopirati vrijednost iz jednog registra u drugi.

Mov edx, ecx

Gornja naredba kopira sadržaj ecx u edx. Veličina izvora i prijemnika mora biti ista,

na primjer: ova naredba NIJE važeća:

Mov al, ecx; pogrešno

Ovaj operativni kod pokušava smjestiti DWORD (32-bitnu) vrijednost u bajt (8 bita). To se ne može učiniti pomoću naredbe mov (za to postoje druge naredbe).

I ove su naredbe točne jer se njihov izvor i odredište ne razlikuju u veličini:

Mov al, bl mov cl, dl mov cx, dx mov ecx, ebx

Također možete dobiti vrijednost iz memorije i staviti je u registar. Na primjer, uzmite sljedeći memorijski krug:

pristranost34 35 36 37 38 39 3A3B3C3D3E3F40 41 42
podaci0D0A50 32 44 57 25 7A5E72 E.F.7DFFOGLASC7
(Svaki blok predstavlja bajt)

Vrijednost pomaka je ovdje naznačena kao bajt, ali u stvarnosti je to 32-bitna vrijednost. Uzmimo 3A kao primjer, ovo je također 32-bitna vrijednost: 0000003Ah. Samo radi uštede prostora, neki koriste male pomake.

Pogledajte pomak 3A u gornjoj tablici. Podaci na ovom odmaku su 25, 7A, 5E, 72, EF, itd. Za stavljanje vrijednosti na pomaku 3A u registar, na primjer, također koristite naredbu mov:

Mov eax, dword ptr

Znači: smjestite vrijednost s DWORD veličinom (32-bita) iz memorije na pomaku 3Ah u eax registar. Nakon pokretanja ove naredbe, eax će sadržavati vrijednost 725E7A25h. Možda ste primijetili da je ovo obrnuto od onoga što je u memoriji: 25 7A 5E 72. To je zato što su vrijednosti pohranjene u memoriji pomoću formata little endian. To znači da je najmanje značajan bajt pohranjen u najznačajnijem bajtu: redoslijed bajtova natrag prema naprijed. Mislim da će ovi primjeri to pokazati:

  • dword (32-bitna) vrijednost 10203040 heksadecimalna pohranjuje se u memoriju kao: 40, 30, 20, 10
  • riječ (16-bitna) vrijednost 4050 heksadecimalna pohranjuje se u memoriju kao: 50, 40

Vratimo se na gornji primjer. To možete učiniti i s drugim veličinama:

Mov cl, bajt ptr ; cl će dobiti vrijednost 0Dh mov dx, riječ ptr ; dx će dobiti vrijednost 7DEFh

Vjerojatno ste već shvatili da ptr prefiks znači da trebate uzeti određenu veličinu iz memorije. A prefiks ispred ptr označava veličinu podataka:

Bajt - 1 bajt Riječ - 2 bajta Driječ - 4 bajta

Ponekad veličina možda nije navedena:

Mov eax,

Budući da je eax 32-bitni registar, asembler zna da mu je također potrebna 32-bitna vrijednost, u ovom slučaju iz memorijskog pomaka 403045h.

Također možete koristiti izravne vrijednosti:

Mov edx, 5006h

Ova naredba će jednostavno pisati u edx registar, vrijednost 5006. Zagrade, [ i ], koriste se za dobivanje vrijednosti iz memorije (pomak je u zagradama), bez zagrada, to je samo neposredna vrijednost.

Također možete koristiti registar kao memorijsku lokaciju (mora biti 32-bitni u 32-bitnim programima):

Mov eax, 403045h; upisuje u eax vrijednost 403045 mov cx, ; stavlja vrijednost ( veličina riječi) iz sjećanja; navedeno u EAX (403045)

U mov cx, procesor prvo gleda koja vrijednost (=memorijska ćelija) sadrži eax, zatim koja je vrijednost u toj memorijskoj ćeliji, i stavlja tu vrijednost (riječ, 16 bita, jer odredište, cx, je 16-bitno registar) u CX.

Stack operacije - PUSH, POP. Prije nego što sam vam rekao o operacijama snopa, već sam vam objasnio što je snop. Stog je područje u memoriji na koje ukazuje ESP registar stoga. Stog je mjesto za pohranjivanje povratnih adresa i privremenih vrijednosti. Postoje dvije naredbe za guranje vrijednosti na stog i izbacivanje sa stoga: PUSH i POP. Naredba PUSH gura vrijednost na stog, tj. smješta vrijednost u memorijsku lokaciju na koju pokazuje ESP registar, nakon čega se vrijednost ESP registra povećava za 4. Instrukcija Pop izbacuje vrijednost iz stoga, tj. izbacuje vrijednost iz memorijske lokacije na koju pokazuje ESP registar, zatim smanjuje vrijednost ESP registra za 4. Zadnja vrijednost gurnuta na stog se izbacuje prva. Kada se vrijednost gurne na stog, pokazivač na stog se dekrementira, a kada se vrijednost izbaci, povećava se. Pogledajmo primjer:

(1) mov ecx, 100 (2) mov eax, 200 (3) push ecx ; spremi ecx (4) pritisni eax (5) xor ecx, eax (6) dodaj ecx, 400 (7) mov edx, ecx (8) pop ebx (9) pop ecx

  • 1: stavite 100 u ecx
  • 2: stavite 200 u eax
  • 3: gurnite vrijednost iz ecx (=100) na stog (prvo gurnuto)
  • 4: gurnite vrijednost iz eax (=200) na stog (posljednje gurnuto)
  • 5/6/7: izvođenje operacija na ecx, mijenja se vrijednost u ecx
  • 8: izbaci vrijednost sa stoga u ebx: ebx će postati 200 (zadnje gurnuto, prvo izbačeno)
  • 9: iskakanje vrijednosti sa stoga u ecx: ecx će ponovno postati 100 (prvo gurnuto, zadnje izvađeno)

Da biste vidjeli što se događa u memoriji kada se vrijednosti postave i izbace na stog, pogledajte donju sliku:

(skup je ovdje ispunjen nulama, ali to ovdje nije slučaj). ESP je na mjestu na koje pokazuje)

Mov ax, 4560h push ax mov cx, FFFFh push cx pop edx edx sada je 4560FFFFh.

Pozivanje potprograma i povratak s njih - CALL, RET. Naredba poziva prenosi kontrolu na proceduru blizu ili daleko, pohranjujući adresu povratne točke na stog. Naredba ret vraća kontrolu s procedure pozivnom programu i prima povratnu adresu sa stoga. Primjer:

Kod.. nazovite 0455659 ..još koda.. Kod s adrese 455659: add eax, 500 mul eax, edx ret

Kada se naredba poziva izvrši, procesor prenosi kontrolu kodu na adresi 455659 i izvršava je do naredbe ret, a zatim vraća kontrolu naredbi koja slijedi nakon poziva. Kod koji se poziva pozivnom naredbom naziva se procedura. Možete staviti kod koji često koristite u proceduru i pozvati ga svaki put kada vam zatreba naredbom poziva.

Više detalja: Naredba poziva gura EIP registar (pokazivač na sljedeću instrukciju koja će se izvršiti) na stog, a naredba ret ga izbacuje i prenosi kontrolu na ovu adresu. Također možete navesti argumente za program (proceduru) koji će se pozvati. To se može učiniti putem stoga:

Procedura poziva push value_1 push value_2

Unutar procedure, argumenti se mogu čitati sa stoga i koristiti. Lokalne varijable, tj. Podaci koji su potrebni samo unutar procedure također se mogu pohraniti na stog. Neću ulaziti u detalje o tome jer se to lako može napraviti u MASM i TASM asemblerima. Samo zapamtite da možete izraditi procedure i da one mogu koristiti parametre.

Jedan važna nota: Eax registar se gotovo uvijek koristi za pohranjivanje rezultata procedure.

Ovo se također odnosi na Windows funkcije. Naravno, možete koristiti bilo koji drugi slučaj u svojim postupcima, ali ovo je standard.

To je kraj još jedne lekcije. U sljedećoj lekciji ćemo napisati naš prvi program u asemblerskom jeziku.

Natrag | Sadržaj |

Ostavite komentar

Komentari

stog raste do dna i što je veći, ESP je manji

Dakle ovako nešto?:
|| poput prazne hrpe
V
| |ESP
| |6
| |5
| |4
| |3
| |2
| |1
| |0

Nakon šifre
pritisnite 0fh
pritisnite 0ffh

|| vrsta hrpe
V
|0fh|7
|0ffh|6
| |ESP
| |4
| |3
| |2
| |1
| |0

Ako je tako onda
što znači ESP kada je stog prazan?