Strojni kod kao programski jezik. Jezik asemblera

Sklopni jezik (ili asembler) je programski jezik niske razine za računalo ili drugi programabilni hardver, u kojem postoji korelacija između jezika i arhitekture strojnih kodova. Svaki strojno orijentirani jezik (u stručnoj terminologiji - "kolektor") odnosi se na specifičnu arhitekturu računala. Naprotiv, većina programskih jezika na visokoj razini su cross-platform, ali zahtijevaju interpretaciju ili kompilaciju. Kôd orijentiran na platformu može se također nazvati simboličnim jezikom ili skupom uputa koje izvršava izravno središnji procesor računala. Svaki program koji izvršava procesor sastoji se od niza uputa. Strojni kod je po definiciji najniža razina programiranja vidljiva programeru.




Upotreba

Za mnoge operacije, jedan ili više operanada trebaju izgraditi kompletnu instrukciju, a mnogi sastavljači mogu prihvatiti izraze brojeva i konstanti, kao i registre i oznake operanda. To oslobađa stručnjaka prilikom programiranja na jeziku strojnog koda od zamornih ponavljajućih izračuna. Ovisno o arhitekturi, ovi se elementi mogu kombinirati za specifične upute ili načine adresiranja pomoću smjena ili drugih podataka, kao i fiksne adrese. Mnogi "kolektori" nude dodatne mehanizme koji olakšavaju razvoj programa, kontroliraju proces stvaranja i održavanja ispravljanja pogrešaka.


Povijesna perspektiva

Prvi jezik asemblera razvio je 1947. godine Kathleen Booth za ARC2 na Sveučilištu Birkbeck u Londonu u procesu rada s Johnom von Neumannom i Hermannom Goldstinom na Institutu za napredna istraživanja. SOAP (Symbolic Optimal Assembly Program) bio je jezik montažera za montažu IBM 650 PC-a kojeg je stvorio Stan Poul 1955. godine. Povijesno gledano, mnoga su softverska rješenja pisana u asembleru. OS je napisan isključivo na ovom jeziku prije uvođenja Burroughs MCP (1961), koji je napisan na jeziku Executive Systems Problem Oriented Language (ESPOL). Mnoge komercijalne aplikacije napisane su na strojno orijentiranom jeziku, uključujući veliku količinu IBM-ovog glavnog računala, kojeg su stvorili IT divovi. COBOL i FORTRAN su naposljetku zamijenili veći dio posla, iako su mnoge velike organizacije u 1990-ima zadržale infrastrukturu za aplikatore.
Većina ranih mikroračunala temeljila se na ručnom kodiranju asemblerskog jezika, uključujući većinu OS i velikih aplikacija. To je zbog činjenice da su ovi strojevi imali ozbiljna ograničenja resursa, učitavali su individualnu arhitekturu memorije i prikaza i pružali ograničene usluge sustava s pogreškama. Možda je još važnije nedostatak prvoklasnih kompilatora jezika, pogodnih za upotrebu u mikroračunalu, što je kompliciralo obuku strojnog koda.

Područje primjene

Jezici kompajliranja eliminiraju većinu problematičnih, dugotrajnih i radno intenzivnih programa na sklopovima prve generacije koji su potrebni na najranijim računalima. To je tooslobađa programatore od rutine u obliku memoriranja numeričkih kodova i izračunavanja adresa. U početnim fazama sakupljači su se široko koristili za sve vrste programiranja. Međutim, do kraja 1980-ih njihova je upotreba uvelike zamijenjena jezicima više razine u potrazi za povećanjem produktivnosti programa. Danas se asemblerski jezik koristi za izravnu manipulaciju hardvera, pristup specijaliziranim procesorskim uputama ili za rješavanje kritičnih problema izvedbe. Tipične aplikacije su upravljački programi, ugrađeni sustavi niske razine i postavke u stvarnom vremenu. Primjeri primjene
Tipični primjeri većih programa na jeziku asemblerskog jezika su IBM PC DOS operativni sustavi, Turbo Pascal prevodilac i rane aplikacije kao što je Lotus 1-2-3 program za proračunske tablice.
Strojno orijentirani jezik je glavni razvojni jezik mnogih popularnih kućnih računala iz 1980-ih i 1990-ih (kao što su MSX, Sinclair ZX Spectrum, Commodore 64 Commodore Amiga i Atari ST). To je zbog činjenice da su interpretirani BASIC dijalozi na tim sustavima osigurali nisku brzinu izvršenja, kao i ograničene mogućnosti za punu upotrebu postojeće opreme. Neki sustavi čak imaju integrirano razvojno okruženje (IDE) s visoko razvijenim alatima za otklanjanje pogrešaka i makro objektima. Neki kompilatori dostupni Radio Shack TRS-80 i njegovi nasljednici uspjeli su kombinirati ugrađeni izvor s visokim programima. Nakon kompilacije, ugrađeni asembler je stvorio ugrađeni binarni kod.

Strojni kod za lutke. Terminologija

Program za sastavljanje stvara transakcijske kodove prevođenjem kombinacija mnemoničkih i sintaktičkih pravila za operacije i načina adresiranja u njihove numeričke ekvivalente. Ova reprezentacija obično uključuje operacijski kod, kao i druge kontrolne bitove i podatke. Skupljač također izračunava stalne izraze i definira imena znakova za mjesta memorije i druge objekte.
Naredbe sklopa strojeva također mogu izvesti neke jednostavne vrste optimizacije, ovisno o skupu naredbi. Jedan specifičan primjer za to mogu biti popularni "kolektori" x86 različitih proizvođača. Većina njih može na zahtjev izvršiti zamjenske naredbe u bilo kojem broju prolaza. Oni su također u mogućnosti izvršiti jednostavnu pregrupiranje ili umetanje uputa, kao što su neki RISC kolektori, što može pomoći optimizirati inteligentno planiranje naredbi kako bi se maksimalno iskoristio CPU transporter. Poput ranih programskih jezika kao što su Fortran, Algol, Cobol i Lisp, kolekcionari su dostupni od 1950-ih, kao i prva generacija tekstualnih računalnih sučelja. Međutim, prvi su sakupljači došli jer su mnogo lakše pisali nego kompilatori za jezike visoke razine. To je zbog činjenice da se svaki mnemonički, kao i načini adresiranja i operandi instrukcija prevedu u numeričke prikaze svake pojedine instrukcije bez velikog konteksta ili analize. Postojali su i brojni razredi prevoditelja i poluautomatskih generatora koda sa svojstvima sličnim skupovima ikao što je kodiranje na visokoj razini i kod velike brzine, možda je jedan od najpoznatijih primjera.

Broj prolaza

Postoje dva tipa programiranja asemblera na temelju broja prolaza kroz izvor (prema broju pokušaja čitanja) za stvaranje objektne datoteke.
One-pass sastavljači prolaze kroz izvorni kod jednom. Bilo koji znak koji se koristi za definiranje zahtijevat će pogreške na kraju objektnog koda.
Višestruki sastavljači kreiraju tablice sa svim znakovima i njihovim vrijednostima u prvim odlomcima, a zatim primjenjuju tablicu u sljedećim odlomcima za generiranje koda. Početni razlog za korištenje jedno-propusnih kolektora bila je brzina prikupljanja - često je drugi prolaz zahtijevao premotavanje i ponovno čitanje izvora programa na vrpci. Kasnija računala s ogromnom količinom memorije (posebno za pohranu diskova) imala su prostor za obavljanje svih potrebnih obrada bez ponovnog čitanja. Prednost multi-pass sklopa je u tome što odsutnost pogrešaka dovodi do činjenice da proces vezanja (ili preuzimanje programa, ako asembler izravno stvara izvršni kod) prolazi brže.

Što je binarni kod? Program pisan na jeziku asemblera sastoji se od niza mnemoničkih naredbi procesora i meta-operatora (poznatih kao direktive, pseudo-upute i pseudo-operacije), komentara i podataka. Upute za asemblerski jezik obično se sastoje od operacije mnemoničkog koda. Slijedi popis podataka, argumenata ili parametara. Oni jesupreveo ih je asembler u uputama strojnog jezika, koje su učitane u memoriju i izvršene. Na primjer, sljedeća naredba govori x86 /IA-32 procesoru da premjesti 8-bitnu vrijednost u registar. Binarni kod za ovu naredbu je 10110, a zatim 3-bitni identifikator za koji se koristi registar. Identifikator AL je 000, tako da sljedeći kod učitava AL registar podacima 01100001. Postavlja se pitanje: što je binarni kod? To je sustav kodiranja koji koristi binarne znamenke "0" i "1" za predstavljanje slova, broja ili drugog znaka na računalu ili drugom elektroničkom uređaju. Primjer strojnog koda: 1011000001100001.

Tehničke značajke

Pretvaranje jezika montaže u strojni kod je zadaća sastavljanja. Reverzni proces se izvodi pomoću rastavljača. Za razliku od jezika na visokoj razini, postoji jedan-na-jedan podudarnost između mnoštva jednostavnih sklopova i instrukcija strojnog jezika. Međutim, u nekim slučajevima asembler može pružiti pseudo-upute (makronaredbe). Primjenjuju se na nekoliko strojnih jezičnih uputa za pružanje uobičajenih funkcija. Većina potpuno opremljenih sastavljača također nudi bogat makro sadržaj koji dobavljači i programeri koriste za generiranje složenijih kodova i nizova podataka.
Svaka arhitektura računala ima svoj strojni jezik. Računala se razlikuju po broju i vrstama operacija koje podržavaju, u različitim veličinama i broju registara, kao iu prikazu podataka u spremištu. U tomedok je većina računala opće namjene sposobna obavljati gotovo istu funkcionalnost, načini na koje se oni razlikuju. Odgovarajući jezici asemblera odražavaju te razlike. Za skup skupa naredbi koje se obično stvaraju u različitim programima mogu postojati mnogi skupovi sklopova mnemoničkih ili sintaksnih skupova. U tim slučajevima, najpopularniji je, u pravilu, onaj koji je osigurao proizvođač i koji se koristi u njegovoj dokumentaciji.

Jezik dizajna

Postoji velika raznolikost u načinu na koji autori kolekcionara klasificiraju aplikacije i nomenklaturu koju koriste. Posebice, neki opisuju sve što se razlikuje od stroja ili prošireno mnemoničko kao pseudo-operacija. Osnovni rječnik zbirke sastoji se od sustava naredbi - tri glavne vrste instrukcija koje se koriste za određivanje operacija programa:
  • mnemonički opcode;
  • određivanje podataka;
  • Vodič za kolekcionare.

    Mnemonički opcode i prošireni mnemonički

    Upute napisane na jeziku asemblera su elementarne, za razliku od jezika visoke razine. Tipično, mnemonički (slučajni simboli) je simbol za jednu naredbu izvršnog koda. Svaka naredba obično se sastoji od koda operacije plus nula ili više operanada. Većina naredbi odnosi se na jednu ili dvije vrijednosti. Prošireni mnemonici najčešće se koriste za specijalizirane priručnike za uporabu u svrhe koje nisu očigledne iz naziva priručnika. Na primjer, mnogi procesori nemaju eksplicitnu NOP instrukciju, ali imajuugrađeni algoritmi koji se koriste u tu svrhu.
    Mnogi kolektori podržavaju elementarne ugrađene makroe koji mogu generirati dvije ili više strojnih uputa.

    Direktive o podacima

    Postoje upute za identifikaciju elemenata za pohranjivanje podataka i varijabli. Oni određuju vrstu podataka, dužinu i poravnanje. Ove upute mogu odrediti dostupnost informacija za vanjske programe (prikupljene odvojeno) ili samo za aplikaciju koja ima definiran odjeljak s podacima. Neki asembleri ih definiraju kao pseudo-operatore.

    Smjernice za sklapanje

    Pravila montaže, koja se nazivaju i pseudokode ili pseudo-operacije, su naredbe koje daje asembler i usmjeravaju ih na operacije koje nisu upute za montažu. Smjernice utječu na rad asemblera i mogu utjecati na objektni kod, tablicu simbola, popis datoteka i vrijednost parametara unutarnjeg asemblera. Ponekad je izraz pseudokoda rezerviran za direktive koje generiraju objektni kod. Imena pseudo-operacija često počinju u nekoj točki koja se razlikuje od strojnih naredbi. Još jedna uobičajena upotreba pseudo-operacija je rezerviranje područja za pohranu podataka za vrijeme izvođenja i moguće inicijalizacija njihovog sadržaja na poznate vrijednosti.

    Samoregulirani kod

    Sklopači simbola omogućuju programerima povezivanje proizvoljnih imena (oznaka ili simbola) s memorijskim stanicama i različitim konstantama. Često se svakoj konstantnoj varijabli i varijabli dodjeljuje vlastito ime,tako da se upute mogu odnositi na ta mjesta po imenu, čime se olakšava samok dokumentiranje. U izvršnom kodu, ime bilo kojeg potprograma odgovara njegovoj ulaznoj točki, tako da svi pozivi u potprogramu mogu koristiti njegovo ime. Unutar potprograma dodijeljene su oznake GOTO. Mnogi kolekcionari podržavaju lokalne znakove koji su leksički različiti od običnih znakova. Skupljači poput NASM-a pružaju fleksibilno upravljanje znakovima, omogućujući programerima da upravljaju različitim prostorima imena, automatski izračunavaju odstupanja u podatkovnim strukturama i dodjeljuju oznake koje se odnose na doslovne vrijednosti ili rezultat jednostavnih kalkulacija koje izvodi asembler. Prečaci se također mogu koristiti za inicijaliziranje konstanti i varijabli s pomičnim adresama. Jezici za montažu, kao i većina drugih računalnih jezika, omogućuju vam dodavanje komentara izvornom kodu programa koji će biti zanemareni tijekom procesa izrade. Pravosudni komentari su važni u jezičnim programima za asemblere, jer je definiranje i dodjeljivanje niza binarnih strojnih naredbi teško definirati. "Neupravljani" (bez komentara) asemblerski jezik, stvoren kompilatorima ili disasemblerima, teško je pročitati kada je potrebno napraviti promjene.
  • Povezane publikacije