Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Windows 10
  • Razmišljanja o programiranju na asembleru. Zaroniti u asembler

Razmišljanja o programiranju na asembleru. Zaroniti u asembler

Danas postoji ogroman broj programskih jezika visoke razine. S obzirom na njihovu pozadinu, programiranje u jeziku niske razine - asembleru - može se na prvi pogled činiti kao nešto zastarjelo i iracionalno. Međutim, samo se čini da jest. Treba priznati da je asembler zapravo jezik procesora, što znači da se od njega ne može izostati sve dok procesori postoje. Glavne prednosti programiranja u asembleru su maksimalna brzina i minimalna veličina rezultirajućih programa.

Nedostaci su često samo zbog tendencije modernog tržišta da preferira količinu nad kvalitetom. Moderna računala mogu se lako nositi s hrpom naredbi funkcija visoke razine, a ako nije lako - nadogradite hardver svog stroja! Ovo je zakon komercijalnog programiranja. Ako govorimo o programiranju za dušu, onda će kompaktan i okretan program napisan na asembleru ostaviti puno ugodniji dojam od visokorazinenog gromada, opterećen gomilom nepotrebnih operacija. Postoji mišljenje da samo nekolicina odabranih može programirati na asembleru. To nije istina. Naravno, talentirani programeri asemblera mogu se nabrojati na jednu ruku, ali to je slučaj u gotovo svakom području ljudske djelatnosti. Nema toliko asova vozača, ali svatko će moći naučiti voziti auto – bila bi želja. Nakon što pročitate ovu seriju članaka, nećete postati jaki hakeri. Međutim, dobit ćete pregled i naučiti jednostavne načine programiranja u asemblerskom jeziku za Windows pomoću ugrađenih funkcija i makro uputa kompajlera. Naravno, da biste svladali Windows programiranje, morate imati Windows vještine i iskustvo. U početku nećete puno toga razumjeti, ali nemojte se zbog toga obeshrabriti i čitajte dalje: s vremenom će sve doći na svoje mjesto.

Dakle, da bismo počeli s programiranjem, trebat će nam barem kompajler. Prevoditelj je program koji prevodi izvorni kod koji je napisao programer u strojni kod koji može izvršiti procesor. Većina tutorijala u asembleru usmjerena je na korištenje paketa MASM32 (Microsoft Macro Assembler). Ali ja ću vas, u obliku raznolikosti i iz niza drugih razloga, upoznati s mladim brzopopularnim kompajlerom FASM (Flat Assembler). Ovaj je prevodilac prilično jednostavan za instalaciju i korištenje, kompaktan je i brz, ima bogatu i prostranu sintaksu makroa koja vam omogućuje automatizaciju mnogih rutinskih zadataka. Njegovu najnoviju verziju možete preuzeti s web stranice odabirom ravnog asemblera za Windows. Da biste instalirali FASM, stvorite mapu, na primjer "D: \ FASM" i u nju raspakirajte sadržaj preuzete zip arhive. Pokrenite FASMW.EXE i zatvorite bez promjene. Usput, ako koristite standardni istraživač, a ekstenzija datoteke nije prikazana (na primjer, .EXE), preporučam da pokrenete Alati -> Opcije mape -> Pregled i poništite potvrdni okvir Sakrij ekstenzije za registrirane vrste datoteka. Nakon prvog pokretanja kompajlera, konfiguracijska datoteka bi se trebala pojaviti u našoj mapi - FASMW.INI. Otvorite ga standardnom bilježnicom i dodajte 3 retka na samom dnu:

Fasminc = D: \ FASM \ INCLUDE
Uključi = D: \ FASM \ INCLUDE

Ako ste raspakirali FASM na drugo mjesto, zamijenite "D: \ FASM \" svojim vlastitim putem. Spremite i zatvorite FASMW.INI. Gledajući unaprijed, ukratko ću objasniti kako ćemo koristiti kompajler:
1. Napišemo tekst programa, ili otvorimo prethodno napisani tekst spremljen u .asm datoteci, ili kombinacijom zalijepimo tekst programa iz međuspremnika.
2. Pritisnite F9 za prevođenje i pokretanje programa ili Ctrl + F9 samo za kompajliranje. Ako tekst programa još nije spremljen, prevodilac će od vas tražiti da ga spremite prije kompilacije.
3. Ako je program pokrenut, testiramo ga na ispravan rad, ako nije, tražimo greške od kojih će nam najgrublje kompajler ukazati ili suptilno nagovijestiti.
E, sad možemo započeti dugo očekivanu praksu. Pokrećemo naš FASMW.EXE i u njega upisujemo kod našeg prvog programa:

Uključite "% fasminc% / win32ax.inc"

Podaci
Naslov db "Moj prvi program.", 0
Tekst db "Pozdrav svima!", 0

Kodirati
početak:

pozovite ExitProcess, 0

Kliknite Run -> Run ili F9 na tipkovnici. U prozoru za spremanje navedite naziv datoteke i mapu za spremanje. Preporučljivo je naviknuti se na spremanje svakog programa u zasebnu mapu kako se ne biste zbunili u budućnosti, kada svaki program može imati hrpu datoteka: slike, ikone, glazbu i tako dalje. Ako prevodilac generira pogrešku, pažljivo provjerite redak koji je naveo - možda ste propustili zarez ili razmak. Također morate biti svjesni da je prevodilac osjetljiv na velika i mala slova, pa se podaci i podaci tretiraju kao dvije različite upute. Ako ste sve učinili ispravno, rezultat će biti najjednostavniji MessageBox (slika 1). Sada shvatimo što smo napisali u tekstu programa. U prvom retku, s direktivom uključivanja, uključili smo veliki tekst iz nekoliko datoteka u naš program. Sjećate se, prilikom instalacije smo napisali 3 retka u FASM ini-datoteci? Sada% fasminc% u tekstu programa znači D: \ FASM \ INCLUDE ili put koji ste naveli. Direktiva uključi, takoreći, umeće tekst iz druge datoteke na navedeno mjesto. Otvorite datoteku WIN32AX.INC u mapi include koristeći notepad ili u samoj fasmi i provjerite jesmo li automatski uključili (priložili) u naš program tekst iz win32a.inc, macro / if.inc, hrpa nerazumljivog (još ) makro upute i zajednički skup knjižnica funkcija sustava Windows. Zauzvrat, svaka od uključenih datoteka može sadržavati još nekoliko uključenih datoteka, a ovaj lanac može ići izvan horizonta. Uz pomoć uključenih datoteka organiziramo neku vrstu jezika visoke razine: kako bismo izbjegli rutinu ručnog opisivanja svake funkcije, povezujemo cijele biblioteke za opisivanje standardnih Windows funkcija. Je li sve to doista potrebno za tako mali program? Ne, ovo je nešto kao "džentlmenski set za sve prilike". Pravi hakeri, naravno, ne povezuju sve, ali mi tek učimo, pa je ovo prvi put oprostivo.

Zatim smo označili odjeljak podataka - .data. U ovom odjeljku deklariramo dvije varijable - Caption i Text. To nisu posebne naredbe, pa se njihova imena mogu mijenjati kako želite, čak i ako su a i b, samo bez razmaka, a ne na ruskom. Pa, ne možete pozvati varijable s rezerviranim riječima, na primjer, kod ili podaci, ali možete kodirati_ ili data1. Naredba db znači "definiraj bajt". Naravno, sav ovaj tekst neće stati u jedan bajt, jer svaki pojedinačni znak zauzima cijeli bajt. Ali u ovom slučaju, ovom naredbom definiramo samo varijablu pokazivača. Sadržavat će adresu na kojoj je pohranjen prvi znak niza. Tekst niza je naveden u navodnicima, a navodnici se, po želji, mogu postaviti i "takav" i "takav" - ako je samo početni navodnik isti kao krajnji. Nula iza zareza dodaje null bajt na kraj niza, koji označava kraj niza (null-terminator). Pokušajte ukloniti ovu nulu zajedno sa zarezom u prvom retku i vidjeti što ćete dobiti. U drugom retku u ovom konkretnom primjeru možete učiniti bez nule (uklanjamo je zajedno sa zarezom - inače će prevodilac naznačiti grešku), ali to će raditi samo zato što u našem primjeru sljedeći odjeljak počinje odmah nakon drugog liniju, a prevodilac će automatski unijeti hrpu nula koje poravnavaju prethodni odjeljak. Općenito, nule na kraju redaka teksta su obavezne! Sljedeći odjeljak je dio izvršnog programskog koda - .code. Na početku odjeljka nalazi se početak: oznaka. To znači da će se s tog mjesta naš program početi izvršavati. Prva naredba je pozvati makroinstrukciju. Poziva API MessageBox ugrađen u Windows. API funkcije (sučelje za programiranje aplikacije) uvelike pojednostavljuju rad u operativnom sustavu. Nekako tražimo od operativnog sustava da izvrši neku standardnu ​​radnju, a on izvrši i po završetku nam vrati rezultat obavljenog posla. Nakon naziva funkcije slijede njeni parametri, odvojeni zarezima. Funkcija MessageBox ima sljedeće parametre:

1. parametar mora sadržavati ručku prozora vlasnika. Ručka je nešto poput osobnog broja koji operacijski sustav izdaje svakom objektu (procesu, prozoru itd.). 0 u našem primjeru znači da prozor nema vlasnika, on je sam po sebi i ne ovisi o drugim prozorima.
2. parametar je pokazivač na adresu prvog slova teksta poruke, koji završava gore spomenutim null terminatorom. Da bismo jasno razumjeli da je ovo samo adresa, pomaknimo ovu adresu za 2 bajta desno u pozivu funkcije: pozovite MessageBox, 0, Text + 2, Caption, MB_OK i provjerite da li će sada tekst biti prikazan bez prva dva slova .
3. - adresni pokazivač prvog slova zaglavlja poruke.
4. - stil poruke. Popis ovih stilova možete pronaći, na primjer, u INCLUDE \ EQUATES \ USER32.INC. Da biste to učinili, bolje je upotrijebiti pretraživanje u Notepadu kako biste brzo pronašli MB_OK i ostalo. Tu, nažalost, nema opisa, ali iz naziva stila obično se može pogoditi njegova svrha. Usput, svi ovi stilovi mogu se zamijeniti brojem koji znači jedan stil ili njihovu kombinaciju, na primjer: MB_OK + MB_ICONEXCLAMATION. USER32.INC sadrži heksadecimalne vrijednosti. Možete ih koristiti u ovom obliku ili ih pretvoriti u decimale u inženjerskom načinu standardnog Windows kalkulatora. Ako niste upoznati s brojevnim sustavima i ne znate kako se decimalni razlikuje od heksadecimalnog, onda imate 2 izlaza: ili da se upoznate s ovim pitanjem na internetu / u udžbeniku / pitate prijatelja, ili ostavite ovaj pothvat do boljeg puta i pokušajte bez ovih informacija. Ovdje neću davati niti kratke informacije o brojevnim sustavima s obzirom na činjenicu da je i bez mene o njima napisan ogroman broj članaka i stranica bilo koje zamislive razine.

Vratimo se našim ovnovima. Neki stilovi se ne mogu koristiti istovremeno - na primjer, MB_OKCANCEL i MB_YESNO. Razlog je taj što će zbroj njihovih numeričkih vrijednosti (1 + 4 = 5) odgovarati vrijednosti drugog stila - MB_RETRYCANCEL. Sada eksperimentirajte s parametrima funkcije kako biste materijal učinili praktičnijim i idemo dalje. Funkcija MessageBox pauzira izvršavanje programa i čeka na radnju korisnika. Po završetku, funkcija vraća rezultat radnje korisnika u program, a program nastavlja raditi. Poziv funkcije ExitProcess završava proces našeg programa. Ova funkcija ima samo jedan parametar, izlazni kod. Obično, ako program izlazi normalno, ovaj kod je nula. Da biste bolje razumjeli zadnji redak našeg koda - .end start - pažljivo proučite ekvivalentni kod: format PE GUI 4.0

uključiti "% fasminc% / win32a.inc"

odjeljak ".data" podaci čitljivi za pisanje

Naslov db "Naš prvi program.", 0
Tekst db "FASM asembler je jednostavan!", 0

odjeljak ".code" kod čitljiv izvršni
početak:
pozovite MessageBox, 0, Text, Caption, MB_OK
pozovite ExitProcess, 0

odjeljak ".idata" uvoz podataka čitljiv za pisanje
biblioteka KERNEL32, "KERNEL32.DLL", \
USER32, "USER32.DLL"

uvoz KERNEL32, \
ExitProcess, "ExitProcess"

uvoz USER32, \
MessageBox, "MessageBoxA"

Za prevodilac je gotovo identičan prethodnom primjeru, ali za nas ovaj tekst izgleda kao drugačiji program. Posebno sam naveo ovaj drugi primjer kako biste na samom početku dobili ideju o korištenju makroinstrukcija i od sada, prelazeći s jedne povezane datoteke na drugu, samostalno došli do pravog koda programa skrivenog pod velom makronaredbi. Pokušajmo otkriti razlike. Prva stvar, ne baš upečatljiva, ali vrijedna posebne pažnje, je da se na tekst programa povezujemo ne win32ax, već samo win32a. Napustili smo veliki skup i ograničili se na mali. Pokušat ćemo bez povezivanja svega po redu iz win32axa, iako nam za sada još treba nešto od toga. Stoga, prema makronaredbama iz win32axa, ručno pišemo neke definicije. Na primjer, makronaredba iz win32ax datoteke:
makro .data (odjeljak ".data" podaci čitljivi za pisanje)

u vrijeme kompajliranja, automatski zamjenjuje.data odjeljkom ".data" podaci čitljivi za pisanje. Budući da ovu makronaredbu nismo uključili u tekst programa, moramo sami napisati detaljnu definiciju odjeljka. Analogno, u drugom primjeru možete pronaći razloge za ostale izmjene teksta programa. Makronaredbe vam pomažu izbjeći gnjavažu pisanja velikih programa. Stoga se samo odmah trebate naviknuti na njih, a zavoljeti ćete ih tek kasnije =). Pokušajte sami shvatiti razlike između prvog i drugog primjera, koristeći tekst makronaredbi korištenih u win32axu. Samo ću reći da u navodnicima možete odrediti bilo koji drugi naziv za odjeljak podataka ili kod - na primjer: odjeljak "virus" kod čitljiv izvršni. Ovo je samo naziv odjeljka i nije naredba ili operator. Ako sve shvatite, tada već možete napisati svoj vlastiti virus. Vjerujte mi, vrlo je lako. Samo promijenite naslov i tijelo posta:
Naslov db "Opasni virus.", 0

Tekst db "Bok, ja sam posebno opasan trojanski virus i širim se internetom.", 13, \
"Budući da moj autor ne može pisati štetne viruse, morate mi pomoći." 13, \
"Učinite sljedeće:", 13, \
"1.Izbrišite direktorije C: \ Windows i C: \ Programske datoteke na vašem disku", 13, \
"2.Pošalji ovu datoteku svima koje poznaješ", 13, \
"Unaprijed hvala.", 0

Broj 13 je kod za povratni znak za Microsoftove sustave. Znak \ koristi se u sintaksi FASM-a za kombiniranje više redaka u jedan, bez njega bi bio predugačak red koji ide od ruba zaslona. Na primjer, možemo napisati start:, ili možemo napisati st \
ar \
t:

Prevoditelj neće primijetiti razliku između prve i druge opcije.
Pa, da pojačate hrabrost u našem "virusu", možete zamijeniti MB_OK s MB_ICONHAND ili jednostavno brojem 16. U ovom slučaju, prozor će imati stil poruke o pogrešci i proizvesti će impresivniji učinak na žrtvu " infekcija" (slika 2).

To je sve za danas. Želim ti uspjeh i vidimo se uskoro!
Svi navedeni primjeri testirani su za ispravan rad na sustavu Windows XP i najvjerojatnije će raditi na drugim verzijama sustava Windows, no ne jamčim da će ispravno raditi na vašem računalu. Izvorne kodove programa možete pronaći na forumu.

Programiranje asemblerskog jezika

Ovaj dio tečaja pokriva osnove programiranja asemblerskog jezika za Win32 arhitekturu.

Sve procese u stroju na najnižoj, hardverskoj razini pokreću samo naredbe (upute) strojnog jezika. Jezik asemblera je simbolički prikaz strojnog jezika... Assembler vam omogućuje pisanje kratkih i brzih programa. Međutim, ovaj proces je izuzetno dugotrajan. Za pisanje najučinkovitijeg programa potrebno vam je dobro poznavanje značajki naredbi asemblerskog jezika, pažnja i točnost. Stoga su u stvarnosti uglavnom programi napisani na asembleru, što bi trebalo osigurati učinkovit rad s hardverom. Također, dijelovi programa koji su kritični u smislu vremena izvršavanja ili potrošnje memorije napisani su u asembleru. Nakon toga se formatiraju kao potprogrami i kombiniraju s kodom jezika visoke razine.

1. Registri

Registri su posebna memorijska mjesta smještena izravno u procesoru. Rad s registrima je mnogo brži od rada s memorijskim ćelijama; stoga se registri aktivno koriste i u programima asemblerskog jezika i od strane prevoditelja jezika visoke razine.

Registri se mogu podijeliti na opći registri,naredbeni pokazivač,registar zastavica i registre segmenta.

1.1. Registri opće namjene

DO registri opće namjene su skupina od 8 registara koji se mogu koristiti u programu asemblerskog jezika. Svi registri su veličine 32 bita i mogu se podijeliti na 2 ili više dijelova.

Kao što možete vidjeti na slici, registri ESI, EDI, ESP i EBP omogućuju vam pristup nižim 16 bitova po nazivima SI, DI, SP i BP, dok vam registri EAX, EBX, ECX i EDX omogućuju za pristup nižim 16 bitova (po imenima AX , BX, CX i DX) i odvojeno do dva najmanje značajna bajta (po imenima AH / AL, BH / BL, CH / CL i

Nazivi registara potječu od njihove namjene:

EAX / AX / AH / AL (registar akumulatora) - akumulator;

EBX / BX / BH / BL (bazni registar) - osnovni registar;

ECX / CX / CH / CL (registar brojača) - brojač;

EDX / DX / DH / DL (registar podataka) - registar podataka;

ESI / SI (registar izvornog indeksa) - izvorni indeks;

EDI / DI (destination index register) - indeks primatelja (receiver);

ESP / SP (stack pointer register) - registar pokazivača steka;

EBP / BP (registar baznog pokazivača) - registar osnovnog pokazivača okvira steka.

Unatoč postojećoj specijalizaciji, svi registri se mogu koristiti u bilo kojoj operaciji stroja. Međutim, treba uzeti u obzir činjenicu da neke naredbe rade samo s određenim registrima. Na primjer, upute za množenje i dijeljenje koriste registre EAX i EDX za pohranu izvornih podataka i rezultata operacije. Upute za kontrolu ciklusa koriste registar ECX kao brojač ciklusa.

Još jedna nijansa je korištenje registara kao baze, t.j. adrese pohrane RAM-a. Kao bazni registri mogu se koristiti bilo koji registri, ali je poželjno koristiti EBX, ESI, EDI ili EBP registre. U ovom slučaju, veličina strojne instrukcije obično je manja.

Nažalost, broj registara je katastrofalno mali i često je teško pronaći najbolji način za njihovo korištenje.

1.2. Pokazivač naredbe

EIP registar ( naredbeni pokazivač) sadrži pomak sljedeće naredbe koju treba izvršiti. Ovaj registar nije izravno dostupan programatoru, ali se učitavanje i mijenjanje njegove vrijednosti obavlja raznim upravljačkim naredbama koje uključuju naredbe za uvjetne i bezuvjetne skokove, pozive procedura i povratak iz procedura.

1.3. Registar zastave

Zastava je bit koji uzima vrijednost 1 ("zastava je postavljena") ako je određeni uvjet ispunjen, a vrijednost 0 ("zastava je obrisana") u suprotnom. Procesor ima registar zastavica koji sadrži skup zastavica koje odražavaju trenutno stanje procesora.

Oznaka

Ime

Prenesena zastava

Rezervirano

Zastava pariteta

Rezervirano

Pomoćna zastava za nošenje

Pomagač

Rezervirano

Nulta zastava

Signalna zastava

Tracer zastava

Oznaka za omogućavanje prekida

Zastava rezolucije

Zastava je usmjerena

Repo zastava

I/O razina privilegija

Razina na

Zastava ugniježđena

Rezervirano

Zastava oživjela

Virtual-8086 način rada

Virtualni način rada

Provjeriti te

Zastava virtualnog prekida

Virtualan

Virtualni prekid na čekanju

U tijeku

Provjera za

Rezervirano

Zastavice CF, DF i IF mogu se mijenjati izravno u registru zastavica korištenjem posebnih uputa (na primjer, CLD za brisanje zastavice smjera), ali ne postoje upute koje vam omogućuju pristup registru zastavica kao običnom registru. Međutim, možete uštedjeti

registrirajte zastavice na stog ili AH registar i vratite registar zastavice iz njih koristeći upute LAHF, SAHF, PUSHF, PUSHFD, POPF i POPFD.

1.3.1. Statusne zastavice

Statusne zastavice (bitovi 0, 2, 4, 6, 7 i 11) odražavaju rezultat izvršavanja aritmetičkih instrukcija kao što su ADD, SUB, MUL, DIV.

Oznaka prijenosa CF postavlja se pri prijenosu s MSB-a / posuđivanja na MSB i označava prisutnost preljeva u nepredznačnoj cjelobrojnoj aritmetici. Također se koristi u dugoj aritmetici.

Oznaka parnosti PF postavlja se ako najmanji značajan bajt rezultata sadrži paran broj bitova od jednog. U početku je ova zastavica bila namijenjena za korištenje u komunikacijskim programima: pri prijenosu podataka preko komunikacijskih linija mogao se prenijeti i paritetni bit radi kontrole, a upute za provjeru zastavice parnosti olakšavale su provjeru integriteta podataka.

Pomoćnik nosi zastavu AF je postavljen na izvođenje iz bita 3 rezultat / posudba u 3 rezultat bit. Ova zastava je namijenjena za korištenje u binarni decimalni (binarni decimalni, BCD) aritmetika.

ZF nula zastavica se postavlja ako je rezultat nula.

Oznaka predznaka SF jednaka je vrijednosti najznačajnijeg bita rezultata, a to je bit predznaka u aritmetici s predznakom.

Zastava za prelijevanje OF se postavlja ako je cjelobrojni rezultat predug da stane u ciljni operand (registar ili memorijska lokacija). Ova zastavica označava prisutnost preljeva u predznačnoj cjelobrojnoj aritmetici.

Od navedenih zastavica, samo se CF zastavica može promijeniti izravno pomoću STC, CLC i CMC uputa.

Statusne zastavice dopuštaju istoj aritmetičkoj instrukciji da proizvede tri različite vrste rezultata: neoznačeni, predpisani i binarno-decimalni (BCD) cijeli broj. Ako se rezultat smatra nepredpisanim brojem, tada CF zastavica označava uvjet prelijevanja (prenošenje ili posuđivanje), za potpisani rezultat prijenos ili posuđivanje prikazuje OF zastavicu, a za BCD rezultat prijenos/posuđivanje pokazuje AF zastava. SF zastava odražava znak potpisanog rezultata, ZF zastavica odražava i nepotpisani i nulti rezultat s predznakom.

U dugoj cjelobrojnoj aritmetici, CF zastavica se koristi zajedno s instrukcijama zbrajanja i prijenosa (ADC) i oduzimanja i posuđivanja (SBB) za širenje prijenosa ili posuđivanja s jednog izračunanog bita dugog broja na drugi.

Upute

uvjetovano

prijelaz Jcc (prijelaz

uvjet cc), SETcc (set

značenje

rezultat bajta

ovisnosti

pojmovi cc), LOOPcc (organizacija

i CMOVcc (uvjetno

kopirati)

koristiti

jedan ili više

statusne zastavice za provjeru stanja. Na primjer, JLE (skok ako je manji ili jednak) instrukcija skoka testira uvjet “ZF = 1 ili SF ≠ OF”.

PF zastava je uvedena radi kompatibilnosti s drugim arhitekturama mikroprocesora i rijetko se koristi za namjeravanu svrhu. Češće ga je koristiti u kombinaciji s drugim statusnim zastavicama u aritmetici s pomičnim zarezom: upute za usporedbu (FCOM, FCOMP, itd.) u matematičkom koprocesoru postavljaju zastavice uvjeta C0, C1, C2 i C3 u njemu, a ove zastavice može se kopirati u registar zastava. Da biste to učinili, preporuča se koristiti instrukciju FSTSW AX za spremanje riječi statusa koprocesora u AX registar i SAHF instrukciju za naknadno kopiranje sadržaja registra AH u donjih 8 bitova registra zastavica, s C0 unos zastavice CF, C2 u PF, a C3 u ZF. Oznaka C2 postavlja se, na primjer, u slučaju neusporedivih argumenata (NaN ili nepodržani format) u iskazu za usporedbu FUCOM.

1.3.2. Kontrolna zastavica

Zastava smjera DF (bit 10 u registru zastavice) kontrolira niz instrukcija (MOVS, CMPS, SCAS, LODS i STOS) - postavljanje zastavice prisiljava adrese na smanjenje (procesne linije s visokih adresa na niske), nuliranje uzrokuje povećanje adresa. Izjave STD i CLD postavljaju i brišu DF zastavu, respektivno.

1.3.3. Zastavice sustava i IOPL polje

Oznake sustava i IOPL polje kontroliraju operacijsko okruženje i nisu namijenjene za korištenje od strane aplikacijskih programa.

Oznaka za omogućavanje prekida IF - Brisanje ove zastavice onemogućuje odgovaranje na zahtjeve za maskiranim prekidima.

Zastava traga TF - postavljanje ove zastavice omogućuje otklanjanje pogrešaka korak po korak, kada nakon svakog izvršenja

instrukcije, program se prekida i poziva se poseban rukovalac prekida.

IOPL polje označava razinu I/O prioriteta izvršnog programa ili zadatka: da bi program ili zadatak izvršio I/O instrukcije ili promijenio IF zastavicu, njegova trenutna razina prioriteta (CPL) mora biti ≤ IOPL.

Zastavica ugniježđenja zadatka NT - Ova se zastavica postavlja kada je trenutni zadatak "ugniježđen" u drugi, prekinuti zadatak, a segment stanja TSS-a trenutnog zadatka daje povratnu informaciju TSS-u prethodnog zadatka. NT zastavicu provjerava IRET instrukcija kako bi se utvrdilo je li tip povrata međuzadatak ili unutar zadatka.

Oznaka za nastavak RF se koristi za maskiranje grešaka u otklanjanju pogrešaka.

VM - postavljanje ove zastavice u zaštićeni način uzrokuje prelazak na virtualni 8086 način rada.

Zastavica za provjeru poravnanja AC - postavljanje ove zastavice zajedno s AM bitom u registru CR0 omogućuje kontrolu poravnanja operanda tijekom pristupa memoriji: pristup neusklađenom operandu izaziva iznimku.

VIF - virtualna kopija IF zastave; koristi se zajedno s VIP zastavom.

VIP - postavljen za označavanje prisutnosti prekida na čekanju.

ID - mogućnost programske promjene ove zastavice u registru zastavice ukazuje na podršku za CPUID instrukciju.

1.4. Registri segmenata

Procesor ima 6 takozvanih segmentnih registara: CS, DS, SS, ES, FS i GS. Njihovo postojanje posljedica je specifičnosti organizacije i korištenja RAM-a.

16-bitni registri mogli su adresirati samo 64 KB RAM-a, što očito nije dovoljno za više-manje pristojan program. Stoga je memorija dodijeljena programu u obliku nekoliko segmenata veličine 64 KB. U ovom slučaju, apsolutne adrese bile su 20-bitne, što je omogućilo adresiranje već 1 MB RAM-a. Postavlja se pitanje - kako pohraniti 20-bitne adrese koje imaju 16-bitne registre? Kako bi se riješio ovaj problem, adresa je prekinuta na temelju pomaka. Baza je adresa početka segmenta, a pomak je broj bajta unutar segmenta. Navedeno je ograničenje na adresu početka segmenta - morala je biti višekratnik od 16. U ovom slučaju, posljednja 4 bita bila su jednaka 0 i nisu bila pohranjena, već implicirana. Tako su dobivena dva 16-bitna dijela adrese. Za dobivanje

apsolutne adrese, četiri nula bita su dodana bazi, a rezultirajuća vrijednost dodana je s pomakom.

Segmentni registri korišteni su za pohranjivanje adrese početka kodnog segmenta (CS - segment koda), segmenta podataka (DS - segment podataka) i segmenta steka (SS - segment steka). Kasnije su dodani registri ES, FS i GS. Postojalo je nekoliko memorijskih modela, od kojih je svaki podrazumijevao dodjelu jednog ili više segmenata koda i jednog ili više segmenata podataka programu: mali, mali, srednji, kompaktni, veliki i ogromni. Postojale su određene konvencije za instrukcije asemblerskog jezika: skakačke adrese segmentirane su CS registrom, pristupi podacima segmentirani su DS registrom, a pozivi steka segmentirani su SS registrom. Ako je programu dodijeljeno nekoliko segmenata za kod ili podatke, tada su se morale promijeniti vrijednosti u registrima CS i DS da bi se pristupilo drugom segmentu. Postojali su takozvani "bliski" i "daleki" prijelazi. Ako je naredba na koju se trebao napraviti skok bila u istom segmentu, tada je za skok bilo dovoljno promijeniti samo vrijednost IP registra. Takav se prijelaz nazivao "bliskim". Ako je naredba na koju se trebao napraviti skok bila u drugom segmentu, tada je za skok bilo potrebno promijeniti i vrijednost CS registra i vrijednost IP registra. Taj se prijelaz zvao daljinski i trajao je duže.

32-bitni registri omogućuju adresiranje 4 GB memorije, što je već dovoljno za bilo koji program. Windows pokreće svaki Win32 program u zasebnom virtualnom prostoru. To znači da će svaki Win32 program imati 4 GB adresnog prostora, ali to ne znači da svaki program ima 4 GB fizičke memorije, već samo da program može pristupiti bilo kojoj adresi unutar tog raspona. A Windows će učiniti sve što je potrebno da memorija kojoj program pristupa "postoji". Naravno, program se mora pridržavati utvrđenih pravila

Windows, inače dolazi do pogreške General Protection Fault.

Pod Win32 arhitekturom nije bilo potrebe za odvajanjem adrese na baznu i offsetnu, kao ni za memorijskim modelima. U 32-

koriste se drugačije1. Prije je bilo potrebno pojedine dijelove programa povezati s jednim ili drugim segmentnim registrom i spremiti/vratiti DS registar pri prelasku u drugi segment podataka ili eksplicitno segmentirati podatke u drugom registru. S 32-bitnom arhitekturom to više nije potrebno, a u najjednostavnijem slučaju možete zaboraviti na segmentne registre.

1.5. Korištenje stog

Svaki program ima područje memorije koje se naziva stog. Stog se koristi za prosljeđivanje parametara procedurama i pohranjivanje lokalnih podataka za procedure. Kao što znate, stog je područje memorije, pri radu s kojim se moraju poštivati ​​određena pravila, naime: podaci koji su prvi dospjeli u stog odatle se zadnji dohvaćaju. S druge strane, ako se programu dodijeli nešto memorije, tada nema fizičkih ograničenja za čitanje i pisanje. Kako se ta dva sukobljena principa uklapaju zajedno?

Pretpostavimo da imamo funkciju f1 koja poziva funkciju f2, a funkcija f2 zauzvrat poziva funkciju f3. Kada se pozove funkcija f1, dodjeljuje joj se određeno mjesto na stogu za lokalne podatke. Ovaj prostor se dodjeljuje oduzimanjem od ESP registra vrijednosti jednake veličini potrebne memorije. Minimalna veličina dodijeljene memorije je 4 bajta, tj. čak i ako procedura treba 1 bajt, trebala bi trajati 4 bajta.

Funkcija f1 izvodi neke radnje, a zatim poziva

funkcija f2 poziva funkciju f3, koja također dodjeljuje prostor na stogu. Funkcija f3 ne poziva nikakve druge funkcije i po završetku svog rada mora osloboditi prostor na stogu dodavanjem u ESP registar vrijednost koja je oduzeta kada je funkcija pozvana. Ako funkcija f3 ne vrati vrijednost ESP registra, tada funkcija f2, nastavljajući s radom, neće pristupiti svojim podacima, jer Ona traži

što je bilo prije nego što je pozvana.

Dakle, na razini postupaka potrebno je pridržavati se pravila za rad sa stekom – postupak koji je zadnji zauzeo mjesto na stogu mora ga prvo osloboditi. Ako se ovo pravilo ne poštuje, program neće raditi ispravno. Ali svaka procedura može pristupiti vlastitom području stog na proizvoljan način. Kada bismo bili prisiljeni slijediti pravila za rad sa stogom unutar svake procedure, morali bismo prenijeti podatke iz stoga u drugo memorijsko područje, a to bi bilo krajnje nezgodno i iznimno bi usporilo izvođenje programa.

Svaki program ima podatkovno područje u kojem se nalaze globalne varijable. Zašto se lokalni podaci pohranjuju na stog? To je učinjeno kako bi se smanjila količina memorije koju zauzima program. Ako je program dosljedno pozvati nekoliko procedura, tada će u svakom trenutku vremena prostor biti dodijeljen samo za podatke jedne procedure, budući da stog je zauzet i pušten. Područje podataka postoji cijelo vrijeme dok se program izvodi. Kada bi se lokalni podaci nalazili u podatkovnom području, bilo bi potrebno dodijeliti prostor za lokalne podatke za sve programske postupke.

Lokalni podaci se ne inicijaliziraju automatski. Ako u gornjem primjeru funkcija f2 nakon funkcije f3 pozove funkciju f4, tada će funkcija f4 zauzeti mjesto na stogu koje je prethodno zauzimala funkcija f3, tako da će funkcija f4 naslijediti funkciju f3. Stoga svaki postupak mora voditi brigu o inicijalizaciji svojih lokalnih podataka.

2. Osnovni pojmovi asemblerskog jezika

2.1. Identifikatori

Koncept identifikatora u asemblerskom jeziku ne razlikuje se od koncepta identifikatora u drugim jezicima. Možete koristiti latinična slova, brojeve i znakove _. ? @ $, gdje točka može biti samo prvi znak identifikatora. Velika i mala slova smatraju se ekvivalentima.

2.2. Cijeli brojevi

V U programima asemblerskog jezika, cijeli brojevi se mogu napisati u binarnim, oktalnim, decimalnim i heksadecimalnim sustavima. Za postavljanje brojevnog sustava na kraju broja

Nakon mnogo godina što sam radila nešto, a da to nisam pogodila, odlučila sam se vratiti osnovama. Za programiranje. Opet, s obzirom na mnoštvo "modernih napretka" na ovom području, bilo je teško odrediti što zapravo nedostaje, što poduzeti da ono bude i ugodno i korisno. Isprobavši po malo puno toga, odlučio sam se vratiti na mjesto gdje sam bio vučen od prvih dana poznanstva s računalom (čak i s kopijom kreacije Sir Sinclair-a) - programiranju na asembleru. Dapače, svojedobno sam prilično dobro poznavao Assembler (u ovom slučaju govorim o x86), ali gotovo 15 godina nisam ništa napisao u njemu. Dakle, riječ je o svojevrsnom povratku “razmetnog sina”.
Ali ovdje je čekalo prvo razočaranje. Knjige, priručnici i druge referentne knjige o asembleru pronađene na internetu, na moju duboku žalost, sadrže minimum informacija o tome kako programirati u asembleru, zašto je to tako i što daje.

Primjer iz drugog kraja

Ako uzmemo boks kao primjer, onda svi takvi priručnici uče kako se izvodi udarac, kretati se stojeći na podu, ali ono što boks radi je apsolutno odsutno - boks, a ne "legalno udaranje". Odnosno, kombinirani rad, osobitosti korištenja prstena, obrambene akcije, taktička struktura bitke i, štoviše, strategija bitke uopće se ne razmatraju. Naučili su čovjeka da pogodi "krušku" i odmah u ring. Ovo je u osnovi pogrešno. Ali tako su strukturirani gotovo svi "udžbenici" i "priručnici" o programiranju u asembleru.


Međutim, normalne knjige trebale bi biti, najvjerojatnije ispod planine "šljake" jednostavno ih nisam našao. Stoga, prije nego što nadopunimo znanje globalnim opisom arhitekture, mnemotehnikom i svim vrstama trikova "kako zaslijepiti figu iz dva prsta", pristupimo pitanju programiranja u montaži s "ideološke" točke gledišta.

Idila?

Mala napomena, dalje u tekstu koristit će se klasifikacija koja se razlikuje od trenutno raširene. No, to nije razlog za "sporove o boji istine", samo je u ovom obliku lakše objasniti autorsko stajalište o programiranju.

Dakle, danas je, čini se, došlo doba sreće za programere. Ogroman izbor sredstava za sve prilike i želje. Postoje milijuni "okvira" / "uzoraka" / "predložaka" / "knjižnica" i tisuće alata za "olakšavanje" programiranja, stotine jezika i dijalekata, deseci metodologija i različitih pristupa programiranju. Uzmi - ne želim. Ali nije "uzeto". I nije poanta u vjerskim uvjerenjima, nego u tome da sve to izgleda kao pokušaj da se pojede nešto neukusno. Uz želju i marljivost, tome se, naravno, možete prilagoditi. No, vraćajući se programiranju, u većini predloženog, tehnička ljepota nije vidljiva – vidljivo je samo puno "štaka". Kao rezultat toga, kada se koriste ova “dostignuća”, umjesto fascinantnih krajolika, umjesto fascinantnih krajolika, ispod “kista umjetnika” izbija čvrsta “apstrakcija” ili popularni printovi - ako imate sreće. Je li većina programera takvi mediokriteti, neznalice i imaju problema na razini genetike? Ne, ne mislim tako. Pa koji je razlog?
Danas postoji mnogo ideja i načina programiranja. Razmotrimo najviše "modnih" od njih.

  • Imperativno programiranje – u ovom pristupu programer postavlja slijed radnji koje vode do rješenja problema. Temelji se na podjeli programa na dijelove koji izvode logički neovisne operacije (moduli, funkcije, procedure). No, za razliku od tipiziranog pristupa (vidi dolje), ovdje postoji važna značajka - odsutnost varijabli "tipkanja". Drugim riječima, koncept "vrste varijable" je odsutan; umjesto toga, koristi se razumijevanje da vrijednosti iste varijable mogu imati drugačiji tip. Živopisni predstavnici ovog pristupa su Basic, REXX, MUMPS.
  • Tipizirano programiranje je modifikacija imperativnog programiranja, kada programer i sustav ograničavaju moguće vrijednosti varijabli. Najpoznatiji jezici su Pascal, C.
  • Funkcionalno programiranje je više matematički način rješavanja problema, kada se rješenje sastoji u "konstruiranju" hijerarhije funkcija (i, sukladno tome, kreiranju onih koje nedostaju), što dovodi do rješenja problema. Kao primjeri: Lisp, Forth.
  • Automatsko programiranje je pristup u kojem programer gradi model/mrežu koji se sastoji od objekata/izvršnih elemenata koji razmjenjuju poruke, koji mijenjaju/pohranjuju svoje unutarnje "stanje" i sposobni su za interakciju s vanjskim svijetom. Drugim riječima, to je ono što se obično naziva "objektno programiranje" (ne objektno orijentirano). Ova metoda programiranja uvedena je u Smalltalk.
Ali što je s mnogim drugim jezicima? U pravilu su to već "mutanti". Na primjer, mješavina tipiziranog i automatskog pristupa dovela je do "programiranja usmjerenog na objekt".

Kao što vidite, svaki od pristupa (čak i bez uzimanja u obzir ograničenja specifičnih implementacija) nameće svoja ograničenja samoj tehnici programiranja. Ali drugačije ne može biti. Nažalost, ta su ograničenja često umjetno stvorena kako bi "ideja ostala čista". Kao rezultat toga, programer mora "pervertirati" prvotno pronađeno rješenje u oblik koji nekako odgovara ideologiji korištenog jezika ili korištenog "predloška". To je čak i bez uzimanja u obzir novonastalih tehnika i metoda dizajna i razvoja.

Čini se da dok programiramo u asembleru, slobodni smo raditi sve kako želimo i kako nam hardver dopušta. Ali čim poželimo koristiti "generički drajver" za bilo koju vrstu opreme, prisiljeni smo promijeniti slobodu "kreativnosti" za propisane (standardizirane) pristupe i načine korištenja drajvera. Čim nam je bila potrebna prilika da iskoristimo razvoj drugih kolega ili im damo priliku da učine isto s plodovima našeg rada, primorani smo promijeniti slobodu izbora interakcije između dijelova programa za neke dogovorene / standardizirane načine.

Dakle, "sloboda" zbog koje ljudi često hrle u montažer često se pokaže kao "mit". I tome (razumijevanju ograničenja i načina njihovog organiziranja), po mom mišljenju, treba posvetiti veću pozornost. Programer mora razumjeti razlog za uvedena ograničenja i, što asemblera razlikuje od mnogih jezika visoke razine, biti u mogućnosti promijeniti ih ako se ukaže potreba. Međutim, sada je programer asemblera prisiljen podnijeti ograničenja koja nameću jezici visoke razine, jer u njima nema "mrkve" koja je dostupna programerima. S jedne strane, operativni sustavi pružaju mnoge već implementirane funkcije, postoje gotove biblioteke i još mnogo toga. Ali načini njihove upotrebe, takoreći, implementirani su bez uzimanja u obzir njihovog pozivanja iz programa napisanih na asembleru, ili čak općenito suprotno logici programiranja za arhitekturu x86. Kao rezultat toga, danas je programiranje u asembleru s pozivima na funkcije OS-a ili vanjske biblioteke jezika visoke razine "strah" i "horor".

Što dalje u šumu, to je gušće

Dakle, shvatili smo da iako je asembler vrlo jednostavan, morate ga znati koristiti. A glavna dosljednost je potreba za interakcijom s okruženjem u kojem se pokreće naš program. Ako programeri na jezicima visoke razine već imaju pristup potrebnim bibliotekama, funkcijama, potprogramima u mnogim prilikama i imaju pristup načinima interakcije s vanjskim svijetom, u obliku koji je u skladu s idejom jezika, tada asemblerski programer mora gaziti kroz gustiš svih vrsta prepreka postavljenih na praznom prostoru. Kada pogledate što jezici visoke razine generiraju tijekom kompilacije, stječete dojam da oni koji su pisali kompilatore ili nemaju pojma kako funkcionira procesor s x86 arhitekturom, "ili jedan od dva" (q).

Pa krenimo redom. Programiranje je prije svega inženjersko, odnosno znanstveno stvaralaštvo usmjereno na učinkovito (u smislu pouzdanosti, korištenja raspoloživih resursa, vremena implementacije i jednostavnosti korištenja) rješavanja praktičnih problema. A u srcu svakog inženjerstva je sistemski pristup. Odnosno, bilo koje rješenje se ne može smatrati nekom vrstom "nerazdvojive" crne kutije koja funkcionira u potpunom i idealnom vakuumu.

Još jedan primjer iz drugog područja

Proizvodnja kamiona u Sjedinjenim Državama može se navesti kao živopisan primjer sustavnog pristupa. U ovom slučaju, proizvođač kamiona je jednostavno proizvođač okvira i kabine + montažer konstruktora. Sve ostalo (motor, mjenjač, ​​ovjes, električna oprema itd.) preuzimamo prema želji kupca. Jedan kupac je htio sebi nabaviti Kenworth s motorom od Detroit Diesel, Fuller ručnim mjenjačem, lisnatim ovjesom od neke Dana - molim. Prijatelju ovog kupca trebao je isti model Kenworth, ali s izvornim Paccar motorom, Allison automatskim mjenjačem i zračnim ovjesom drugog proizvođača - jednostavno! A to rade svi proizvođači kamiona u SAD-u. Odnosno, kamion je sustav u kojem se svaki modul može zamijeniti drugim iste namjene i besprijekorno spojiti s postojećim. Štoviše, način povezivanja modula izrađen je s maksimalnom dostupnom svestranošću i praktičnošću daljnjeg proširenja funkcionalnosti. To je ono čemu bi inženjer trebao težiti.

Nažalost, morat ćemo živjeti s onim što imamo, ali u budućnosti to treba izbjegavati. Dakle, program je, zapravo, skup modula (nije bitno kako se zovu i kako se "ponašaju"), sastavljanjem kojih postižemo rješenje zadatka. Zbog učinkovitosti, vrlo je poželjno da se ovi moduli mogu ponovno koristiti. I ne samo da ga koristite pod svaku cijenu, već ga koristite na prikladan način. I tu nas čeka još jedno neugodno “iznenađenje”. Većina jezika visoke razine djeluje na takvim strukturnim jedinicama kao što su "funkcija" i "procedura". I, kao način rješavanja njih, koristi se "prenošenje parametara". To je sasvim logično i tu se ne postavljaju pitanja. Ali kao i uvijek, "nije važno što se radi - važno je kako se radi" (c). I tu počinje ono najneshvatljivije. Danas postoje 3 uobičajena načina organiziranja prijenosa parametara: cdecl, stdcall, brzi poziv... Dakle, nijedna od ovih metoda nije "nativna" za x86. Štoviše, svi su manjkavi s gledišta proširenja funkcionalnosti pozvanih potprograma. Odnosno, povećanjem broja proslijeđenih parametara, prisiljeni smo promijeniti sve pozivne točke ove funkcije / potprograma, ili proizvesti novi potprogram sa sličnom funkcionalnošću, koji će biti pozvan na malo drugačiji način.

Gore navedene metode prosljeđivanja parametara rade relativno dobro na procesorima s 2 odvojena stoga (podatkovni stog i adresni/kontrolni stog) i naprednim uputama za manipulaciju stogom (barem indeksni pristup elementima stoga). Ali kada programirate na x86, prvo morate biti izopačeni prilikom prosljeđivanja/primanja parametara, a zatim ih se ne zaboravite "strukturno" ukloniti iz steka. Usput pokušavam pogoditi / izračunati maksimalnu dubinu hrpe. Podsjetimo da je x86 (16/32 bitni način rada) procesor koji ima:

  • specijalizirani registri (RON-ovi su registri opće namjene - kao takvi su odsutni: to jest, ne možemo pomnožiti sadržaj GS registra s vrijednošću iz EDI jednom naredbom i dobiti rezultat u paru EDX: ECX, ili podijeliti vrijednost iz EDI: ESI registarski par u registar sadržaja EAX);
  • malo registara;
  • jedan stog;
  • memorijska lokacija ne daje nikakve informacije o vrsti vrijednosti koja je tamo pohranjena.
Drugim riječima, tehnike programiranja koje se koriste za procesore s velikom datotekom registra, podršku za više neovisnih stogova itd. uglavnom nije primjenjivo na x86 programiranje.

Sljedeća značajka interakcije s gotovim modulima napisanim na "jezicima visoke razine" je "borba" s "vrstama varijabli". S jedne strane, razlog za pojavu tipova varijabli je jasan - programer zna koje vrijednosti se koriste unutar njegovog potprograma / modula. Na temelju toga, čini se sasvim logičnim da postavljanjem tipa vrijednosti varijable možemo "pojednostaviti" pisanje programa postavljanjem kontrole tipova / granica vrijednosti na jezični prevoditelj. Ali i tada je beba izbačena s vodom. Jer bilo koji program nije napisan za generiranje sfernih konja u vakuumu, već za praktičan rad s korisničkim podacima. To jest, očito kršenje sistemskog pristupa - kao da su programeri jezika visoke razine razmatrali svoje sustave bez uzimanja u obzir interakcije s vanjskim svijetom. Kao rezultat toga, kada programira na jeziku koji se tipka, programer mora predvidjeti sve moguće vrste "netočnih" ulaznih podataka i tražiti načine kako zaobići nejasnoće. I tu na scenu stupaju monstruozni sustavi za podršku regularnih izraza, rukovanje iznimkama, potpisi metoda/procedura za različite vrste vrijednosti i druge generacije štaka.

Kao što je gore spomenuto, za arhitekturu x86, sama vrijednost pohranjena na memorijskoj lokaciji nema nikakav tip. Programer asemblerskog jezika je privilegiran i odgovornost za određivanje načina rukovanja upravo tom vrijednošću. A kako odrediti vrstu vrijednosti i kako je obraditi - postoji mnogo opcija za odabir. No, da još jednom naglasimo, svi se tiču ​​samo vrijednosti primljenih od korisnika. Kao što su programeri tipiziranih jezika ispravno primijetili, vrste vrijednosti internih i servisnih varijabli gotovo su uvijek unaprijed poznate.

Čini se da je ovaj razlog (izopačeno prosljeđivanje parametara modulima napisanim na jezicima visoke razine i potreba za striktnim praćenjem tipova parametara proslijeđenih istim modulima) glavni, zbog čega je programiranje u asembleru nerazumno teško . A većina radije razumije džunglu "jezika visoke razine" kako bi iskoristila ono što su drugi već razvili, nego da pati, ubacujem iste "standardne" štake da ispravim ono što nisu napravili. A rijetki asemblerski prevoditelj nekako "istovaruje" programera iz ove rutine.

Što uraditi?

Preliminarni zaključci, uzimajući u obzir 15-let pauza u programiranju asemblera.
Prvo, o modulima ili dijelovima programa. U općem slučaju, vrijedno je istaknuti dvije vrste izvršnih jedinica programa u asemblerskom jeziku - "operacija" i "potprogram".
  • "Operacija" je modul koji izvodi "atomsku" akciju i ne zahtijeva mnogo parametara za svoje izvođenje (na primjer, operacija brisanja cijelog zaslona ili operacija izračunavanja medijana niza brojeva, itd.) .
  • "Podrutina" je funkcionalni modul koji zahtijeva puno ulaznih parametara (više od 2x-3x) za ispravno funkcioniranje.
I ovdje vrijedi procijeniti iskustvo imperativnih i funkcionalnih jezika. Dali su nam 2 vrijedna alata koja vrijedi koristiti: "strukturu podataka" (ili, na primjer, REXX - složene / proširene varijable) i "promjenjivost podataka".

Također je korisno slijediti pravilo nepromjenjivosti – odnosno nepromjenjivosti proslijeđenih parametara. Potprogram ne može (ne bi trebao) mijenjati vrijednosti u strukturi koja mu je proslijeđena i rezultat se vraća ili u registrima (ne više od 2x-3x parametara), ili također u novoj, kreiranoj strukturi. Time smo oslobođeni potrebe za kopiranjem struktura, u slučaju "zaboravljene" promjene podataka od strane potprograma, te možemo koristiti već kreiranu strukturu u cijelosti ili njezin glavni dio za pozivanje nekoliko potprograma koji rade s istim / sličan skup parametara. Štoviše, praktički "automatski" dolazimo do sljedećeg "funkcionalnog" pravila - unutarnje kontekstne neovisnosti potprograma i operacija. Drugim riječima, na odvajanje stanja/podataka od metode/podrutine njihove obrade (za razliku od modela automata). U slučajevima paralelnog programiranja, kao i zajedničkog korištenja jednog potprograma, oslobađamo se i potrebe za stvaranjem više konteksta izvršavanja i praćenjem njihovog "nepresijecanja", kao i stvaranja mnogih instanci jednog potprograma s različitim "stanjima". “, u slučaju višestrukih poziva.

Što se tiče "vrsta" podataka, onda možete ostaviti "sve kako jest", ili također ne možete izmisliti kotač i iskoristiti ono što programeri prevoditelja imperativnih jezika već dugo koriste - "identifikator vrste vrijednosti". Odnosno, analiziraju se svi podaci koji dolaze iz vanjskog svijeta i svakoj primljenoj vrijednosti dodjeljuje se identifikator obrađenog tipa (cijeli broj, plutajući zarez, pakirani BCD, kod znakova itd.) i veličina polja/vrijednosti. Posjedujući ove informacije, programer, s jedne strane, ne tjera korisnika u nepotrebno uzak okvir "pravila" za unos vrijednosti, a s druge strane ima mogućnost odabira najučinkovitijeg načina obrade korisničkih podataka. u procesu. Ali, ponovit ću još jednom, to se odnosi samo na rad s korisničkim podacima.

To su bila opća razmatranja za programiranje u asemblerskom jeziku, koja nisu povezana s dizajnom, otklanjanjem pogrešaka i rukovanjem pogreškama. Nadam se da će programeri OS-a koji ih pišu od nule (a još više na asembleru) imati o čemu razmišljati i da će odabrati (čak i ako nisu gore opisani, ali bilo koji drugi) način da programiranje u asembleru učine sustavnijim, praktičnijim i ugodan, i neće slijepo kopirati tuđe, često beznadno "krive" opcije.

Assembler (Assembly) je programski jezik čiji koncepti odražavaju arhitekturu elektroničkog računala. Jezik asemblera je simbolički oblik pisanja strojnog koda, čija upotreba pojednostavljuje pisanje strojnih programa. Za isto računalo mogu se razviti različiti asemblerski jezici. Za razliku od jezika visoke razine apstrakcije, u kojima su mnogi problemi implementacije algoritama skriveni od programera, asemblerski jezik usko je povezan sa skupom instrukcija mikroprocesora. Za idealan mikroprocesor čiji skup instrukcija točno odgovara programskom jeziku, asembler generira jedan strojni kod za svaki izraz u jeziku. U praksi, pravi mikroprocesori mogu zahtijevati više strojnih instrukcija za implementaciju jedne izjave u jeziku.

Jezik asemblera omogućuje pristup registrima, specificirajući metode adresiranja i opisujući operacije u smislu uputa procesora. Jezik asemblera može sadržavati sredstva više razine apstrakcije: ugrađene i definirane makronaredbe koje odgovaraju nekoliko strojnih instrukcija, automatski odabir naredbi ovisno o vrsti operanda, sredstva za opisivanje struktura podataka. Glavna prednost asemblerskog jezika je "blizina" procesoru koji je osnova računala koje koristi programer, a glavni nedostatak je premala podjela tipičnih operacija, što većina korisnika teško percipira. Međutim, asemblerski jezik mnogo je više odraz samog funkcioniranja računala nego bilo koji drugi jezik.

I iako su upravljački programi i operativni sustavi sada napisani u C-u, C je, sa svim svojim prednostima, jezik apstrakcije visoke razine koji skriva od programera razne suptilnosti i nijanse hardvera, a asembler je jezik apstrakcije niske razine koji izravno odražava sve te suptilnosti i nijanse.

Za uspješno korištenje asemblera potrebne su tri stvari:

  • poznavanje sintakse asemblerskog prevoditelja koji se koristi (na primjer, sintaksa MASM, FASM i GAS je različita), namjene direktiva asemblerskog jezika (operatori koje prevoditelj obrađuje tijekom prijevoda izvornog koda programa) ;
  • razumijevanje strojnih instrukcija koje izvršava procesor dok program radi;
  • sposobnost rada s uslugama koje pruža operativni sustav - u ovom slučaju to znači poznavanje Win32 API funkcija. Kada radi s jezicima visoke razine, programer se vrlo često ne poziva izravno na API sustava; on možda nije ni svjestan njegovog postojanja, budući da knjižnica jezika skriva pojedinosti specifične za sustav od programera. Na primjer, na Linuxu, Windowsu i na bilo kojem drugom sustavu u C / C ++ programu, možete izvesti niz na konzolu pomoću funkcije printf () ili cout streama, odnosno nema razlike za programer koji koristi ove alate, pod kojim sustavom je program napravljen, iako će implementacija ovih funkcija biti različita u različitim sustavima, jer je API sustava vrlo različit. Ali ako osoba piše na asembleru, više nema gotove funkcije poput printf (), u kojima je smislio kako "komunicirati" sa sustavom umjesto njega, i to mora učiniti sam.
Kao rezultat toga, ispada da pisanje čak i jednostavnog programa na asembleru zahtijeva vrlo veliku količinu predznanja - "ulazni prag" je ovdje puno veći nego za jezike visoke razine.

Optimalno možete smisliti program koji radi ispravno, što je brže moguće i koji zauzima što manje memorije. Štoviše, lako je čitati i razumjeti; lako se mijenja; njegovo stvaranje zahtijeva malo vremena i niske troškove. U idealnom slučaju, asemblerski jezik trebao bi imati skup karakteristika koje bi vam omogućile da dobijete programe koji zadovoljavaju što je više moguće od ovih kvaliteta.

Programi ili njihovi fragmenti napisani su u asembleru u slučajevima kada su kritično važni:

  • količina korištene memorije (programi za učitavanje, ugrađeni softver, programi za mikrokontrolere i procesore s ograničenim resursima, virusi, softverske zaštite itd.);
  • brzina (programi napisani na asembleru rade mnogo brže od analognih programa napisanih u programskim jezicima visoke razine apstrakcije. kao rezultat, program počinje raditi brže, ali gubi prenosivost i svestranost).
Osim toga, znanje asemblerskog jezika olakšava razumijevanje arhitekture računala i rada njegovog hardvera, nešto što znanje ne može dati jezici apstrakcije visoke razine(JAVU). Trenutno većina programera razvija programe u okruženja brzog dizajna(Rapid Application Development) kada se svi potrebni elementi dizajna i upravljanja kreiraju pomoću gotovih vizualnih komponenti. To uvelike pojednostavljuje proces programiranja. No, često se moramo suočiti s takvim situacijama kada je najmoćnije i najučinkovitije funkcioniranje pojedinih softverskih modula moguće samo ako su napisani u asemblerskom jeziku (assemblerski umetci). Konkretno, u bilo kojem programu koji se odnosi na izvođenje ponavljajućih cikličkih postupaka, bilo da se radi o ciklusima matematičkih izračuna ili izlazu grafičkih slika, preporučljivo je grupirati najdugotrajnije operacije u podmodule programirane u asemblerskom jeziku. Svi paketi modernih programskih jezika visoke razine apstrakcije to omogućuju, a rezultat je uvijek značajno povećanje performansi programa.

Programski jezici visoke razine apstrakcije razvijeni su kako bi se način pisanja programa približio uobičajenim za korisnike računala određenih oblika zapisa, posebice matematičkih izraza, kao i da se ne uzmu u obzir specifične tehničke značajke pojedinih računala u programima. Asemblerski jezik razvijen je uzimajući u obzir specifičnosti procesora, stoga, da biste ispravno napisali program u asemblerskom jeziku, općenito morate poznavati arhitekturu procesora korištenog računala. No, imajući u vidu pretežnu distribuciju osobnih računala kompatibilnih s osobnim računalima i gotovih programskih paketa za njih, ne treba razmišljati o tome, jer takve brige preuzimaju tvrtke-programeri specijaliziranog i univerzalnog softvera.

2. O prevoditeljima

Koji je asembler bolji?

Za x86-x64 procesor postoji preko desetak različitih asemblerskih kompajlera. Razlikuju se po različitim skupovima značajki i sintaksi. Neki su prevoditelji prikladniji za početnike, drugi za napredne programere. Neki prevoditelji su prilično dobro dokumentirani, drugi uopće nemaju dokumentaciju. Za neke prevoditelje razvijeno je mnogo primjera programiranja. Postoje tutorijali i knjige napisane za neke asemblere koji detaljno ulaze u sintaksu, drugi nemaju ništa. Koji je asembler bolji?

S obzirom na brojne dijalekte asemblera za x86-x64 i ograničenu količinu vremena za njihovo proučavanje, ograničit ćemo se na kratak pregled sljedećih kompilatora: MASM, TASM, NASM, FASM, GoASM, Gas, RosAsm, HLA.

Koji operativni sustav želite koristiti?

Ovo je prvo pitanje na koje biste trebali odgovoriti. Najbogatiji asembler neće vam donijeti ništa dobro ako nije dizajniran za rad s operativnim sustavom koji namjeravate koristiti.
Windows DOS Linux BSD QNX MacOS radi na
Intel / AMD procesor
FASM x x x x
PLIN x x x x x x
GoAsm x
HLA x x
MASM x x
NASM x x x x x x
RosAsm x
TASM x x

16-bitna podrška

Ako asembler podržava DOS, onda podržava i 16-bitne upute. Svi asembleri pružaju mogućnost pisanja koda koji koristi 16-bitne operande. 16-bitna podrška znači da možete stvoriti kod koji radi na 16-bitnom modelu razdijeljene memorije (nasuprot 32-bitnom modelu ravne memorije koji koristi većina modernih operativnih sustava).

64-bitna podrška

S izuzetkom TASM-a, za koji je Borland izgubio interes sredinom 2000-ih, a koji ne podržava u potpunosti čak ni 32-bitne programe, svi ostali dijalekti podržavaju razvoj 64-bitnih aplikacija.

Prenosivost programa

Očito, nećete pisati x86-x64 asemblerski kod koji radi na nekom drugom procesoru. Međutim, čak i na jednom procesoru možete naići na probleme s prijenosom. Na primjer, ako namjeravate sastaviti i koristiti svoje programe na asembleru pod različitim operativnim sustavima. NASM i FASM se mogu koristiti na operativnim sustavima koje podržavaju.

Namjeravate li napisati aplikaciju na asembleru, a zatim prenijeti tu aplikaciju s jednog OS-a na drugi s "rekompiliranim" izvornog koda? Ovu značajku podržava HLA dijalekt. Očekujete li da ćete moći kreirati Windows i Linux aplikacije u asembleru uz minimalan napor za to? Iako, ako radite s jednim operativnim sustavom i apsolutno ne planirate raditi u bilo kojem drugom OS-u, onda vas se ovaj problem ne tiče.

Podrška za jezične konstrukcije visoke razine

Neki asembleri pružaju proširenu sintaksu koja pruža specifične kontrolne strukture visoke razine (kao što su IF, WHILE, FOR i tako dalje). Takve konstrukcije mogu olakšati učenje asemblera i pomoći vam da napišete čitljiviji kod. Neki asembleri imaju ugrađene "konstrukte visoke razine" s ograničenim mogućnostima. Drugi pružaju konstrukcije visoke razine na makro razini.

Niti jedan asembler vas ne prisiljava da koristite bilo kakve kontrolne strukture visoke razine ili tipove podataka ako više volite raditi na razini kodiranja strojnih instrukcija. Konstrukcije visoke razine produžetak su temeljnog strojnog jezika koji možete koristiti ako vam odgovara.

Kvaliteta dokumentacije

Upotrebljivost asemblera izravno je povezana s kvalitetom njegove dokumentacije. S obzirom na količinu posla koji je utrošen na stvaranje asemblerskog dijalekta, autori prevoditelja gotovo se ne trude kreiranjem dokumentacije za ovaj dijalekt. Autori, proširujući svoj jezik, zaboravljaju dokumentirati ta proširenja.

Sljedeća tablica opisuje kvalitetu referentnog priručnika za montažer koji dolazi s proizvodom:

Dokumentacija Komentari (1)
FASM Dobro Autor najviše svog slobodnog vremena posvećuje razvoju inovativnog FASMG-a. Ipak, autor s vremena na vrijeme pruža podršku za FASM, ažurira priručnike i opisuje nove funkcije na vlastitom forumu. Dokumentacija je dosta dobra. Web stranica za dokumentaciju.
Plin
Loše
je slabo dokumentirana i dokumentacija je prilično "općenita". gas je asembler koji je dizajniran da olakša pisanje koda za različite procesore. Dokumentacija koja postoji uglavnom opisuje pseudo kodove i upute za sklapanje. U načinu rada "intel_syntax" praktički nema dokumentacije. Knjige koje koriste AT&T sintaksu: Programiranje od nule Jonathona Bartletta i Professional Assembly Language Richarda Bluma, Konstantina Boldysheva.
GoAsm
Slab
Većina sintakse pokrivena je u priručniku, a iskusni korisnik će pronaći ono što traži. Puno tutorijala i objavljenih na stranici (http://www.godevtool.com/). Nekoliko GoAsm tutorijala:
  • Priručnik Patricka Ruiza
HLA
Bičevanje
HLA ima referentni priručnik od 500 stranica. Stranica sadrži desetke HLA članaka i dokumentacije.
MASM
Dobro
Microsoft je napisao značajnu količinu dokumentacije za MASM, postoji veliki broj priručnika napisanih za ovaj dijalekt.
NASM
Dobro
NASM autori pišu više softvera za ovaj dijalekt, ostavljajući ručno pisanje za kasnije. NASM postoji dugo, pa je nekoliko autora napisalo priručnik za NASM Jeffa Duntemanna "Jezik asemblera korak-po-korak: programiranje s Linuxom", Jonathana Letoa "Pisanje korisnog programa s NASM-om", na ruskom postoji knjiga autora Stolyarov (web stranica A.V. Stolyarova).
RosAsm
Slab
ne baš zanimljivi "online tutoriali".
TASM
Dobro
Borland je svojedobno proizveo izvrsne referentne vodiče, a referentne vodiče za TASM su napisali entuzijastični autori koji nisu povezani s Borlandom. Ali Borland više ne podržava TASM, tako da je velik dio dokumentacije za TASM više ne tiskan i sve je teže pronaći.

Udžbenici i nastavni materijali

Dokumentacija asemblerskog jezika je naravno vrlo važna. Od još većeg interesa za početnike i druge koji uče asemblerski jezik (ili napredne značajke određenog asemblerskog jezika) dostupnost je dokumentacije izvan referentnog priručnika za jezik. Većina ljudi želi vodič koji objašnjava kako programirati u asembleru koji ne daje samo sintaksu strojnih instrukcija i očekuju da će čitatelju biti rečeno kako kombinirati te upute za rješavanje problema u stvarnom svijetu.

MASM je vodeći među ogromnom količinom knjiga koje opisuju kako programirati na ovom dijalektu. Postoje deseci knjiga koje koriste MASM kao asembler za podučavanje asemblera.

Većina MASM / TASM asemblerskih udžbenika i dalje podučava MS-DOS programiranje. Iako se postupno pojavljuju tutorijali koji podučavaju programiranje u Windowsima i Linuxu.

Komentari (1)
FASM Nekoliko tutorijala koji opisuju FASM programiranje:
  • S.A. Norseev "Razvoj prozorskih aplikacija na FASM-u"
  • Ruslan Ablyazov "Programiranje u asembleru na platformi x86-64"
Plin
Vodič za korištenje AT&T sintakse
Vodič za asembler za Linux za programere C
HLA
32-bitna verzija "The Art of Assembly Language Programming" (postoji u elektroničkom i tiskanom obliku), programiranje za Windows ili Linux
MASM
veliki broj knjiga o podučavanju DOS programiranja. Nema mnogo knjiga o Win32/64 programiranju Pirogov, Yurov, Zubkov, Flinov
NASM
mnoge knjige posvećene programiranju u DOS-u, Linuxu, Windowsu. Knjiga Jeffa Duntemana Assembly Language Step-by-Step: Programiranje s Linuxom koristi NASM za Linux i DOS. Uputa Paula Cartera koristi NASM (DOS, Linux).
TASM
Kao i za MASM, za TASM je napisan veliki broj knjiga temeljenih na DOS-u. No budući da Borland više ne podržava ovaj proizvod, prestali su pisati knjige o korištenju TASM-a. Tom Swann napisao je vodič o TASM-u s nekoliko poglavlja o Windows programiranju.

3. Literatura i web resursi

Početnici

  1. Abel P. Jezik asemblera za IBM PC i programiranje. - M .: Viša škola, 1992 .-- 447 str.
  2. Bradley D. Programiranje u asembleru za osobna računala iz IBM-a - M.: Radio i komunikacija, 1988. - 448 str.
  3. Galiseev G.V. Asembler IBM PC-a. Knjiga za samoučenje .: - M .: Izdavačka kuća "Williams", 2004. - 304 str.: ilustr.
  4. Dao L. Programiranje mikroprocesora 8088 .-- M .: Mir, 1988 .-- 357 str.
  5. Žukov A.V., Avdjuhin A.A. Asembler. - SPb .: BHV-Petersburg, 2003.-- 448 str.: ilustr.
  6. Zubkov S.V., asembler za DOS, Windows i UNIX. - M .: DMK Press, 2000 .-- 608 str .: ilustr. (Serija "Za programere").
  7. Irwin K. Asemblerski jezik za Intelove procesore, 4. izdanje .: trans. s engleskog - M .: Izdavačka kuća "Williams", 2005. - 912 str.: ilustr. - Paralelno. sjenica. engleski (vidi i najnovije 7. izdanje u izvorniku)
  8. Norton P., Souhe D. Asemblerski jezik za IBM PC - M.: Računalo, 1992. - 352 str.
  9. Pil'shchikov V.N. Programiranje u IBM PC asemblerskom jeziku - M.: DIALOG-MEPhI, 1994–2014 288 str.
  10. Sklyarov I.S. Učenje asemblera za 7 dana www.sklyaroff.ru

Napredna

  1. Kaspersky K. Osnove hakiranja. Umijeće rastavljanja. - M .: SOLON-Press, 2004.448 str. - (Serija "Kodokopatel")
  2. Kaspersky K. Tehnika za otklanjanje pogrešaka u programima bez izvornih kodova. - SPb .: BHV-Petersburg, 2005.-- 832 str.: ilustr.
  3. Kaspersky K. Računalni virusi iznutra i izvana. - SPb .: Petar, 2006 .-- 527 str .: ilustr.
  4. Kaspersky K. Bilješke istraživača računalnih virusa. - SPb .: Petar, 2006 .-- 316 str .: ilustr.
  5. Knut D. Umijeće programiranja, svezak 3. Razvrstavanje i pretraživanje, 2. izd.: prev. s engleskog - M .: Izdavačka kuća "Williams", 2003. - 832 str.: ilustr. - Paralelno. sjenica. Engleski
  6. Kolisničenko D.N. Rootkiti za Windows. Teorija i praksa programiranja "nevidljivih kapa", omogućujući skrivanje podataka, procesa, mrežnih veza iz sustava. - SPb .: Nauka i tehnika, 2006 .-- 320 str .: ilustr.
  7. Lyamin L.V. Makroasembler MASM.– M .: Radio i komunikacija, 1994.– 320 str .: ilustr.
  8. Magda Y. Asembler za Intel Pentium procesore. - SPb .: Petar, 2006 .-- 410 str .: ilustr.
  9. Mayko G.V. Asembler za IBM PC - M.: Business-Inform, Sirin, 1997. - 212 str.
  10. Warren G. Algoritamski trikovi za programere, 2. izd.: trans. s engleskog - M .: Izdavačka kuća "Williams", 2004. - 512 str.: ilustr. - Paralelno. sjenica. Engleski
  11. Sklyarov I.S. Umijeće zaštite i hakiranja informacija. - SPb .: BHV-Petersburg, 2004.-- 288 str.: ilustr.
  12. Weatherrell C. Studije za programere: Per. s engleskog - M .: Mir, 1982 .-- 288 str., Ill.
  13. Elektronska knjižnica braće Frolov www.frolov-lib.ru
  14. A. A. Čekatov Korištenje Turbo Assemblera u razvoju softvera - Kijev: Dialectics, 1995. - 288 str.
  15. Yurov V. Assembler: posebna referentna knjiga.- SPb .: Peter, 2001.- 496 str.: ilustr.
  16. Yurov V. Sastavljač. Radionica. 2. izd. - SPb .: Petar, 2006. - 399 str.: ilustr.
  17. Yurov V. Sastavljač. Udžbenik za sveučilišta. 2. izd. - SPb .: Petar, 2007 .-- 637 str .: ilustr.
  18. Pirogov V. Tečaj za asembler. 2001 Znanje
  19. Pirogov V. Tečaj obuke MONTAŽA 2003 Znanje-BHV
  20. V. Pirogov Monter za prozore
    1. izdanje - M .: Izdavačka kuća Molgachev S.V., 2002.
    2. izdanje - SPb.:. BHV-Peterburg, 2003. - 684 str.: ilustr.
    3. izdanje - SPb.:. BHV-Peterburg, 2005. - 864 str.: ilustr.
    4. izdanje - SPb.:. BHV-Peterburg, 2012. - 896 str.: ilustr.
  21. V. Pirogov montažer na primjerima. - SPb.:. BHV-Peterburg, 2012. - 416 str.: ilustr.
  22. V. Pirogov MONTAŽ i demontaža. - SPb.:. BHV-Peterburg, 2006 .-- 464 str .: ilustr.
  23. Pirogov V. rad na knjizi "64-bitno programiranje u asemblerskom jeziku (Windows, Unix)". Knjiga pokriva programiranje s fasmom na 64-bitnim Windowsima i Unixima
  24. Yurov V., Khoroshenko S. Assembler: tečaj obuke.- SPb .: Peter, 1999. - 672 str.
  25. Yu-Zheng Liu, Gibson G. 8086/8088 Mikroprocesori. Arhitektura, programiranje i dizajn mikroračunalnih sustava - M.: Radio i komunikacija, 1987. - 512 str.
  26. Agner Fog: Resursi za optimizaciju softvera (sastavljanje / c ++) 1996. - 2017.

Poljakov Andrej Valerijevič

http://info-master.su

[e-mail zaštićen]

av-inf.blogspot.ru

U kontaktu s:

vk.com/id185471101

facebook.com/100008480927503

Stranica knjige:

http://av-assembler.ru/asm/afd/assembler-for-dummy.htm

PAŽNJA!

Sva prava na ovu knjigu pripadaju Andreju V. Poljakovu. Nijedan dio ove knjige ne može se reproducirati u bilo kojem obliku bez pristanka autora.

Informacije sadržane u ovoj knjizi dobivene su iz izvora koje autor smatra pouzdanim. Međutim, s obzirom na moguće ljudske ili tehničke pogreške, autor ne može jamčiti apsolutnu točnost i potpunost danih informacija te ne snosi odgovornost za moguće pogreške i štete nastale korištenjem ovog dokumenta.

1. DOZVOLE

Knjigu je dopušteno koristiti u informativne i obrazovne svrhe (samo za osobnu upotrebu). Dopuštena je besplatna distribucija knjige.

2. OGRANIČENJA

Zabranjeno je korištenje knjige u komercijalne svrhe (prodaja, postavljanje na resurse s plaćenim pristupom itd.). Zabranjeno je mijenjati tekst knjige. Atribucija je zabranjena.

vidi također LICENCNI UGOVOR.

Polyakov A.V.

Asembler za lutke

Polyakov A.V. Sastavljač za lutke.

PREDGOVOR ................................................................ ................................................................ ................................................................ ...........

UVOD ................................................. ................................................................ ................................................................ ...................

N PUNO O PROCESORIMA.......................................................................................................................................................

1. BRZI POČETAK ................................................ ................................................................ ................................................................ .......

1.1. PRVI PROGRAM ................................................................ ................................................................ ................................................................ .....

1.1.1. Emu8086 ................................................. ................................................................ ................................................................ ...........

1.1.2. Otklanjanje pogrešaka ................................................ ................................................................ ................................................................ ............

1.1.3. MASM, TASM i WASM ........................................ ................................................................ ........................................

1.1.3.1. Sastavljanje u TASM-u ................................................. ................................................................ ................................................

1.1.3.2. Sastavljanje u MASM-u ................................................. ................................................................ ..............................................

1.1.3.3. Sastavljanje u WASM-u ................................................. ................................................................ ..............................................

1.1.3.4. Izvršenje programa ................................................................ ................................................................ ................................................

1.1.3.5. Korištenje BAT datoteka ................................................. ................................................. ........................................

1.1.4. Heksadecimalni uređivač ................................................ ................................................................ ...................

Sažetak................................................. ................................................................ ................................................................ ........................

2. UVOD U ASSEMBLERA ................................................ ................................................................ ..............................................

2.1. DO AK IMA KOMPJUTER...............................................................................................................................................

2.1.1. Struktura procesora ................................................................ ................................................................ ...................................

2.1.2. Registri procesora ................................................. ................................................................ ........................................

2.1.3. Ciklus izvršenja naredbe ................................................. ................................................................ .................................

2.1.4. Organizacija memorije ................................................................ ................................................................ ..............................................

2.1.5. Stvarni način rada ................................................ ................................................................ ................................................

2.1.6. Zaštićeni način rada ................................................ ................................................................ ..............................................

2.2. S PRORAČUNSKI SUSTAVI.....................................................................................................................................................

2.2.1. Binarni brojevni sustav ................................................. ................................................................ ........................

2.2.2. Heksadecimalni brojevni sustav ................................................. ................................................................ ....

2.2.3. Ostali sustavi ................................................................ ................................................................ ..............................................................

2.3. P UREĐIVANJE PODATAKA U MEMORIJI RAČUNALA.............................................................................................................

2.3.1. Pozitivni brojevi ................................................................ ................................................................ ...................................

2.3.2. Negativni brojevi ................................................................ ................................................................ ...................................

2.3.3. Što je prelijevanje ................................................. ................................................................ ................................

2.3.4. Registar zastava ................................................ ................................................................ ..............................................................

2.3.5. Kodovi znakova ................................................................ ................................................................ ................................................................

2.3.6. Realni brojevi ................................................................ ................................................................ ..............................................

2.3.6.1. Prvi pokušaj................................................ ................................................................ ................................................................ .........

2.3.6.2. Normalizirano snimanje brojeva ................................................ ................................................................ ...................................

2.3.6.3. Pretvaranje razlomaka u binarni dio ................................................. ................................................. ...

2.3.6.4. Reprezentacija realnih brojeva u memoriji računala ............................................ ...................................................

2.3.6.5. Brojevi fiksnih točaka ................................................. ................................................. ...................................

2.3.6.6. Brojevi s pomičnim zarezom ................................................. ................................................. ..............................................

LICENCNI UGOVOR................................................ ................................................................ ................................

PREDGOVOR

Asembler je čarobna riječ koja budi programere početnike. U međusobnoj komunikaciji nužno kažu da negdje netko ima poznatog "frajera" koji može čitati izvorne kodove na asembleru kao tekst knjige. Istodobno se, u pravilu, asemblerski jezik percipira kao nešto nedostupno običnim smrtnicima.

Ovo je djelomično točno. Možete naučiti nekoliko jednostavnih naredbi, pa čak i napisati neku vrstu programa, ali možete postati pravi guru (u svakom poslu) samo ako osoba jako dobro poznaje teorijske temelje i razumije što i zašto radi.

S druge strane, iskusni programeri visoke razine uvjereni su da je asemblerski jezik relikt prošlosti. Da, razvojni alati napravili su veliki napredak u posljednjih 20 godina. Sada možete napisati jednostavan program bez poznavanja bilo kojeg programskog jezika. Međutim, ne zaboravite na stvari poput mikrokontrolera. A u računalnom programiranju neke je zadatke lakše i brže riješiti pomoću asemblerskog jezika.

Ova je knjiga namijenjena onima koji već posjeduju vještine programiranja na visokoj razini, ali bi se željeli približiti hardveru i razumjeti kako se izvršavaju instrukcije procesora, kako se dodjeljuje memorija, kako se upravlja raznim hardverskim uređajima kao što su diskovi itd. .P

Knjiga je podijeljena u nekoliko dijelova. Prvi dio je brzi početak. Vrlo ukratko opisuje osnovne principe programiranja u asembleru, same asemblere (kompilatore) i metode rada s asemblerima. Ako se osjećate sigurni u programiranje na visokoj razini, ali želite svladati osnove programiranja na niskoj razini, možda ćete samo trebati pročitati ovaj odjeljak.

Drugi dio opisuje stvari kao što su sustavi brojeva, prikazi podataka u memoriji računala itd., odnosno stvari koje nisu izravno povezane s programiranjem, ali bez kojih je profesionalno programiranje nemoguće. Također, drugi dio detaljnije razmatra opća načela programiranja asemblerskog jezika.

Ostali dijelovi opisuju neke specifične primjere programiranja asemblerskog jezika, sadrže referentne materijale i tako dalje.

Osnove programiranja uopće nisu opisane u ovoj knjizi, tako da početnicima toplo preporučujem da se upoznaju s knjigom Kako postati programer, gdje su "na prste" objašnjeni opći principi programiranja te su detaljno razmotreni primjeri izrade jednostavnih programa od programa za računala do programa za CNC strojeve.

UVOD

Krenimo od terminologije.

Strojni kod je sustav instrukcija određenog računala (procesora), koji se tumači izravno od strane procesora. Instrukcija je obično cijeli broj koji se zapisuje u registar procesora. Procesor čita ovaj broj i izvodi operaciju koja odgovara ovoj uputi. To je popularno opisano u knjizi Kako postati programer.

Programski jezik niske razine(programski jezik niske razine) je programski jezik koji je što je moguće bliži programiranju u strojnim kodovima. Za razliku od strojnih kodova, u jeziku niske razine svaka naredba ne odgovara broju, već skraćenom nazivu naredbe (mnemonički). Na primjer, ADD je skraćenica za DODATAK. Stoga korištenje jezika niske razine uvelike pojednostavljuje pisanje i čitanje programa (u usporedbi s programiranjem u strojnim kodovima). Jezik niske razine je specifičan za procesor. Na primjer, ako ste napisali program niske razine za PIC procesor, možete biti sigurni da neće raditi s AVR procesorom.

Programski jezik visoke razine To je programski jezik koji je što je moguće bliži ljudskom jeziku (obično engleskom, ali postoje programski jezici na nacionalnim jezicima, na primjer, jezik 1C temelji se na ruskom). Jezik visoke razine praktički nije vezan uz određeni procesor ili operativni sustav (osim ako se ne koriste posebne direktive).

Jezik asemblera je programski jezik niske razine u kojem pišete svoje programe. Svaki procesor ima svoj asemblerski jezik.

Asembler je poseban program koji pretvara (sastavlja, odnosno sastavlja) izvorni kod vašeg programa napisan asemblerskim jezikom u izvršnu datoteku (datoteka s ekstenzijom EXE ili COM). Da budemo precizni, potrebni su dodatni programi za stvaranje izvršne datoteke, a ne samo asembler. Ali o tome kasnije...

U većini slučajeva kažu "assembler", ali znače "jezik montaže". Sada znate da su to različite stvari i nije sasvim ispravno to reći. Iako će vas svi programeri razumjeti.

Za razliku od jezika visoke razine kao što su Pascal, BASIC, itd., SVAKI ASEMBLER ima svoj VLASTITI JEZIK ASSEMBLA. Ovo pravilo u osnovi razlikuje asemblerski jezik od jezika visoke razine. Izvorni kodovi programa (ili jednostavno "izvori") napisani na jeziku visoke razine, u većini slučajeva možete kompilirati s različitim prevodiocima za različite procesore i različite operacijske sustave. To će biti puno teže učiniti s asemblerskim izvorima. Naravno, ova razlika je gotovo neprimjetna za različite asemblere koji su dizajnirani za iste procesore. Ali činjenica je da za SVAKI PROCESOR postoji VLASTITI ASEMBLER i VLASTITI JEZIK ASEMBLER. U tom smislu je programiranje na jezicima visoke razine puno lakše. Međutim, za sva zadovoljstva morate platiti. U slučaju jezika visoke razine možemo naići na takve stvari kao što su veća veličina izvršne datoteke, lošije performanse itd.

U ovoj ćemo knjizi govoriti samo o programiranju za računala s Intelovim procesorima (ili kompatibilnim). Kako bi se u praksi provjerilo dano

v U knjizi primjera trebat će vam sljedeći programi (ili barem neki od njih):

1. Emu8086. Dobar program, posebno za početnike. Uključuje uređivač izvora i neke druge korisne stvari. Radi na Windowsima, iako su programi napisani pod DOS-om. Nažalost, program košta (ali vrijedi))). Za detalje pogledajte http://www.emu8086.com.

2. TASM - Turbo Assembler iz Borlanda. Možete kreirati programe i za DOS i za Windows. Također košta i trenutno više nije podržan (a Borland više ne postoji). Općenito, to je dobra stvar.

3. MASM - Assembler iz Microsofta (skraćeno za MACRO asembler, a ne Microsoft Assembler, kako mnogi neupućeni misle). Možda najpopularniji asembler za Intelove procesore. Još uvijek je podržan. Shareware program. Odnosno, ako ga kupite zasebno, to će koštati novac. Ali dostupan je besplatno MSDN pretplatnicima i uključen je u Microsoftov paket Visual Studio.

4. WASM - asembler iz Watcoma. Kao i svi drugi, ima prednosti i nedostatke.

5. Debug - ima skromne značajke, ali ima veliki plus - uključen je u standardni Windows set. Potražite ga u mapi WINDOWS \ COMMAND ili WINDOWS \ SYSTEM32. Ako ga ne pronađete, onda u drugim mapama WINDOWS direktorija.

6. Također je poželjno imati bilo koji hex urednik... Nemojte povrijediti i DOS upravitelj datoteka, na primjer Volkov Commander (VC) ili Norton Commander (NC). Također se mogu koristiti za pregled heksadecimalnih kodova datoteke, ali se ne mogu uređivati. Na internetu postoji dosta besplatnih heksadecimalnih uređivača. Evo jednog: McAfee FileInsight v2.1. Isti uređivač može se koristiti za rad s izvornim kodovima programa. Međutim, volim to bolje raditi sa sljedećim uređivačem:

7. Uređivač teksta... Neophodan je za pisanje izvornog koda vaših programa. Mogu preporučiti besplatni uređivač PSPad, koji podržava mnoge programske jezike, uključujući Assembly.

Svi programi (i primjeri programa) predstavljeni u ovoj knjizi testirani su na operativnost. I upravo se ti programi koriste za provedbu primjera programa u ovoj knjizi.

Pa ipak - izvorni kod napisan, na primjer, za Emu8086, malo će se razlikovati od koda napisanog, na primjer, za TASM. O tim razlikama će se raspravljati.

Većina programa u knjizi napisana je za MASM. Prvo, zato što je ovaj asembler najpopularniji i još uvijek podržan. Drugo, jer se isporučuje s MSDN-om i Microsoftovim paketom Visual Studio. I treće, jer sam ponosni vlasnik licencirane kopije MASM-a.

Ako već imate bilo koji asembler koji nije uključen u gornji popis, tada ćete morati sami shvatiti njegovu sintaksu i pročitati korisnički priručnik kako biste naučili kako ispravno raditi s njim. Ali opće preporuke dane u ovoj knjizi vrijedit će za sve (dobro, ili gotovo sve) asemblere.

Malo o procesorima

Procesor je mozak računala. Fizički, ovo je poseban mikro krug s nekoliko stotina pinova koji je umetnut u matičnu ploču. Ako teško možete zamisliti što je to, preporučam da pročitate članak Lutke o računalima.

Čak iu svijetu računala postoji dosta procesora. No, osim računala, tu su i televizori, perilice rublja, klima uređaji, upravljački sustavi za motore s unutarnjim izgaranjem i sl., gdje se vrlo široko koriste i procesori (mikroprocesori, mikrokontroleri).

Svaki procesor ima svoj skup registara. Registri procesora su posebna memorijska mjesta koja se nalaze izravno na procesorskom čipu. Registri se koriste u različite svrhe (više detalja o registrima bit će napisano u nastavku).

Svaki procesor ima svoj skup uputa. Instrukcija procesora se upisuje u određeni registar, a zatim procesor izvršava ovu instrukciju. O uputama i registrima procesora ćemo govoriti puno i često kroz cijelu knjigu. Za početnike preporučam knjigu Kako postati programer, gdje se najopćenitije, ali razumljivim jezikom, govori o principima izvršavanja programa od strane računala.

Što je naredba u smislu procesora? To je samo broj. Međutim, moderni procesori mogu imati nekoliko stotina uputa. Bit će teško zapamtiti sve njih. Kako onda pišete programe? Kako bi se pojednostavio rad programera, izmišljen je jezik asemblera, gdje svaka naredba odgovara mnemoničkom kodu. Na primjer, broj 4 odgovara mnemoničkom ADD. Ponekad se jezik asemblera naziva i mnemonički jezik za instrukcije.

1. BRZI POČETAK

1.1. Prvi program

Obično je prvi primjer program koji ispisuje string "Hello World!" Međutim, za osobu koja je tek počela učiti Assembler takav će program biti previše kompliciran (smijat ćete se, ali stvarno jest – pogotovo u nedostatku razumljivih informacija). Stoga će naš prvi program biti još jednostavniji - prikazat ćemo samo jedan znak - englesko slovo "A". I općenito - ako ste već odlučili postati programer - hitno postavite zadani raspored engleske tipkovnice. Štoviše, neki asembleri i kompajleri ne prihvaćaju ruska slova. Dakle, naš prvi program će prikazati englesko slovo "A". Zatim ćemo pogledati stvaranje takvog programa pomoću raznih asemblera.

Ako ste preuzeli i instalirali emulator procesora 8086 (pogledajte odjeljak UVOD), tada ga možete koristiti za stvaranje svojih prvih programa na asembleru. Trenutno (studeni 2011.) dostupna je verzija 4.08. Pomoć na ruskom možete pronaći ovdje: http://www.avprog.narod.ru/progs/emu8086/help.html.

Program Emu8086 se plaća. Međutim, možete ga koristiti besplatno 30 dana.

Dakle, preuzeli ste i instalirali program Emu8086 na svoje računalo. Pokrenite ga i kreirajte novu datoteku putem izbornika DATOTEKA - NOVO - COM PREDLOŽAK (Datoteka - Novo - COM predložak datoteke). U izvornom uređivaču, nakon toga, vidjet ćemo sljedeće:

Riža. 1.1. Izrada nove datoteke u Emu8086.

Ovdje treba napomenuti da su programi stvoreni pomoću asemblera za računala sa sustavom Windows dvije vrste: COM i EXE. Kasnije ćemo pogledati razlike između ovih datoteka, ali za sada samo trebate znati da ćemo po prvi put kreirati izvršne datoteke s COM ekstenzijom, budući da su jednostavnije.

Nakon kreiranja datoteke u Emu8086 kako je gore opisano, u izvornom uređivaču vidjet ćete redak "dodaj svoj kod čuj" - "dodaj svoj kod ovdje" (slika 1.1). Brišemo ovaj redak i umjesto njega umećemo sljedeći tekst:

Dakle, cijeli će tekst programa izgledati ovako:

Osim toga, u gornjem dijelu su komentari (na slici 1.1 - ovo je zeleni tekst). Komentar u asemblerskom jeziku počinje znakom; (točka-zarez) i nastavlja se do kraja retka. Ako ne znate što su komentari i zašto su potrebni, pogledajte knjigu Kako postati programer... Kao što sam već rekao, ovdje nećemo objašnjavati osnove programiranja, budući da je knjiga koju sada čitate namijenjena ljudima koji su upoznati s osnovama programiranja.

Također imajte na umu da asemblerski jezik nije osjetljiv na velika i mala slova. Možete napisati RET, ret ili Ret - to će biti ista naredba.

Ovu datoteku možete spremiti negdje na disk. Ali ne morate. Za izvršavanje programa pritisnite tipku EMULATE (sa zelenim trokutom) ili tipku F5. Otvorit će se dva prozora: prozor emulatora i prozor izvornog koda (slika 1.2).

V prozor emulatora prikazuje registre i tipke za upravljanje programom. Izvorni prozor prikazuje izvor vašeg programa, naglašavajući redak koji se trenutno izvršava. Sve je to vrlo prikladno za proučavanje i otklanjanje pogrešaka programa. Ali još nam ne treba.

V U prozoru emulatora možete pokrenuti svoj program za izvršenje u cijelosti (gumb RUN) ili u načinu rada korak po korak (gumb SINGLE STEP). Korak po korak način rada prikladan je za otklanjanje pogrešaka. Pa, sada ćemo pokrenuti program za izvršenje s tipkom RUN. Nakon toga (ako niste pogriješili u tekstu programa), vidjet ćete poruku o završetku programa (slika 1.3). Ovdje ste obaviješteni da je program prenio kontrolu na operativni sustav, odnosno da je program uspješno dovršen. Kliknite OK u ovom prozoru i konačno ćete vidjeti rezultat vašeg prvog programa na asembleru (sl.

Riža. 1.2. Prozor emulatora Emu8086.

Riža. 1.3. Poruka o završetku programa.

Riža. 1.4. Vaš prvi program je završen.

Vrhunski povezani članci