Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Operativni sistemi
  • Osnovne komponente asemblerskog jezika i struktura komandi. Opće karakteristike sistema instrukcija jezika Assembler za IBM-PC (osnovni skup instrukcija, metode adresiranja glavnog operanda)

Osnovne komponente asemblerskog jezika i struktura komandi. Opće karakteristike sistema instrukcija jezika Assembler za IBM-PC (osnovni skup instrukcija, metode adresiranja glavnog operanda)

Po svrsi se mogu razlikovati naredbe (u zagradama su dati primjeri mnemoničkih opkodova naredbi PC asemblera tipa IBM PC):

l izvodim aritmetičke operacije (ADD i ADC - sabiranje i sabiranje sa prijenosom, SUB i SBB - oduzimanje i oduzimanje uz pozajmicu, MUL i IMUL - množenje bez predznaka i znaka, DIV i IDIV - bezznačno i predpisano dijeljenje, CMP - poređenja itd.) ;

l izvođenje logičkih operacija (ILI, I, NE, XOR, TEST, itd.);

l prijenos podataka (MOV - slanje, XCHG - razmjena, IN - ulazak u mikroprocesor, OUT - povlačenje iz mikroprocesora, itd.);

l prijenos kontrole (grane programa: JMP - bezuvjetna grana, CALL - poziv procedure, RET - povratak iz procedure, J * - uslovna grana, LOOP - kontrola petlje, itd.);

l obrada znakovnih nizova (MOVS - prenosi, CMPS - poređenja, LODS - preuzimanja, SCAS - skeniranja. Ove naredbe se obično koriste sa prefiksom (modifikator ponavljanja) REP;

l programski prekidi (INT - softverski prekidi, INTO - uslovni prekidi kod prelivanja, IRET - povratak iz prekida);

l mikroprocesorska kontrola (ST* i CL* - postavljanje i brisanje zastavica, HLT - stop, WAIT - pripravnost, NOP - mirovanje, itd.).

Kompletnu listu asemblerskih komandi možete pronaći u radovima.

Komande za prijenos podataka

l MOV dst, src - prijenos podataka (premjestiti - premjestiti sa src na dst).

Prenosi: jedan bajt (ako su src i dst u formatu bajta) ili jednu riječ (ako su src i dst u formatu riječi) između registara ili između registra i memorije i upisuje trenutnu vrijednost u registar ili memoriju.

Operandi dst i src moraju imati isti format - bajt ili riječ.

Src može biti tipa: r (registar) - registar, m (memorija) - memorija, i (impedansa) - neposredna vrijednost. Dst može biti tipa r, m. Operandi se ne mogu koristiti u jednoj naredbi: rsegm zajedno sa i; dva operanda tipa m i dva operanda tipa rsegm). Operand i takođe može biti jednostavan izraz:

mov AX, (152 + 101B) / 15

Evaluacija izraza se vrši samo tokom prevođenja. Zastave se ne mijenjaju.

l PUSH src - stavljanje riječi na stog (push - progurati; gurnuti na stek iz src). Gura sadržaj src na vrh steka - bilo koji 16-bitni registar (uključujući segment) ili dvije memorijske lokacije koje sadrže 16-bitnu riječ. Zastave se ne mijenjaju;

l POP dst - izdvajanje riječi iz steka (pop - pop; brojanje iz steka u dst). Uklanja riječ s vrha steka i stavlja je u dst - bilo koji 16-bitni registar (uključujući segment) ili dvije memorijske lokacije. Zastave se ne mijenjaju.

Uvod.

Jezik na kojem je napisan originalni program se zove unos jezik, i jezik na koji je preveden za izvršenje od strane procesora - vikend jezik. Proces pretvaranja ulaznog jezika u izlazni jezik se zove emitovanje. Pošto su procesori sposobni da izvršavaju programe u binarnom mašinskom jeziku, koji se ne koristi za programiranje, neophodan je prevod svih izvornih programa. poznato dva načina prevodi: kompilacija i tumačenje.

At kompilacija izvorni program se prvo u potpunosti prevodi u ekvivalentni program na ciljnom jeziku, tzv objekt program, a zatim se izvršava. Ovaj proces se provodi pomoću posebnog programi, pozvao kompajler. Kompajler za koji je ulazni jezik simbolički oblik reprezentacije mašinskog (izlaznog) jezika binarnih kodova naziva se asembler.

At interpretacije svaki red teksta izvornog programa se raščlanjuje (interpretira) i komanda navedena u njemu se odmah izvršava. Implementacija ove metode leži u program tumača. Interpretacija traje dugo. Da bi povećao svoju efikasnost, umjesto da obrađuje svaki red, tumač preliminarno pretvara sve komanda nizovi u znakove (

). Generirani niz simbola se koristi za obavljanje funkcija dodijeljenih originalnom programu.

Asemblerski jezik o kojem se govori u nastavku implementira se pomoću kompilacije.

Karakteristike jezika.

Glavne karakteristike asemblera:

● umjesto binarnih kodova, jezik koristi simbolička imena - mnemonika. Na primjer, za naredbu za dodavanje (

) koristi se mnemotehnika

Oduzimanje (

množenje (

divizije (

itd. Simbolička imena se takođe koriste za adresiranje memorijskih ćelija. Da biste programirali u asemblerskom jeziku, umjesto binarnih kodova i adresa, trebate znati samo simbolička imena koja asembler prevodi u binarne kodove;

svaka izjava odgovara jedna komanda mašine(kod), to jest, postoji korespondencija jedan-na-jedan između mašinskih instrukcija i operatora u programu asemblerskog jezika;

● jezik omogućava pristup na sve objekte i timovi. Jezici visokog nivoa nemaju ovu mogućnost. Na primjer, asemblerski jezik vam omogućava da provjerite bit registra zastavice i jezik visokog nivoa (na primjer,

) nema ovu mogućnost. Imajte na umu da jezici za sistemsko programiranje (na primjer, C) često zauzimaju srednju poziciju. U smislu pristupačnosti, bliži su asemblerskom jeziku, ali imaju sintaksu jezika visokog nivoa;

● asemblerski jezik nije univerzalni jezik. Svaka specifična grupa mikroprocesora ima svog asemblera. Jezici visokog nivoa nemaju ovaj nedostatak.

Za razliku od jezika visokog nivoa, pisanje i otklanjanje grešaka u programu asemblerskog jezika oduzima mnogo vremena. Uprkos tome, asemblerski jezik je postao široku upotrebu zbog sljedećih okolnosti:

● Program napisan u asemblerskom jeziku je mnogo manji i mnogo brži od programa napisanog na jeziku visokog nivoa. Za neke aplikacije, ovi indikatori igraju primarnu ulogu, na primjer, mnogi sistemski programi (uključujući kompajlere), programi na kreditnim karticama, mobilnim telefonima, drajveri uređaja, itd.;

● Neke procedure zahtevaju potpuni pristup hardveru, što obično nije moguće na jeziku visokog nivoa. Ovaj slučaj uključuje prekide i rukovaoce prekidima u operativnim sistemima, kao i kontrolere uređaja u ugrađenim sistemima u realnom vremenu.

U većini programa, samo mali procenat ukupnog koda je odgovoran za veliki procenat vremena izvršavanja programa. Tipično, 1% programa je odgovorno za 50% vremena izvršenja, a 10% programa je odgovorno za 90% vremena izvršavanja. Stoga se za pisanje određenog programa u stvarnim uvjetima koriste i asembler i jedan od jezika visokog nivoa.

Format operatora u asemblerskom jeziku.

Program na asemblerskom jeziku je lista naredbi (izjava, rečenica), od kojih svaka zauzima poseban red i sadrži četiri polja: polje oznake, polje operacije, polje operanda i polje komentara. Svako polje ima zasebnu kolonu.

Polje oznake.

Za polje oznake dodjeljuje se kolona 1. Oznaka je simbolički naziv, ili identifikator, adrese memorija. Neophodan je da biste mogli:

● izvršiti uslovni ili bezuslovni prelaz na komandu;

● dobiti pristup mjestu gdje se podaci pohranjuju.

Takve izjave su označene. Za označavanje imena koriste se (velika) slova engleske abecede i brojevi. Ime mora početi slovom i završiti dvotočkom. Oznaka dvotočka može biti napisana u posebnom redu, a opcode se može napisati u sljedećem redu u koloni 2, što pojednostavljuje rad kompajlera. Odsustvo dvotočke onemogućava razlikovanje oznake i koda operacije ako su u odvojenim redovima.

U nekim verzijama asemblerskog jezika, dvotočke se postavljaju samo nakon oznaka instrukcija, a ne nakon oznaka podataka, a dužina oznake može biti ograničena na 6 ili 8 znakova.

Polje oznake ne bi trebalo da sadrži ista imena, jer je oznaka povezana sa adresama komandi. Ako tokom izvršavanja programa nema potrebe za pozivanjem naredbe ili podataka iz memorije, tada polje oznake ostaje prazno.

Polje koda transakcije.

Ovo polje sadrži naredbu mnemonika ili pseudo-naredbu (vidi dolje). Mnemonički kod komande biraju dizajneri jezika. Na asemblerskom jeziku

mnemonika odabran za učitavanje registra iz memorije

), i za pohranjivanje sadržaja registra u memoriju - mnemonika

). U asemblerskim jezicima

možete koristiti isto ime za obje operacije, respektivno

Ako izbor mnemoničkih imena može biti proizvoljan, onda je potreba za korištenjem dvije strojne instrukcije zbog arhitekture procesora

Mnemotehnika registra takođe zavisi od verzije asemblera (tabela 5.2.1).

Operand polje.

Ovdje su dodatne informacije potrebne za izvođenje operacije. U polju operanda za instrukcije za skok je naznačena adresa na koju želite da preskočite, kao i adrese i registri koji su operandi za mašinsku instrukciju. Kao primjer, ovdje su operandi koji se mogu koristiti za 8-bitne procesore

● numeričke podatke,

predstavljeni u različitim brojevnim sistemima. Za označavanje korišćenog sistema brojeva, konstantu prati jedno od latiničnih slova: B,

Prema tome, binarni, oktalni, heksadecimalni, decimalni sistemi brojeva (

se možda neće snimiti). Ako je prva znamenka heksadecimalnog broja A, B, C,

Tada se beznačajna 0 (nula) dodaje ispred;

● kodovi internih registara mikroprocesora i memorijskih ćelija

M (izvori ili primaoci informacija) u obliku slova A, B, C,

M ili njihove adrese u bilo kojem brojevnom sistemu (na primjer, 10V - adresa registra

u binarnom sistemu);

● identifikatori,

za registrovane parove aviona,

Prva slova B

H; za par akumulatora i registar karakteristika -

; za brojač programa -

; za pokazivač steka -

● oznake koje označavaju adrese operanda ili sljedeće instrukcije u uslovnom

(kada je uslov ispunjen) i bezuslovne tranzicije. Na primjer, operand M1 u naredbi

znači potrebu za bezuslovnim prijelazom na naredbu, čija je adresa u polju oznake označena identifikatorom M1;

● izrazi,

koji su izgrađeni povezivanjem podataka o kojima smo gore govorili koristeći aritmetičke i logičke operatore. Imajte na umu da način rezerviranja prostora podataka ovisi o verziji jezika. Programeri asemblerskog jezika za

Definirajte riječ), a kasnije uvedena alternativa.

koji je od samog početka bio na jeziku za procesore

U jezičkoj verziji

korišteno

definirati konstantu).

Procesori obrađuju operande različitih dužina. Da bi ga definirali, programeri asemblera su donijeli različite odluke, na primjer:

II registri različitih dužina imaju različite nazive: EAX - za postavljanje 32-bitnih operanda (tip

); AX - za 16-bitni (tip

i AN - za 8-bitni (tip

● za procesore

sufiksi se dodaju svakom opkodu: sufiks

Za tip

; sufiks ".B" za vrstu

za operande različitih dužina, koriste se različiti opkodovi, na primjer, za učitavanje bajta, poluriječi (

) i riječi u 64-bitnom registru koriste operacijske kodove

respektivno.

Polje za komentare.

Ovo polje pruža objašnjenja o akcijama programa. Komentari ne utiču na rad programa i namijenjeni su osobi. Oni mogu biti potrebni za modifikaciju programa koji, bez ovakvih komentara, može biti potpuno nerazumljiv čak i iskusnim programerima. Komentar počinje znakom i koristi se za objašnjenje i dokumentovanje programa. Početni karakter komentara može biti:

● tačka i zarez (;) na jezicima za procesore kompanije

● uzvičnik (!) u jezicima za

Svakom posebnom redu rezerviranom za komentar prethodi početni znak.

Pseudo komande (direktive).

U asemblerskom jeziku mogu se razlikovati dvije glavne vrste naredbi:

osnovni instrukcije koje su ekvivalentne mašinskom kodu procesora. Ove komande obavljaju svu obradu koju pruža program;

pseudo-komande ili direktive, dizajniran da služi procesu prevođenja programa u jezik kodnih kombinacija. Kao primjer, u tabeli. 5.2.2 prikazuje neke pseudo-komande asemblera

za porodicu

.

Prilikom programiranja postoje situacije kada se, prema algoritmu, isti lanac naredbi mora ponoviti više puta. Da biste izašli iz ove situacije, možete:

● napišite željeni niz naredbi kad god se pojavi. Ovaj pristup dovodi do povećanja obima programa;

● uredite ovu sekvencu u proceduru (potprogram) i pozovite je ako je potrebno. Takav izlaz ima svoje nedostatke: svaki put morate izvršiti posebnu instrukciju poziva procedure i povratnu instrukciju, što uz kratku i često korištenu sekvencu može znatno smanjiti brzinu programa.

Najjednostavniji i najefikasniji način da se lanac naredbi ponovi mnogo puta je korištenje makro, koja se može zamisliti kao pseudo-naredba dizajnirana za ponovno prevođenje grupe naredbi koje se često pojavljuju u programu.

Makro, ili makro instrukciju, karakteriziraju tri aspekta: makro definicija, makro inverzija i makro proširenje.

makro definicija

Ovo je oznaka za redoslijed programskih komandi koji se ponavlja više puta, koji se koristi za reference u tekstu programa.

Makro ima sljedeću strukturu:

Lista izraza; makro definicija

Postoje tri dijela gornje strukture makro definicije:

● zaglavlje

makro koji sadrži ime

Pseudo-komanda

i skup parametara;

● tačkasta tijelo makro;

● tim

diplomiranje

makro definicije.

Skup makro parametara sadrži listu svih parametara datih u polju operanda za odabranu grupu instrukcija. Ako su ovi parametri dati ranije u programu, onda se mogu izostaviti u zaglavlju makro definicije.

Za ponovno sastavljanje odabrane grupe instrukcija koristi se poziv koji se sastoji od imena

popis makroa i parametara s drugim vrijednostima.

Kada asembler naiđe na makro definiciju tokom kompilacije, pohranjuje je u tablicu makro definicija. Uz naknadno pojavljivanje u programu imena (

) makroa, asembler ga zamjenjuje tijelom makroa.

Poziva se korištenje imena makroa kao koda operacije makro-preokret(makro poziv), i njegova zamjena tijelom makroa - makro ekspanzija.

Ako je program predstavljen kao niz znakova (slova, brojevi, razmaci, znakovi interpunkcije i znakovi za prelazak na novi red), tada se makro proširenje sastoji u zamjeni nekih nizova iz ovog niza drugim nizovima.

Makro proširenje se dešava tokom procesa sklapanja, a ne tokom izvršavanja programa. Dodijeljeni su načini za manipulaciju nizovima znakova makro alati.

Proces montaže se provodi u dva prolaza:

● Pri prvom prolazu, sve makro definicije se zadržavaju i makro pozivi se proširuju. U ovom slučaju, izvorni program se čita i pretvara u program u kojem su sve makro definicije uklonjene, a svaki poziv makroa je zamijenjen tijelom makroa;

● Drugi prolaz obrađuje primljeni program bez makroa.

Makroi sa parametrima.

Za rad s ponavljajućim nizovima naredbi, čiji parametri mogu poprimiti različite vrijednosti, date su makro definicije:

● sa stvarni parametri koji se postavljaju u operand polje poziva makroa;

● sa formalno parametri. Tokom proširenja makroa, svaki formalni parametar koji se pojavljuje u tijelu makroa zamjenjuje se odgovarajućim stvarnim parametrom.

korištenje makroa sa parametrima.

Program 1 prikazuje dvije slične sekvence naredbi, koje se razlikuju po tome što prva mijenja P i

I drugi

Program 2 uključuje makro sa dva formalna parametra P1 i P2. Tokom proširenja makroa, svaki znak P1 unutar tijela makroa zamjenjuje se prvim stvarnim parametrom (P,

), a simbol P2 zamjenjuje se drugim stvarnim parametrom (

) iz programa br. 1. U makro pozivu

program 2 je označen: P,

Prvi stvarni parametar,

Drugi stvarni parametar.

Program 1

Program 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Proširene mogućnosti.

Razmotrite neke napredne karakteristike jezika

Ako se makro koji sadrži instrukciju uslovnog grananja i oznaku na koju treba skočiti pozove dva ili više puta, oznaka će biti duplicirana (problem dupliranja oznake), što će uzrokovati grešku. Stoga, svakom pozivu je (od strane programera) dodijeljena posebna oznaka kao parametar. Na jeziku

oznaka je deklarirana kao lokalna (

) i zahvaljujući naprednim funkcijama, asembler automatski generiše drugu oznaku svaki put kada se makro proširi.

omogućava vam da definirate makroe unutar drugih makroa. Ova napredna funkcija je veoma korisna kada se kombinuje sa uslovnim povezivanjem programa. Razmislite

AKO VELIČINA RIJEČI GT 16 M2 MAKRO

Makro M2 se može definirati u oba dijela iskaza

Međutim, definicija zavisi od toga da li se program sastavlja na 16-bitnom ili 32-bitnom procesoru. Ako se M1 ne pozove, onda makro M2 uopće neće biti definiran.

Još jedna napredna karakteristika je da makroi mogu pozvati druge makroe, uključujući i sebe - rekurzivno poziv. U potonjem slučaju, kako bi izbjegao beskonačnu petlju, makro mora sebi proslijediti parametar, koji se mijenja sa svakim proširenjem, a također provjeriti ovaj parametar i završiti rekurziju kada parametar dostigne određenu vrijednost.

O upotrebi makroa u asembleru.

Kada se koriste makroi, asembler mora biti u stanju da izvrši dvije funkcije: sačuvajte makro definicije I proširite makro pozive.

Čuvanje makro definicija.

Svi nazivi makroa su pohranjeni u tabeli. Svako ime prati pokazivač na odgovarajući makro tako da se može pozvati ako je potrebno. Neki asembleri imaju zasebnu tabelu za imena makroa, drugi imaju zajedničku tabelu u kojoj se, uz imena makroa, nalaze sve mašinske komande i direktive.

Kada naiđete na makro tokom sastavljanja kreirano:

novi element tabele sa imenom makroa, brojem parametara i pokazivačem na drugu tabelu definicija makroa u kojoj će tijelo makroa biti pohranjeno;

● lista formalno parametri.

Tijelo makroa, koje je jednostavno niz znakova, se zatim čita i pohranjuje u tablicu definicija makroa. Formalni parametri koji se javljaju u tijelu petlje označeni su posebnim simbolom.

Interna reprezentacija makroa

iz gornjeg primjera za program 2 (str. 244) je:

MOV EAX, MOV EBX, MOV MOV &

pri čemu se tačka-zarez koristi kao znak za povratak, a ampersand & se koristi kao znak formalnog parametra.

Ekstenzija za makro pozive.

Kad god se naiđe na makro definiciju tokom sklapanja, ona se pohranjuje u tabeli makroa. Kada se pozove makro, asembler privremeno obustavlja čitanje ulaznih podataka sa ulaznog uređaja i počinje da čita sačuvano telo makroa. Formalni parametri izvučeni iz tijela makroa zamjenjuju se stvarnim parametrima i obezbjeđuju se pozivom. Ampersand & ispred parametara omogućava asembleru da ih prepozna.

Iako postoji mnogo verzija asemblera, procesi sastavljanja imaju zajedničke karakteristike i slični su na mnogo načina. Rad sastavljača sa dva prolaza razmatra se u nastavku.

Dvoprolazni asembler.

Program se sastoji od više operatera. Stoga se čini da se sljedeći slijed radnji može koristiti tokom montaže:

● prevesti na mašinski jezik;

● prenijeti primljeni mašinski kod u datoteku, a odgovarajući dio listinga - u drugu datoteku;

● ponavljajte gore navedene postupke dok se cijeli program ne emituje.

Međutim, ovaj pristup nije efikasan. Primjer je problem tzv vodeća veza. Ako je prva naredba skok na naredbu P na samom kraju programa, asembler je ne može prevesti. Prvo mora odrediti adresu operatera P, a za to je potrebno pročitati cijeli program. Poziva se svako potpuno čitanje originalnog programa prolaz. Hajde da pokažemo kako možemo riješiti problem naprijed reference koristeći dva prolaza:

na prvom prolazu skupiti i pohraniti sve definicije simbola (uključujući oznake) u tablicu, a na drugom prolazu pročitati i sastaviti svaki izraz. Ova metoda je relativno jednostavna, ali drugi prolazak kroz originalni program zahtijeva dodatno I/O vrijeme;

● na prvom prolazu, pretvoriti program u srednji oblik i snimite ga u tabelu, a drugi prolaz se izvodi ne prema originalnom programu, već prema tabeli. Ova metoda sastavljanja štedi vrijeme, jer se pri drugom prolazu ne izvode nikakve I/O operacije.

Prvi pas.

Svrha prvog prolaza- napraviti tablicu simbola. Kao što je gore navedeno, još jedan cilj prvog prolaza je spremanje svih makro definicija i proširenje poziva kako se pojave. Stoga se i definicija karaktera i makro proširenje dešavaju u istom prolazu. Simbol može biti bilo koji etiketa, ili značenje, kojem je dodijeljeno specifično ime korištenjem -you direktive:

;Vrijednost - veličina bafera

Dajući značenje simboličkim imenima u polju oznake instrukcije, asembler u suštini postavlja adrese koje će svaka instrukcija imati tokom izvršavanja programa. Da bi to uradio, asembler tokom procesa sastavljanja sprema brojač adresa instrukcija(

) kao posebna varijabla. Na početku prvog prolaza, vrijednost posebne varijable se postavlja na 0 i povećava nakon svake naredbe obrađene dužinom te naredbe. Kao primjer, u tabeli. 5.2.3 prikazuje fragment programa koji pokazuje dužinu naredbi i vrijednosti brojača. Tabele se generišu tokom prvog prolaza imena simbola, direktive I operativni kodovi, i ako je potrebno doslovno sto. Literal je konstanta za koju asembler automatski rezerviše memoriju. Odmah napominjemo da moderni procesori sadrže instrukcije s direktnim adresama, tako da njihovi asembleri ne podržavaju literale.

Tablica simbola

sadrži po jedan element za svako ime (tabela 5.2.4). Svaki unos u tablici simbola sadrži samo ime (ili pokazivač na njega), njegovu numeričku vrijednost, a ponekad i neke dodatne informacije, koje mogu uključivati:

● dužina polja podataka povezanog sa simbolom;

● bitovi za ponovno mapiranje memorije (koji pokazuju da li se vrijednost karaktera mijenja ako se program učita na različitoj adresi od one koju je asembler namjeravao);

● informacije o tome da li se simbolu može pristupiti izvan procedure.

Simbolična imena su oznake. Mogu se specificirati pomoću operatora (na primjer,

Tabela direktiva.

Ova tabela navodi sve direktive, ili pseudo-naredbe, koje se javljaju prilikom sastavljanja programa.

Tabela kodova operacija.

Za svaki operacijski kod, tabela ima zasebne kolone: ​​oznaku koda operacije, operand 1, operand 2, heksadecimalnu vrijednost koda operacije, dužinu instrukcije i tip instrukcije (Tablica 5.2.5). Kodovi operacija su podijeljeni u grupe ovisno o broju i vrsti operanda. Tip naredbe određuje broj grupe i specificira proceduru koja se poziva za obradu svih naredbi u toj grupi.

Drugi pas.

Svrha drugog prolaza- kreiranje objektnog programa i štampanje, po potrebi, montažnog protokola; izlazne informacije potrebne linkeru za povezivanje procedura koje su sastavljene u različito vrijeme u jednu izvršnu datoteku.

U drugom prolazu (kao i u prvom), redovi koji sadrže izjave se čitaju i obrađuju jedan za drugim. Originalni operator i izlaz izveden iz njega u heksadecimalnom obliku objekt kod se može ispisati ili spremiti u bafer za kasnije štampanje. Nakon resetiranja brojača adresa komande, poziva se sljedeći izraz.

Originalni program može sadržavati greške, na primjer:

dati simbol nije definiran ili definiran više od jednom;

● Opkod je predstavljen nevažećim imenom (zbog greške u kucanju), nema dovoljno operanada ili ima previše operanada;

● nema operatera

Neki asembleri mogu otkriti nedefinirani simbol i zamijeniti ga. Međutim, u većini slučajeva, kada se pronađe izjava sa greškom, asembler prikazuje poruku o grešci na ekranu i pokušava da nastavi proces sastavljanja.

Članci posvećeni asemblerskom jeziku.

Tema 1.4 Mnemonika asemblera. Struktura naredbi i formati. Vrste adresiranja. Set instrukcija za mikroprocesor

Plan:

1 Asemblerski jezik. Osnovni koncepti

2 Simboli asemblerskog jezika

3 Tipovi asemblerskih izjava

4 Direktive o skupštini

5 Set instrukcija za procesor

1 Iasemblerski jezik. Osnovni koncepti

asemblerski jezikje simbolički prikaz mašinskog jezika. Svi procesi u mašini na najnižem, hardverskom nivou pokreću se samo naredbama (uputstvima) mašinskog jezika. Iz ovoga je jasno da je, uprkos uobičajenom nazivu, asemblerski jezik za svaki tip računara različit.

Program na asembleru je zbirka blokova memorije tzv memorijski segmenti. Program se može sastojati od jednog ili više ovih blok-segmenata. Svaki segment sadrži kolekciju jezičkih rečenica, od kojih svaka zauzima zaseban red programskog koda.

Sastav izjave su četiri tipa:

1) komande ili uputstva koji su simbolični analogi mašinskih komandi. Tokom procesa prevođenja, instrukcije za sklapanje se pretvaraju u odgovarajuće komande mikroprocesorskog skupa instrukcija;

2) makroi -rečenice teksta programa, koje su na određeni način formalizovane, u toku emitovanja zamenjuju se drugim rečenicama;

3) direktive,koje su upute asemblerskom prevodiocu da izvrši neke radnje. Direktive nemaju pandan u predstavljanju mašina;

4) redovi komentara , koji sadrži bilo koje znakove, uključujući slova ruske abecede. Prevoditelj ignorira komentare.

­ Struktura skupštinskog programa. asemblerska sintaksa.

Rečenice koje čine program mogu biti sintaktička konstrukcija koja odgovara naredbi, makrou, direktivi ili komentaru. Da bi ih asemblerski prevodilac prepoznao, moraju se formirati prema određenim sintaksičkim pravilima. Da biste to učinili, najbolje je koristiti formalni opis sintakse jezika, poput pravila gramatike. Najčešći načini za opisivanje programskog jezika kao što je ovaj - sintaktički dijagrami I prošireni oblici Backus-Naur. Pogodnije za praktičnu upotrebu sintaktički dijagrami. Na primjer, sintaksa izjava asemblerskog jezika može se opisati korištenjem sintaksnih dijagrama prikazanih na sljedećim slikama 10, 11, 12.

Slika 10 – Format skupne rečenice


­ Slika 11 – Format direktiva

­ Slika 12 – Format komandi i makroa

Na ovim crtežima:

­ naziv oznake- identifikator čija je vrijednost adresa prvog bajta rečenice izvornog koda programa koji on označava;

­ ime -identifikator koji razlikuje ovu direktivu od drugih direktiva istog imena. Kao rezultat obrade određene direktive od strane asemblera, ovom imenu se mogu pripisati određene karakteristike;

­ operativni kod (COP) i direktiva - ovo su mnemonički simboli za odgovarajuću mašinsku instrukciju, makro instrukciju ili direktivu kompajlera;

­ operandi -dijelovi komande, makronaredbe ili asemblerske direktive, koji označavaju objekte na kojima se izvode radnje. Operandi asemblera opisuju se izrazima sa numeričkim i tekstualnim konstantama, oznakama varijabli i identifikatorima pomoću znakova operatora i nekih rezerviranih riječi.

Sintaktički dijagrami pomažu pronađite i zatim pređite putanju od ulaza dijagrama (lijevo) do njegovog izlaza (desno). Ako takav put postoji, onda je rečenica ili konstrukcija sintaktički ispravna. Ako takav put ne postoji, kompajler neće prihvatiti ovu konstrukciju.

­ 2 Simboli asemblerskog jezika

Dozvoljeni znakovi prilikom pisanja teksta programa su:

1) sva latinična slova: A-Z,a-z. U ovom slučaju, velika i mala slova se smatraju ekvivalentnim;

2) brojevi iz 0 prije 9 ;

3) znakovi ? , @ , $ , _ , & ;

4) separatori , . () < > { } + / * % ! " " ? = # ^ .

Asemblerske rečenice se formiraju od tokens, koji su sintaktički neodvojivi nizovi važećih jezičkih znakova koji imaju smisla za prevodioca.

tokens su:

1) identifikatori - nizovi važećih znakova koji se koriste za označavanje programskih objekata kao što su kodovi operacija, imena varijabli i imena oznaka. Pravilo za pisanje identifikatora je sljedeće: identifikator se može sastojati od jednog ili više znakova;

2) znakovni nizovi - sekvence znakova zatvorene u jednostruke ili dvostruke navodnike;

3) cijeli brojevi u jednom od sljedećih brojevnih sistema : binarni, decimalni, heksadecimalni. Identifikacija brojeva prilikom njihovog pisanja u asemblerske programe vrši se prema određenim pravilima:

4) decimalni brojevi ne zahtevaju nikakve dodatne simbole za svoju identifikaciju, na primer 25 ili 139. Za identifikaciju u izvornom kodu programa binarni brojevi potrebno je, nakon što upišete nule i jedinice koje su uključene u njihov sastav, staviti latinicu “ b“, na primjer 10010101 b.

5) heksadecimalni brojevi imaju više konvencija u svojoj notaciji:

Prvo, oni se sastoje od brojeva. 0...9 , mala i velika slova latinice a,b, c,d,e,f ili A,B,C,D,E,F.

Drugo, prevodilac može imati poteškoća u prepoznavanju heksadecimalnih brojeva zbog činjenice da se mogu sastojati i od cifara 0 ... 9 (na primjer, 190845) i početi slovom latinice (na primjer, ef15). Kako bi prevodiocu "objasnio" da data leksema nije decimalni broj ili identifikator, programer mora posebno dodijeliti heksadecimalni broj. Da biste to učinili, na kraju niza heksadecimalnih znamenki koje čine heksadecimalni broj napišite latinično slovo " h". Ovo je preduslov. Ako heksadecimalni broj počinje slovom, prethodi mu početna nula: 0 ef15 h.

Gotovo svaka rečenica sadrži opis predmeta na kojem se ili uz pomoć kojeg se izvodi neka radnja. Ovi objekti se nazivaju operandi. One se mogu definisati ovako: operandi- to su objekti (neke vrijednosti, registri ili memorijske ćelije) na koje utječu instrukcije ili direktive, ili su to objekti koji definiraju ili preciziraju djelovanje instrukcija ili direktiva.

Moguće je izvršiti sljedeću klasifikaciju operanada:

­ stalni ili neposredni operandi;

­ adresni operandi;

­ pomaknuti operandi;

brojač adresa;

­ registarski operand;

­ osnovni i indeksni operandi;

­ strukturni operandi;

evidencije.

Operandi su elementarne komponente koje čine dio mašinske instrukcije, označavajući objekte na kojima se operacija izvodi. U opštijem slučaju, operandi se mogu uključiti kao komponente u složenije formacije tzv izrazi.

Izrazi su kombinacije operanada i operatora koji se posmatraju kao cjelina. Rezultat evaluacije izraza može biti adresa neke memorijske ćelije ili neka konstantna (apsolutna) vrijednost.

­ 3 Tipovi asemblerskih izjava

Hajde da navedemo moguće vrste asemblerske izjave i sintaktička pravila za formiranje asemblerskih izraza:

­ aritmetički operatori;

­ operateri smjena;

­ operatori poređenja;

­ logički operatori;

­ indeksni operator;

­ operator nadjačavanja tipa;

­ operator redefiniranja segmenta;

­ operator imenovanja tipa strukture;

­ operator za dobijanje segmentne komponente adrese izraza;

­ izraz offset get operator.

1 Direktive skupštine

­ Smernice asemblera su:

1) Direktive o segmentaciji. U toku prethodne diskusije saznali smo sva osnovna pravila za pisanje instrukcija i operanda u programu asemblerskog jezika. Ostaje otvoreno pitanje kako pravilno formatirati niz naredbi tako da ih prevodilac može obraditi, a mikroprocesor izvršiti.

Razmatrajući arhitekturu mikroprocesora, saznali smo da on ima šest segmentnih registara preko kojih može raditi istovremeno:

­ sa jednim segmentom koda;

­ sa jednim segmentom steka;

­ sa jednim segmentom podataka;

­ sa tri dodatna segmenta podataka.

Fizički, segment je memorijsko područje koje zauzimaju naredbe i (ili) podaci čije se adrese izračunavaju u odnosu na vrijednost u odgovarajućem segmentnom registru. Sintaksički opis segmenta u asembleru je konstrukcija prikazana na slici 13:


­ Slika 13 - Sintaksički opis segmenta u asembleru

Važno je napomenuti da je funkcionalnost segmenta nešto šira od jednostavnog razbijanja programa na blokove koda, podataka i steka. Segmentacija je dio općenitijeg mehanizma koji se odnosi na koncept modularnog programiranja. Uključuje objedinjavanje dizajna objektnih modula kreiranih od strane kompajlera, uključujući i one iz različitih programskih jezika. Ovo vam omogućava da kombinujete programe napisane na različitim jezicima. Operandi u SEGMENT direktivi su namijenjeni implementaciji različitih opcija za takvu uniju.

2) Listing kontrolnih direktiva. Listing kontrolne direktive su podijeljene u sljedeće grupe:

­ opšte direktive o kontroli listinga;

­ izlazne direktive za uključivanje liste datoteka;

­ izlazne direktive za uslovne sklopove;

­ izlazne direktive za listu makroa;

­ direktive za prikazivanje informacija o unakrsnim referencama u listingu;

­ direktive za promjenu formata liste.

2 Set instrukcija za procesor

Skup instrukcija procesora prikazan je na slici 14.

Razmotrite glavne grupe naredbi.

­ Slika 14 - Klasifikacija uputa za montažu

Komande su:

1 Komande za prijenos podataka. Ove instrukcije zauzimaju veoma važno mesto u skupu instrukcija svakog procesora. Oni obavljaju sljedeće bitne funkcije:

­ čuvanje u memoriji sadržaja internih registara procesora;

­ kopiranje sadržaja iz jednog memorijskog područja u drugo;

­ pisanje na I/O uređaje i čitanje sa I/O uređaja.

U nekim procesorima, sve ove funkcije se izvode pomoću jedne instrukcije MOV (za prijenos bajtova - MOVB ) ali sa različitim metodama adresiranja operanda.

U drugim procesorima osim instrukcija MOV postoji još nekoliko naredbi za izvođenje navedenih funkcija. Naredbe za prijenos podataka također uključuju komande za razmjenu informacija (njihova oznaka je zasnovana na riječi Razmjena ). Možda je moguće obezbijediti razmjenu informacija između internih registara, između dvije polovine jednog registra ( SWAP ) ili između registra i memorijske lokacije.

2 Aritmetičke komande. Aritmetičke instrukcije tretiraju kodove operanda kao numeričke binarne ili BCD kodove. Ove naredbe se mogu podijeliti u pet glavnih grupa:

­ komande za operacije sa fiksnom tačkom (sabiranje, oduzimanje, množenje, deljenje);

­ instrukcije s pomičnim zarezom (sabiranje, oduzimanje, množenje, dijeljenje);

­ naredbe za čišćenje;

­ komande za povećanje i smanjenje;

­ komanda za poređenje.

3 Instrukcije sa fiksnom tačkom rade na kodovima u procesorskim registrima ili u memoriji kao što bi radile sa normalnim binarnim kodovima. Instrukcije s pomičnim zarezom (zarezom) koriste format predstavljanja brojeva sa eksponentom i mantisom (obično ovi brojevi zauzimaju dvije uzastopne memorijske lokacije). U modernim moćnim procesorima skup instrukcija s pomičnim zarezom nije ograničen samo na četiri aritmetičke operacije, već sadrži i mnoge druge složenije instrukcije, na primjer, izračunavanje trigonometrijskih funkcija, logaritamskih funkcija i složenih funkcija potrebnih za obradu zvuka i slike.

4 Clear komande su dizajnirane da upišu nulti kod u registar ili memorijsku ćeliju. Ove naredbe se mogu zamijeniti instrukcijama prijenosa s nultim kodom, ali posebne jasne instrukcije su obično brže od instrukcija za prijenos.

5 Naredbe za povećanje (povećavanje za jedan) i smanjenje

(smanjenje za jedan) su takođe veoma zgodne. U principu bi se mogle zamijeniti instrukcijama za dodavanje jedan ili oduzimanje jedan, ali povećanje i dekrement su brži od sabiranja i oduzimanja. Ove instrukcije zahtijevaju jedan ulazni operand koji je ujedno i izlazni operand.

6 Instrukcija za poređenje služi za poređenje dva ulazna operanda. U stvari, on izračunava razliku ova dva operanda, ali ne formira izlazni operand, već samo mijenja bitove u registru statusa procesora na osnovu rezultata ovog oduzimanja. Instrukcija koja slijedi nakon instrukcije za poređenje (obično instrukcija skoka) će raščlaniti bitove u registru statusa procesora i izvršiti akcije na osnovu njihovih vrijednosti. Neki procesori daju uputstva za lančano poređenje dva niza operanada u memoriji.

7 Logičke komande. Logičke instrukcije izvode logičke (bitove) operacije nad operandima, to jest, one ne smatraju kodove operanda kao jedan broj, već kao skup pojedinačnih bitova. Po tome se razlikuju od aritmetičkih naredbi. Logičke naredbe izvode sljedeće osnovne operacije:

­ logičko AND, logičko OR, zbrajanje po modulu 2 (XOR);

­ logičke, aritmetičke i ciklične pomake;

­ provjeravanje bitova i operanada;

­ postavljanje i brisanje bitova (zastavica) registra statusa procesora ( PSW).

Logičke instrukcije dozvoljavaju bit-po-bit računanje osnovnih logičkih funkcija iz dva ulazna operanda. Osim toga, operacija AND se koristi za prisilno brisanje specificiranih bitova (kao jedan od operanada, koristi se kod maske, u kojem su bitovi koji zahtijevaju brisanje postavljeni na nulu). Operacija OR se koristi za prisilno postavljanje specificiranih bitova (kao jedan od operanada, koristi se kod maske u kojem su bitovi koji zahtijevaju postavljanje na jedan jednaki jedan). Operacija XOR se koristi za invertiranje datih bitova (kao jedan od operanada, koristi se kod maske u kojem su bitovi koji se invertiraju postavljeni na jedan). Instrukcije zahtijevaju dva ulazna operanda i formiraju jedan izlazni operand.

8 Komande pomaka vam omogućavaju da pomjerite kod operanda bit po bit udesno (prema nižim bitovima) ili ulijevo (prema višim bitovima). Tip pomaka (logički, aritmetički ili ciklički) određuje kolika će biti nova vrijednost najznačajnijeg bita (pri pomicanju udesno) ili najmanje značajnog bita (pri pomicanju lijevo), a također određuje da li će biti stara vrijednost najznačajnijeg bita bit će biti pohranjen negdje (pri pomjeranju lijevo) ili najmanji bitni bit (kada se pomakne udesno). Rotacioni pomaci vam omogućavaju da pomerate bitove koda operanda u krug (u smeru kazaljke na satu kada se pomerate udesno ili suprotno od kazaljke na satu kada se pomerate ulevo). U ovom slučaju, prsten za prebacivanje može, ali i ne mora uključivati ​​zastavicu za nošenje. Bit oznake za nošenje (ako se koristi) postavljen je na najznačajniji bit za lijevo rotiranje i najmanji bit za rotaciju udesno. U skladu s tim, vrijednost bita zastavice prijenosa će biti prepisana na najmanji bitni bit pri lijevom cikličkom pomaku i na najznačajniji bit pri desnom cikličkom pomaku.

9 Komande za skok. Komande za skok su dizajnirane da organizuju sve vrste petlji, grananja, poziva potprograma, itd., odnosno ometaju sekvencijalni tok programa. Ove instrukcije pišu novu vrijednost u registar brojača instrukcija i time uzrokuju da procesor ne skoči na sljedeću instrukciju po redu, već na bilo koju drugu instrukciju u programskoj memoriji. Neke komande za skok vam omogućavaju da se vratite na tačku sa koje je napravljen skok, dok druge ne. Ako je omogućen povratak, tada se trenutni parametri procesora pohranjuju na stog. Ako nema povrata, tada se trenutni parametri procesora ne pohranjuju.

Naredbe za skok bez vraćanja unatrag podijeljene su u dvije grupe:

­ komande bezuslovnih skokova;

­ instrukcije za uslovni skok.

Ove naredbe koriste riječi Grana (grana) i Skok (skok).

Instrukcije bezuvjetnog skoka uzrokuju skok na novu adresu bez obzira na sve. Oni mogu uzrokovati skok na specificiranu vrijednost pomaka (naprijed ili unazad) ili na navedenu memorijsku adresu. Vrijednost pomaka ili vrijednost nove adrese je specificirana kao ulazni operand.

Uvjetne naredbe za skok ne uzrokuju uvijek skok, već samo kada su ispunjeni navedeni uvjeti. Takvi uslovi su obično vrednosti zastavica u registru statusa procesora ( PSW ). Odnosno, uvjet prijelaza je rezultat prethodne operacije koja mijenja vrijednosti zastavica. Ukupno može postojati od 4 do 16 takvih uslova za skok. Neki primjeri naredbi za uslovni skok:

­ skok ako je jednak nuli;

­ skok ako nije nula;

­ skok ako postoji prelivanje;

­ skok ako nema prelivanja;

­ skok ako je veći od nule;

­ skok ako je manji ili jednak nuli.

Ako je uvjet prijelaza ispunjen, tada se nova vrijednost učitava u registar brojača instrukcija. Ako uslov skoka nije ispunjen, brojač instrukcija se jednostavno povećava, a procesor bira i izvršava sljedeću instrukciju u nizu.

Konkretno za provjeru uslova grananja, koristi se instrukcija za poređenje (CMP) koja prethodi instrukciji uslovnog skoka (ili čak nekoliko instrukcija uslovnog skoka). Ali zastavice se mogu postaviti bilo kojom drugom komandom, kao što je naredba za prijenos podataka, bilo koja aritmetička ili logička naredba. Imajte na umu da same naredbe za skok ne mijenjaju zastavice, što vam samo omogućava da stavite nekoliko naredbi za skok jednu za drugom.

Naredbe za prekid zauzimaju posebno mjesto među komandama za skok sa povratkom. Ove upute zahtijevaju broj prekida (vektorsku adresu) kao ulazni operand.

Izlaz:

Asemblerski jezik je simbolički prikaz mašinskog jezika. Asemblerski jezik za svaki tip računara je drugačiji. Program asemblerskog jezika je zbirka blokova memorije koji se nazivaju memorijski segmenti. Svaki segment sadrži kolekciju jezičkih rečenica, od kojih svaka zauzima zaseban red programskog koda. Naredbe asemblera su četiri tipa: naredbe ili instrukcije, makroi, direktive, redovi komentara.

Važeći znakovi prilikom pisanja teksta programa su sva latinična slova: A-Z,a-z. U ovom slučaju, velika i mala slova se smatraju ekvivalentnim; figure iz 0 prije 9 ; znakovi ? , @ , $ , _ , & ; separatori , . () < > { } + / * % ! " " ? = # ^ .

Primjenjuju se sljedeće vrste asemblerskih izraza i pravila sintakse za formiranje asemblerskih izraza. aritmetički operatori, operatori pomaka, operatori poređenja, logički operatori, indeksni operator, operator redefiniranja tipa, operator redefiniranja segmenta, operator imenovanja tipa strukture, operator dobivanja komponente segmenta adrese adrese, operator dobivanja pomaka izraza.

Komandni sistem je podijeljen u 8 glavnih grupa.

­ Test pitanja:

1 Šta je asemblerski jezik?

2 Koji se simboli mogu koristiti za pisanje naredbi u asembleru?

3 Šta su etikete i koja je njihova svrha?

4 Objasnite strukturu uputa za sastavljanje.

5 Navedite 4 tipa asemblerskih izjava.

Struktura instrukcija asemblerskog jezika Programiranje na nivou mašinskih instrukcija je minimalni nivo na kojem je moguće kompjutersko programiranje. Sistem mašinskih instrukcija mora biti dovoljan da sprovede tražene radnje izdavanjem instrukcija hardveru mašine. Svaka mašinska instrukcija sastoji se od dva dela: operativnog dela koji definiše „šta treba da se radi“ i operanda koji definiše objekte obrade, odnosno „šta da se radi“. Mašinska instrukcija mikroprocesora, napisana u asemblerskom jeziku, je jedna linija, koja ima sljedeći oblik: oznaka instrukcija/operand(i) direktive; komentari Oznaka, naredba/direktiva i operand su odvojeni barem jednim znakom razmaka ili tabulatora. Operandi instrukcija su odvojeni zarezima.

Struktura instrukcije asemblerskog jezika Instrukcija asemblerskog jezika govori kompajleru koju akciju mikroprocesor treba da izvede. Direktive asemblera su parametri navedeni u tekstu programa koji utječu na proces sklapanja ili svojstva izlazne datoteke. Operand specificira početnu vrijednost podataka (u segmentu podataka) ili elemenata na koje treba djelovati naredbom (u segmentu koda). Instrukcija može imati jedan ili dva operanda, ili bez operanda. Broj operanada je implicitno određen kodom instrukcije. Ako naredbu ili direktivu treba nastaviti u sljedećem redu, tada se koristi obrnuta kosa crta: "" . Po defaultu, asembler ne pravi razliku između velikih i malih slova u naredbama i direktivama. Primjeri direktiva i naredbi Count db 1 ; Ime, direktiva, jedan operand mov eax, 0 ; Komanda, dva operanda

Identifikatori su nizovi važećih znakova koji se koriste za označavanje imena varijabli i naziva oznaka. Identifikator se može sastojati od jednog ili više od sljedećih znakova: sva slova latinice; brojevi od 0 do 9; specijalni znakovi: _, @, $, ? . Tačka se može koristiti kao prvi znak oznake. Rezervirana imena asemblera (direktive, operatori, imena naredbi) ne mogu se koristiti kao identifikatori. Prvi znak identifikatora mora biti slovo ili poseban znak. Maksimalna dužina identifikatora je 255 karaktera, ali prevodilac prihvata prva 32 znaka i ignoriše ostale. Sve oznake koje su napisane na liniji koja ne sadrži asemblersku direktivu moraju završavati dvotočkom ":". Oznaka, naredba (direktiva) i operand ne moraju početi na bilo kojoj određenoj poziciji u nizu. Preporučuje se da ih upišete u kolonu radi veće čitljivosti programa.

Oznake Sve oznake koje su napisane na liniji koja ne sadrži asemblersku direktivu moraju završavati dvotočkom ":". Oznaka, naredba (direktiva) i operand ne moraju početi na bilo kojoj određenoj poziciji u nizu. Preporučuje se da ih upišete u kolonu radi veće čitljivosti programa.

Komentari Upotreba komentara u programu poboljšava njegovu jasnoću, posebno kada je svrha skupa instrukcija nejasna. Komentari počinju na bilo kojoj liniji izvornog modula tačkom i zarezom (;). Svi znakovi desno od "; ' na kraju reda su komentari. Komentar može sadržavati bilo koje znakove za ispis, uključujući "razmak". Komentar može obuhvatiti cijeli red ili slijediti naredbu u istom redu.

Struktura programa asemblerskog jezika Program asemblerskog jezika može biti sastavljen od nekoliko dijelova, nazvanih moduli, od kojih svaki može definirati jedan ili više podataka, steka i segmenata koda. Svaki kompletan program asemblerskog jezika mora sadržavati jedan glavni ili glavni modul od kojeg počinje njegovo izvršavanje. Modul može sadržavati segmente programa, podataka i steka deklarirane s odgovarajućim direktivama.

Memorijski modeli Prije deklariranja segmenata, morate specificirati memorijski model pomoću direktive. MODEL modifikator memory_model, calling_convention, OS_type, stack_parameter Osnovni memorijski modeli asemblerskog jezika: Memorijski model Adresiranje koda Adresiranje podataka Operativni sistem Preplitanje koda i podataka MALI BLIZU MS-DOS-a Važi MALE BLIZU MS-DOS-a, Windows Ne SREDNJE DALEKO BLIZU MS-DOS-a, Windows Ne KOMPAKTNI BLIZU DALEKOG MS-DOS-a, Windows Ne VELIKI DALEKI MS-DOS, Windows Ne OGROMNO DALEKO MS-DOS, Windows Ne U BLIZINI Windows 2000, Windows XP, Windows Valid FLAT BLIZU NT,

Memorijski modeli Mali model radi samo u 16-bitnim MS-DOS aplikacijama. U ovom modelu, svi podaci i kod se nalaze u jednom fizičkom segmentu. Veličina programske datoteke u ovom slučaju ne prelazi 64 KB. Mali model podržava jedan segment koda i jedan segment podataka. Podaci i kod kada se koristi ovaj model se adresiraju kao blizu (blizu). Srednji model podržava više segmenata koda i jedan segment podataka, pri čemu se sve veze u segmentima koda podrazumevano smatraju daleko, a veze u segmentu podataka su blizu (blizu). Kompaktni model podržava više segmenata podataka koji koriste udaljeno adresiranje podataka (daleko) i jedan segment koda koji koristi adresiranje blizu podataka (blizu). Veliki model podržava više segmenata koda i više segmenata podataka. Po defaultu, sve reference koda i podataka se smatraju daleko. Ogroman model je skoro ekvivalentan modelu velike memorije.

Modeli memorije Ravni model pretpostavlja nesegmentiranu programsku konfiguraciju i koristi se samo na 32-bitnim operativnim sistemima. Ovaj model je sličan malom modelu po tome što se podaci i kod nalaze u istom 32-bitnom segmentu. Razviti program za ravni model prije direktive. model flat treba postaviti jednu od direktiva: . 386, . 486, . 586 ili. 686. Izbor direktive za odabir procesora određuje skup komandi dostupnih prilikom pisanja programa. Slovo p iza direktive o odabiru procesora označava zaštićeni način rada. Adresiranje podataka i kodova je blizu, sa svim adresama i pokazivačima koji su 32-bitni.

memorijski modeli. MODEL modifikator memory_model, calling_convention, OS_type, stack_parameter Parametar modifikatora se koristi za definiranje tipova segmenata i može imati sljedeće vrijednosti: koristiti 16 (segmenti odabranog modela se koriste kao 16-bitni) koristiti 32 (koriste se segmenti odabranog modela kao 32-bitni). Parametar calling_convention se koristi za određivanje načina na koji se parametri prosljeđuju prilikom pozivanja procedure iz drugih jezika, uključujući jezike visokog nivoa (C++, Pascal). Parametar može imati sljedeće vrijednosti: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

memorijski modeli. MODEL modifikator memory_model, calling_convention, OS_type, stack_parameter Parametar OS_type je OS_DOS po defaultu i trenutno je jedina podržana vrijednost za ovaj parametar. Parametar stack_param je postavljen na: NEARSTACK (SS registar je jednak DS, regioni podataka i steka se nalaze u istom fizičkom segmentu) FARSTACK (SS registar nije jednak DS, regioni podataka i steka se nalaze u različitim fizičkim segmentima). Zadana vrijednost je NEARSTACK.

Primjer programa "ne radi ništa". 686 P. MODEL STAN, STDCALL. PODACI. KOD START: RET END START RET - komanda mikroprocesora. Osigurava ispravan završetak programa. Ostatak programa vezan je za rad prevodioca. . 686 P - Pentium 6 (Pentium II) zaštićeni način naredbe su dozvoljene. Ova direktiva bira podržani skup instrukcija asemblera specificirajući model procesora. . MODEL FLAT, stdcall - model ravni memorije. Ovaj model memorije se koristi u operativnom sistemu Windows. stdcall je konvencija pozivanja procedure za korištenje.

Primjer programa "ne radi ništa". 686 P. MODEL STAN, STDCALL. PODACI. KOD POČETAK: PONAVLJANJE KRAJ POČETAK . DATA - segment programa koji sadrži podatke. Ovaj program ne koristi stek, pa segmentirajte. STACK nedostaje. . KOD - segment programa koji sadrži kod. START - oznaka. END START - kraj programa i poruka kompajleru da se program mora pokrenuti sa oznake START. Svaki program mora sadržavati END direktivu koja označava kraj izvornog koda programa. Svi redovi koji slijede END direktivu se zanemaruju.Oznaka iza direktive END govori kompajleru ime glavnog modula od kojeg počinje izvršavanje programa. Ako program sadrži jedan modul, oznaka nakon direktive END može biti izostavljena.

Prevodioci asemblerskog jezika Prevodilac je program ili hardver koji pretvara program predstavljen na jednom od programskih jezika u program na ciljnom jeziku, koji se naziva objektni kod. Uz podršku mnemonike strojnih instrukcija, svaki kompajler ima svoj vlastiti skup direktiva i makroa, često nekompatibilnih s bilo čim drugim. Glavni tipovi prevodilaca asemblerskog jezika su: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - slobodno distribuirani višeprolazni asembler koji je napisao Tomasz Gryshtar (poljski), NASM (Netwide Assembler) - a besplatni asembler za Intel x arhitekturu 86 kreirao je Simon Tatham sa Julian Hallom i trenutno ga razvija mali razvojni tim u Source. Kovačnica. net.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="(!LANG:Prevod programa u Microsoft Visual Studio 2005 1) Kreirajte projekat odabirom Datoteka->Novo->Projekat meni I"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="(!LANG:Prevod programa u Microsoft Visual Studio 2005 2) U stablo projekta (View->Solution Explorer) dodajte"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Prevod programa u Microsoft Visual Studio 2005 3) Odaberite tip datoteke Code C++, ali navedite ime sa ekstenzijom. asm:

Prevod programa u Microsoft Visual Studio 2005 5) Podesite opcije kompajlera. Odaberite na desnom dugmetu u meniju datoteke projekta Custom Build Rules…

Prevod programa u Microsoft Visual Studio 2005 i u prozoru koji se pojavi izaberite Microsoft Macro Assembler.

Prevod programa u Microsoft Visual Studio 2005 Provjerite desnim gumbom u datoteci hello. asm stabla projekta iz menija Properties i postavite General->Tool: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="(!LANG:Prevod programa u Microsoft Visual Studio 2005 6) Kompilirajte datoteku odabirom Build->Build hello.prj ."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Programiranje u OS Windows Programiranje u OS Windows bazira se na korištenju API funkcija (Application Program Interface, tj. interfejs softverske aplikacije). Njihov broj dostiže 2000. Program za Windows uglavnom se sastoji od takvih poziva. Sva interakcija sa eksternim uređajima i resursima operativnog sistema odvija se po pravilu kroz takve funkcije. Operativni sistem Windows koristi model ravne memorije. Adresa bilo koje memorijske lokacije će biti određena sadržajem jednog 32-bitnog registra. Postoje 3 vrste programskih struktura za Windows: dijalog (glavni prozor je dijalog), konzolna ili struktura bez prozora, klasična struktura (prozor, okvir).

Pozivanje Windows API funkcija U datoteci pomoći, bilo koja API funkcija je predstavljena kao tip function_name (FA 1, FA 2, FA 3) Tip – tip vraćanja vrijednosti; FAX – lista formalnih argumenata po njihovom redoslijedu, na primjer, int Poruka. Kutija (HWND h. Wnd, LPCTSTR lp. Tekst, LPCTSTR lp. Naslov, UINT u. Tip); Ova funkcija prikazuje prozor sa porukom i dugme(ima) za izlaz. Značenje parametara: h. Wnd - ručka za prozor u kojem će se pojaviti prozor poruke, lp. Tekst - tekst koji će se pojaviti u prozoru, lp. Naslov - tekst u naslovu prozora, u. Tip - tip prozora, posebno možete odrediti broj izlaznih dugmadi.

Pozivanje Windows API funkcija int Message. Kutija (HWND h. Wnd, LPCTSTR lp. Tekst, LPCTSTR lp. Naslov, UINT u. Tip); Gotovo svi parametri API funkcije su zapravo 32-bitni cijeli brojevi: HWND je 32-bitni cijeli broj, LPCTSTR je 32-bitni string pokazivač, UINT je 32-bitni cijeli broj. Sufiks "A" se često dodaje imenu funkcija za prelazak na novije verzije funkcija.

Pozivanje Windows API funkcija int Message. Kutija (HWND h. Wnd, LPCTSTR lp. Tekst, LPCTSTR lp. Naslov, UINT u. Tip); Kada koristite MASM, morate dodati @N N na kraju imena - broj bajtova koje proslijeđeni argumenti zauzimaju na steku. Za Win 32 API funkcije, ovaj broj se može definirati kao broj argumenata n puta 4 (bajtova u svakom argumentu): N=4*n. Za pozivanje funkcije koristi se CALL instrukcija asemblera. U ovom slučaju, svi argumenti funkciji se prosljeđuju preko steka (PUSH naredba). Smjer prenošenja argumenta: LIJEVO NA DESNO - DOLJE GORE. Argument u će biti prvi gurnut na stek. tip. Pozivanje navedene funkcije će izgledati ovako: CALL Poruka. kutija. [email protected]

Pozivanje Windows API funkcija int Message. Kutija (HWND h. Wnd, LPCTSTR lp. Tekst, LPCTSTR lp. Naslov, UINT u. Tip); Rezultat izvršavanja bilo koje API funkcije je obično cijeli broj, koji se vraća u EAX registru. OFFSET direktiva je "pomak segmenta" ili, u terminima jezika visokog nivoa, "pokazivač" na početak niza. Direktiva EQU, poput #define u C-u, definira konstantu. Direktiva EXTERN govori kompajleru da je funkcija ili identifikator vanjski modulu.

Primjer programa "Zdravo svima!" . 686 P. MODEL STAN, STDCALL. STACK 4096. PODACI MB_OK EQU 0 STR 1 DB "Moj prvi program", 0 STR 2 DB "Zdravo svima!", 0 HW DD ? EKSTERNA poruka. kutija. [email protected]: NEAR. KOD START: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Poruka. kutija. [email protected] PONOVNO KRAJ POČETAK

Direktiva INVOKE Prevoditelj jezika MASM također omogućava pojednostavljenje poziva funkcije pomoću makro alata - direktive INVOKE: funkcija INVOKE, parametar1, parametar2, ... Nema potrebe za dodavanjem @16 pozivu funkcije; parametri su zapisani tačno onim redom kojim su dati u opisu funkcije. makroi prevodioca guraju parametre na stog. da biste koristili direktivu INVOKE, morate imati opis prototipa funkcije koristeći PROTO direktivu u obliku: Poruka. kutija. A PROTO: DWORD, : DWORD

Rad na kursu

Tema "Sistemsko programiranje"

Tema broj 4: "Rješavanje problema za procedure"

Opcija 2

ISTOČNOSIBIRSKI DRŽAVNI UNIVERZITET

TEHNOLOGIJA I MENADŽMENT

____________________________________________________________________

TEHNOLOŠKI VIŠE

ZADATAK

za seminarski rad

disciplina:
Tema: Rješavanje problema za procedure
Umjetnik(i): Glavinskaya Arina Alexandrovna
Rukovodilac: Sesegma Viktorovna Dambaeva
Kratak sažetak rada: proučavanje potprograma u asemblerskom jeziku,
rješavanje problema korištenjem potprograma
1. Teorijski dio: Osnovne informacije o asemblerskom jeziku (set
komande itd.), Organizacija potprograma, Načini prolaska parametara
u potprogramima
2. Praktični dio: Razvijte dvije potprograme, od kojih jedna konvertuje bilo koje dato slovo u velika (uključujući i ruska slova), a druga pretvara slovo u mala.
pretvara bilo koje dato slovo u veliko, a drugo slovo pretvara u mala.
pretvara slovo u mala slova.
Termini projekta prema rasporedu:
1. Teoretski dio - 30% do 7. sedmice.
2. Praktični dio - 70% do 11 sedmica.
3. Zaštita - 100% do 14 sedmica.
Zahtjevi dizajna:
1. Nagodbu i objašnjenje projekta kursa potrebno je dostaviti
elektronske i štampane kopije.
2. Obim izvještaja mora biti najmanje 20 kucanih stranica, isključujući anekse.
3. RPP je sastavljen u skladu sa GOST 7.32-91 i potpisan od strane rukovodioca.

Šef posla __________________

Izvođač __________________

Datum izdavanja " 26 " septembra 2017 G.


Uvod. 2

1.1 Osnovne informacije o asemblerskom jeziku. 3

1.1.1 Skup komandi. 4

1.2 Organizacija potprograma u asemblerskom jeziku. 4

1.3 Metode za prosljeđivanje parametara u potprogramima. 6

1.3.1 Prolazak parametara kroz registre.. 6

1.3.2 Prenošenje parametara kroz stek. 7

2 PRAKTIČNI DIO.. 9

2.1 Izjava o problemu. devet

2.2 Opis rješenja problema. devet

2.3 Testiranje programa.. 7

Zaključak. 8

Reference.. 9


Uvod

Dobro je poznato da je programiranje na asemblerskom jeziku teško. Kao što znate, sada postoji mnogo različitih jezika visoki nivo, koji vam omogućavaju da uložite mnogo manje truda prilikom pisanja programa. Naravno, postavlja se pitanje kada će programer možda morati da koristi Assembler prilikom pisanja programa. Trenutno postoje dvije oblasti u kojima je upotreba asemblerskog jezika opravdana, a često i neophodna.

Prvo, to su takozvani sistemski programi ovisni o mašini, oni obično upravljaju različitim računarskim uređajima (takvi programi se nazivaju drajveri). Ovi sistemski programi koriste posebne mašinske instrukcije koje se ne moraju koristiti u običnom (ili, kako kažu, primijenjen) programe. Ove komande je nemoguće ili je veoma teško navesti na jeziku visokog nivoa.

Drugo područje primjene Assemblera odnosi se na optimizaciju izvođenja programa. Vrlo često, prevodilački programi (kompajlatori) sa jezika visokog nivoa proizvode vrlo neefikasan program strojnog jezika. Ovo se obično odnosi na programe računske prirode, u kojima se većinu vremena izvršava vrlo mali (oko 3-5%) dio programa (glavna petlja). Za rješavanje ovog problema mogu se koristiti takozvani višejezični sistemi programiranja koji vam omogućavaju pisanje dijelova programa na različitim jezicima. Obično je glavni dio programa napisan u programskom jeziku visokog nivoa (Fortran, Pascal, C, itd.), a vremenski kritični dijelovi programa napisani su u Assembleru. U ovom slučaju, brzina cijelog programa može se značajno povećati. Ovo je često jedini način da program dobije rezultate u razumnom vremenu.

Svrha ovog kursa je sticanje praktičnih vještina programiranja na asemblerskom jeziku.

Radni zadaci:

1. Proučiti osnovne informacije o asembler jeziku (struktura i komponente programa u asembleru, format komandi, organizacija potprograma, itd.);

2. Proučiti vrste bitnih operacija, format i logiku asemblerskih logičkih naredbi;

3. Rešiti pojedinačni problem za korišćenje potprograma u Assembleru;

4.. Formulirajte zaključak o obavljenom poslu.

1 TEORIJSKI DEO

Osnove asemblerskog jezika

Asembler je programski jezik niskog nivoa koji je format za pisanje mašinskih instrukcija koji je pogodan za ljudsku percepciju.

Komande asemblerskog jezika odgovaraju jedan prema jedan komandama procesora i, u stvari, predstavljaju pogodan simbolički oblik notacije (mnemonički kod) komandi i njihovih argumenata. Asemblerski jezik takođe pruža osnovne apstrakcije programiranja: povezivanje delova programa i podataka preko oznaka sa simboličkim imenima i direktivama.

Direktiva asemblera vam omogućava da u program uključite blokove podataka (eksplicitno opisanih ili pročitanih iz datoteke); ponoviti određeni fragment određeni broj puta; kompajlirajte fragment prema uslovu; postavite adresu za izvršavanje fragmenta, promijenite vrijednosti oznaka tokom kompilacije; koristiti makro definicije sa parametrima itd.

Prednosti i nedostaci

Minimalna količina redundantnog koda (upotreba manjeg broja komandi i pristupa memoriji). Kao posljedica - veća brzina i manja veličina programa;

velike količine koda, veliki broj dodatnih malih zadataka;

Loša čitljivost koda, poteškoće u podršci (otklanjanje grešaka, dodavanje funkcija);

· teškoća implementacije programskih paradigmi i bilo kojih drugih donekle složenih konvencija, složenost zajedničkog razvoja;

Manje dostupnih biblioteka, njihova niska kompatibilnost;

· direktan pristup hardveru: ulazno-izlazni portovi, specijalni registri procesora;

maksimalno "prilagođavanje" željenoj platformi (upotreba posebnih uputstava, tehničke karakteristike "pegle");

· neprenosivost na druge platforme (osim binarno kompatibilnih).

Osim instrukcija, program može sadržavati direktive: naredbe koje se ne prevode direktno u strojne instrukcije, ali kontroliraju rad kompajlera. Njihov skup i sintaksa značajno variraju i ne zavise od hardverske platforme, već od kompajlera koji se koristi (što dovodi do dijalekta jezika unutar iste porodice arhitektura). Kao skup direktiva možemo razlikovati:

Definicija podataka (konstante i varijable);

upravljanje organizacijom programa u memoriji i parametrima izlazne datoteke;

podešavanje načina rada kompajlera;

· sve vrste apstrakcija (tj. elemenata jezika visokog nivoa) - od dizajna procedura i funkcija (da bi se pojednostavila implementacija paradigme proceduralnog programiranja) do uslovnih struktura i petlji (za paradigmu strukturalnog programiranja);

macros.

Skup komandi

Tipične upute asemblerskog jezika su:

Komande za prijenos podataka (mov, itd.)

Aritmetičke naredbe (add, sub, imul, itd.)

Logičke i bitne operacije (ili, i, xor, shr, itd.)

Komande za upravljanje izvršavanjem programa (jmp, loop, ret, itd.)

Komande za prekid poziva (ponekad se nazivaju i kontrolne komande): int

I/O komande za portove (ulaz, izlaz)

Mikrokontrolere i mikroračunare također karakteriziraju naredbe koje izvode provjere i prelaze prema uvjetima, na primjer:

· jne - skok ako nije jednak;

· jge - skok ako je veći ili jednak .

Top Related Articles