Monteringsspråk instruktioner. Sammanfattning: Plan: Förord

NATIONELLA UNIVERSITETET I UZBEKISTAN UPPGIFT EFTER MIRZO ULUGBEK

DATORTEKNISK FAKULTET

Om ämnet: Semantisk analys av en EXE-fil.

Avslutad:

Tasjkent 2003.

Förord.

Monteringsspråk och instruktionsstruktur.

EXE-filstruktur (semantisk analys).

Strukturen för en COM-fil.

Hur viruset fungerar och sprider sig.

Demonterare.

Program.

Förord

Yrket som programmerare är fantastiskt och unikt. I vår tid kan vetenskap och liv inte föreställas utan senaste teknologin. Allt som är kopplat till mänsklig aktivitet är inte komplett utan datorteknik. Och detta bidrar till dess höga utveckling och perfektion. Även om utvecklingen av persondatorer började för inte så länge sedan, men under denna tid togs kolossala steg i mjukvaruprodukter och mer. länge sedan dessa produkter kommer att användas i stor utsträckning. Området datorrelaterad kunskap har exploderat, liksom den relaterade tekniken. Om vi ​​inte tar hänsyn till den kommersiella sidan, så kan vi säga att främlingar i detta område yrkesverksamhet Nej. Många är engagerade i utvecklingen av program, inte för vinst eller inkomst, utan av egen fri vilja, av passion. Detta ska givetvis inte påverka kvaliteten på programmet och i den här branschen finns det så att säga konkurrens och efterfrågan på kvalitetsprestationer, på stabilt arbete och att uppfylla vår tids alla krav. Det är också värt att notera här utseendet på mikroprocessorer på 60-talet, som kom att ersätta ett stort antal uppsättningar lampor. Det finns vissa varianter av mikroprocessorer som skiljer sig mycket från varandra. Dessa mikroprocessorer skiljer sig från varandra när det gäller bitkapacitet och inbyggda systemkommandon. De vanligaste är: Intel, IBM, Celeron, AMD, etc. Alla dessa processorer är relaterade till den avancerade arkitekturen hos Intel-processorer. Spridningen av mikrodatorer har orsakat ett omtänkande av assemblerspråk av två huvudsakliga skäl. För det första kräver program skrivna i assemblerspråk betydligt mindre minne och körtid. För det andra ger kunskap om assemblerspråket och den resulterande maskinkoden en förståelse för maskinarkitekturen, vilket knappast ges när man arbetar på ett högnivåspråk. Även om de flesta mjukvaruproffs utvecklar på högnivåspråk som Pascal, C eller Delphi, vilket är lättare att skriva program, är den mest kraftfulla och effektiva programvara helt eller delvis skriven på samlingsspråk. Språk på hög nivå har utformats för att undvika speciella tekniska funktioner specifika datorer. Och assemblerspråket är i sin tur designat för processorns specifika detaljer. För att kunna skriva ett assemblerprogram för en viss dator måste man därför känna till dess arkitektur. Numera utsikten över huvudet mjukvaruproduktär en EXE-fil. Med tanke på de positiva aspekterna av detta kan författaren till programmet vara säker på dess okränkbarhet. Men ofta är detta långt ifrån fallet. Det finns även en demonteringsmaskin. Med hjälp av en demonterare kan du ta reda på avbrott och programkoder. Det kommer inte att vara svårt för en person som är väl insatt i assembler att göra om hela programmet efter sin smak. Det är kanske här det mest olösliga problemet kommer ifrån - viruset. Varför skriver folk ett virus? Vissa ställer den här frågan med förvåning, andra med ilska, men ändå finns det fortfarande människor som är intresserade av den här uppgiften, inte ur synvinkeln att orsaka någon skada, utan som ett intresse för systemprogrammering. Virus skrivs av olika anledningar. Vissa gillar systemanrop, andra förbättrar sina kunskaper i assembler. Jag ska försöka förklara allt detta i min terminsuppsats. Den säger också inte bara om strukturen för EXE-filen, utan också om assemblerspråket.

^ Församlingsspråk.

Det är intressant att följa, från tidpunkten för uppkomsten av de första datorerna och slutar med dagens, omvandlingen av idéer om sammansättningsspråk bland programmerare.

En gång i tiden var assembler ett språk utan att veta vilket det var omöjligt att få en dator att göra något användbart. Gradvis förändrades situationen. Mer bekväma sätt att kommunicera med en dator dök upp. Men, till skillnad från andra språk, dog assembler inte, dessutom kunde han inte göra detta i princip. Varför? På jakt efter ett svar kommer vi att försöka förstå vad assemblerspråk är i allmänhet.

Sammanfattningsvis är assemblerspråk en symbolisk representation av maskinspråk. Alla processer i maskinen på den lägsta hårdvarunivån drivs endast av kommandon (instruktioner) från maskinspråket. Av detta är det tydligt att, trots det vanliga namnet, är assemblerspråket för varje typ av dator olika. Detta gäller också utseende program skrivna i assembler, och de idéer som detta språk är en återspegling av.

Det är omöjligt att verkligen lösa hårdvarurelaterade problem (eller till och med, dessutom hårdvarurelaterade, som att förbättra ett programs hastighet), utan kunskap om assembler.

En programmerare eller någon annan användare kan använda alla verktyg på hög nivå, upp till program för att bygga virtuella världar, och kanske inte ens misstänka att datorn faktiskt inte utför kommandona för det språk som programmet är skrivet på, utan deras transformerad representation i form av en tråkig och tråkig sekvens av kommandon av ett helt annat språk - maskinspråk. Låt oss nu föreställa oss att en sådan användare har ett icke-standardproblem eller bara att något gick fel. Till exempel måste hans program fungera med någon ovanlig enhet eller utföra andra åtgärder som kräver kunskap om principerna för datorhårdvara. Oavsett hur smart en programmerare är, hur bra språk han än skrev sitt underbara program på, kan han inte klara sig utan kunskap om assembler. Och det är ingen slump att nästan alla kompilatorer av högnivåspråk innehåller sätt att koppla ihop sina moduler med moduler i assembler eller stödja åtkomst till assembler-programmeringsnivån.

Datavagnarnas tid är förstås redan förbi. Som ordspråket säger, du kan inte omfamna det oerhörda. Men det finns något gemensamt, en sorts grund som all seriös datautbildning bygger på. Detta är kunskap om principerna för datordrift, dess arkitektur och assemblerspråk som en reflektion och förkroppsligande av denna kunskap.

En typisk modern dator (i486 eller Pentium-baserad) består av följande komponenter (Figur 1).

Ris. 1. Dator och kringutrustning

Ris. 2. Blockschema personlig dator

Av figuren (Figur 1) kan man se att datorn är uppbyggd av flera fysiska enheter som var och en är kopplad till en enhet, kallad systemenheten. Logiskt sett är det tydligt att det spelar rollen som någon koordinerande enhet. Låt oss ta en titt inuti systemblock(du behöver inte försöka komma in i monitorn - det finns inget intressant där, förutom att det är farligt): vi öppnar höljet och ser några brädor, block, anslutningskablar. För att förstå deras funktionalitet, låt oss titta på blockdiagram typisk dator (fig. 2). Den låtsas inte vara absolut noggrann och syftar endast till att visa syftet, förhållandet och den typiska sammansättningen av elementen i en modern persondator.

Låt oss diskutera diagrammet i fig. 2 i en något okonventionell stil.
Det ligger i människans natur, att möta något nytt, att leta efter några associationer som kan hjälpa honom att känna till det okända. Vilka associationer väcker datorn? För mig är till exempel datorn ofta förknippad med personen själv. Varför?

En person som skapade en dator någonstans i djupet av sig själv trodde att han skapade något som liknade honom själv. Datorn har organ för att ta emot information från omvärlden - det här är ett tangentbord, en mus, driver på magnetiska skivor. På fig. 2 är dessa organ placerade till höger om systembussarna. Datorn har organ som "smälter" den mottagna informationen - det här är den centrala processorn och Bagge. Och slutligen har datorn talorgan som ger ut resultaten av bearbetningen. Dessa är också några av enheterna till höger.

Moderna datorer naturligtvis långt ifrån mänskligt. De kan jämföras med varelser som interagerar med omvärlden på nivån av en stor men begränsad uppsättning ovillkorliga reflexer.
Denna uppsättning reflexer bildar ett system av maskininstruktioner. Oavsett hur hög nivå du kommunicerar med en dator, kommer allt i slutändan ner på en tråkig och monoton sekvens av maskininstruktioner.
Varje maskinkommando är ett slags stimulans för excitation av den eller den obetingade reflexen. Reaktionen på denna stimulans är alltid entydig och är "hardwired" i blocket av mikrokommandon i form av ett mikroprogram. Detta mikroprogram implementerar åtgärderna för att implementera maskinkommandot, men redan på nivån för signaler som appliceras på vissa datorlogiska kretsar, och styr därigenom olika datorundersystem. Detta är den så kallade principen för mikroprogramstyrning.

För att fortsätta analogin med en person, noterar vi att för att en dator ska äta ordentligt har många operativsystem, kompilatorer för hundratals programmeringsspråk, etc. uppfunnits. Men alla är i själva verket bara en maträtt som mat (program) levereras enligt vissa regler mage (dator). Endast magen på en dator älskar diet, monoton mat - ge den strukturerad information, i form av strikt organiserade sekvenser av nollor och ettor, vars kombinationer utgör maskinspråket.

Således, som utåt är en polyglot, förstår datorn bara ett språk - språket för maskininstruktioner. Naturligtvis, för att kommunicera och arbeta med en dator, är det inte nödvändigt att kunna detta språk, men nästan alla professionella programmerare möter förr eller senare behovet av att lära sig det. Lyckligtvis behöver programmeraren inte försöka lista ut innebörden av de olika kombinationerna. binära tal, som redan på 50-talet började programmerare använda en symbolisk analog av maskinspråk för programmering, som de kallade assemblerspråk. Detta språk återspeglar exakt alla funktioner i maskinspråket. Det är därför, till skillnad från högnivåspråk, är assemblerspråket olika för varje typ av dator.

Av det föregående kan vi dra slutsatsen att eftersom assemblerspråket för datorn är "native", kan det mest effektiva programmet bara skrivas i det (förutsatt att det är skrivet av en kvalificerad programmerare). Det finns ett litet "men" här: det här är en mycket mödosam process som kräver mycket uppmärksamhet och praktisk erfarenhet. Därför, i verkligheten, assembler skriver främst program som ska ge effektivt arbete med hårdvara. Ibland skrivs kritiska delar av programmet i form av körtid eller minnesförbrukning i assembler. Därefter görs de i form av subrutiner och kombineras med kod på ett högnivåspråk.

Det är vettigt att börja lära sig assemblerspråket för vilken dator som helst efter att ha tagit reda på vilken del av datorn som är synlig och tillgänglig för programmering på detta språk. Detta är den så kallade datorprogrammodellen, varav en del är mikroprocessorprogrammodellen, som innehåller 32 register som är mer eller mindre tillgängliga för programmeraren.

Dessa register kan delas in i två stora grupper:

^16 anpassade register;

16 systemregister.

Assembly språkprogram använder register mycket hårt. De flesta register har ett specifikt funktionssyfte.

Som namnet antyder kallas användarregister eftersom programmeraren kan använda dem när han skriver sina program. Dessa register inkluderar (Fig. 3):

Åtta 32-bitars register som kan användas av programmerare för att lagra data och adresser (även kallade register) generell mening(RON)):

sex segmentregister: cs, ds, ss, es, fs, gs;

status- och kontrollregister:

Flaggor register eflags/flaggor;

eip/ip kommandopekarregister.

Ris. 3. Användarregister för mikroprocessorer i486 och Pentium

Varför visas många av dessa register med ett snedstreck? Nej, det här är inte olika register - de är delar av ett stort 32-bitars register. De kan användas i programmet som separata objekt. Detta gjordes för att säkerställa funktionaliteten för program skrivna för de yngre 16-bitars mikroprocessormodellerna från Intel, med början i i8086. Mikroprocessorerna i486 och Pentium har mestadels 32-bitars register. Deras antal, med undantag för segmentregister, är detsamma som i8086, men dimensionen är större, vilket återspeglas i deras beteckningar - de har
prefix e (Utökad).

^ Register för allmänna ändamål
Alla register i denna grupp tillåter åtkomst till deras "nedre" delar (se fig. 3). När du tittar på denna figur, notera att endast de nedre 16 och 8 bitarsdelarna av dessa register kan användas för självadressering. De övre 16 bitarna i dessa register är inte tillgängliga som oberoende objekt. Detta görs, som vi noterade ovan, för kompatibilitet med de yngre 16-bitars mikroprocessormodellerna från Intel.

Låt oss lista de register som hör till gruppen av allmänna register. Eftersom dessa register är fysiskt placerade i mikroprocessorn inuti den aritmetiska logiska enheten (ALU), kallas de också för ALU-register:

eax/ax/ah/al (Ackumulatorregister) - ackumulator.
Används för att lagra mellanliggande data. I vissa kommandon är användningen av detta register obligatorisk;

ebx/bx/bh/bl (Basregister) - basregister.
Används för att lagra basadressen för något objekt i minnet;

ecx/cx/ch/cl (Räkneregister) - räknareregister.
Det används i kommandon som utför vissa repetitiva åtgärder. Dess användning är ofta implicit och dold i algoritmen för motsvarande kommando.
Till exempel, kommandot för looporganisation, förutom att överföra kontrollen till ett kommando beläget på en viss adress, analyserar och minskar värdet på ecx/cx-registret med ett;

edx/dx/dh/dl (Dataregister) - dataregister.
Precis som eax/ax/ah/al-registret lagrar det mellanliggande data. Vissa kommandon kräver att de används; för vissa kommandon sker detta implicit.

Följande två register används för att stödja de så kallade kedjeoperationerna, det vill säga operationer som sekventiellt behandlar kedjor av element, som var och en kan vara 32, 16 eller 8 bitar långa:

esi/si (Källindexregister) - källindex.
Detta register i kedjeoperationer innehåller den aktuella adressen för elementet i källkedjan;

edi/di (Destination Index register) - index för mottagaren (mottagaren).
Detta register i kedjeoperationer innehåller den aktuella adressen i destinationskedjan.

I mikroprocessorns arkitektur på hård- och mjukvarunivå stöds en sådan datastruktur som en stack. För att arbeta med stacken i mifinns det speciella kommandon, och i mikroprocessorns mjukvarumodell finns det speciella register för detta:

esp/sp (Stack Pointer register) - stack pointer register.
Innehåller en pekare till toppen av stapeln i det aktuella stapelsegmentet.

ebp/bp (Base Pointer register) - stapelrams baspekareregister.
Designad för att organisera slumpmässig tillgång till data inuti stacken.

En stack är ett programområde för tillfällig lagring av godtyckliga data. Naturligtvis kan data också lagras i datasegmentet, men i detta fall måste för varje tillfälligt lagrad data en separat namngiven minnescell skapas, vilket ökar programmets storlek och antalet namn som används. Bekvämligheten med stacken är att dess område återanvänds, och att lagra data i stacken och hämta dem därifrån görs med hjälp av effektiva push- och pop-kommandon utan att ange några namn.
Stacken används traditionellt, till exempel för att lagra innehållet i registren som används av programmet innan en subrutin anropas, som i sin tur kommer att använda processorregistren "för sina egna ändamål". Det ursprungliga innehållet i registren läcker från stacken vid retur från subrutinen. En annan vanlig teknik är att skicka de parametrar som krävs till en subrutin via stacken. Subrutinen, som vet i vilken ordning parametrarna är placerade på stacken, kan ta dem därifrån och använda dem i dess exekvering. Utmärkande drag stack är en sorts samplingsordning av data som finns i den: när som helst är bara det översta elementet tillgängligt på stacken, d.v.s. det sista elementet laddat på stapeln. Genom att skjuta upp det översta elementet från stapeln blir nästa element tillgängligt. Stackens element är placerade i minnesområdet som är tilldelat för stacken, från botten av stacken (dvs. från dess maximala adress) till successivt minskande adresser. Adressen för det översta tillgängliga elementet lagras i stackpekarregistret SP. Som alla andra delar av programminnet måste stacken inkluderas i något segment eller bilda ett separat segment. I båda fallen placeras segmentadressen för det segmentet i segmentstackregistret SS. Sålunda beskriver ett par register SS:SP adressen för en tillgänglig stackcell: SS lagrar segmentadressen för stacken och SP lagrar förskjutningen av den senast lagrade datan i stacken (fig. 4, a). Låt oss vara uppmärksamma på det faktum att stackpekaren SP i initialtillståndet pekar på en cell som ligger under botten av stapeln och inte ingår i den.

Fig 4. Stackorganisation: a - initialtillståndet, b - efter att ha laddat ett element (c detta exempel- innehållet i AX-registret), c - efter laddning av det andra elementet (innehållet i DS-registret), d - efter avlastning av ett element, e - efter avlastning av två element och återgång till sitt ursprungliga tillstånd.

Lastning på stapeln utförs av ett speciellt push-stack-kommando. Denna instruktion minskar först innehållet i stackpekaren med 2 och placerar sedan operanden på adressen i SP. Om vi ​​till exempel tillfälligt vill spara innehållet i AX-registret i stacken, bör vi utföra kommandot

Stacken övergår till det tillstånd som visas i fig. 1.10, b. Det kan ses att stackpekaren flyttas upp med två byte (mot lägre adresser) och operanden som anges i push-kommandot skrivs till denna adress. Följande kommando för att ladda till stacken, till exempel,

kommer att flytta stapeln till det tillstånd som visas i fig. 1,10, c. Stacken kommer nu att innehålla två element, med endast det översta som nås, pekade på av stackpekaren SP. Om vi ​​efter en tid behöver återställa det ursprungliga innehållet i registren som sparats på stacken, måste vi utföra popkommandona (pop) från stacken:

pop DS
pop AXE

Hur stor ska stapeln vara? Det beror på hur intensivt det används i programmet. Om du till exempel planerar att lagra en array på 10 000 byte i stacken, måste stacken vara minst den storleken. Man bör komma ihåg att i vissa fall används stacken automatiskt av systemet, i synnerhet när man utför avbrottskommandot int 21h. Med detta kommando skjuter processorn först returadressen till stacken och sedan skickar DOS innehållet i registren och annan information relaterad till det avbrutna programmet dit. Därför, även om programmet inte använder stacken alls, måste den fortfarande finnas i programmet och ha en storlek på minst flera tiotals ord. I vårt första exempel lägger vi 128 ord på högen, vilket definitivt räcker.

^ Sammansättningsprogramstruktur

Ett assemblerspråksprogram är en samling minnesblock som kallas minnessegment. Ett program kan bestå av ett eller flera av dessa blocksegment. Varje segment innehåller en samling språkmeningar, som var och en upptar en separat rad med programkod.

Monteringsanvisningar är av fyra typer:

kommandon eller instruktioner som är symboliska motsvarigheter till maskininstruktioner. Under översättningsprocessen omvandlas monteringsinstruktioner till motsvarande kommandon för mikroprocessorinstruktionsuppsättningen;

makrokommandon - meningar i programtexten som är utformade på ett visst sätt och ersätts av andra meningar under översättningen;

direktiv som säger till assembler-kompilatorn att utföra någon åtgärd. Direktiven har inga motsvarigheter i maskinrepresentation;

kommentarsrader som innehåller alla tecken, inklusive bokstäver i det ryska alfabetet. Kommentarer ignoreras av översättaren.

^ Assembly språksyntax

De meningar som utgör ett program kan vara en syntaktisk konstruktion som motsvarar ett kommando, makro, direktiv eller kommentar. För att assembleröversättaren ska känna igen dem måste de vara utformade enligt vissa syntaktiska regler. För att göra detta är det bäst att använda en formell beskrivning av språkets syntax, som grammatikens regler. De vanligaste sätten att beskriva ett programmeringsspråk på detta sätt är syntaxdiagram och utökade Backus-Naur-former. För praktisk användning är syntaxdiagram mer bekväma. Till exempel kan syntaxen för assemblerspråkssatser beskrivas med hjälp av syntaxdiagrammen som visas i följande figurer.

Ris. 5. Assembler meningsformat

Ris. 6. Formatdirektiv

Ris. 7. Format för kommandon och makron

På dessa ritningar:

etikettnamn - en identifierare vars värde är adressen till den första byten i programmets källkodssats den betecknar;

namn - en identifierare som skiljer detta direktiv från andra direktiv med samma namn. Som ett resultat av att sammanställaren bearbetar ett visst direktiv, kan vissa egenskaper tilldelas detta namn;

operationskod (COP) och direktiv är mnemoniska beteckningar för motsvarande maskininstruktion, makroinstruktion eller översättardirektiv;

operander - delar av kommandot, makro- eller assembler-direktiven, som anger objekt på vilka operationer utförs. Assembler-operander beskrivs av uttryck med numeriska och textkonstanter, variabeletiketter och identifierare med operatortecken och några reserverade ord.

^ Hur använder man syntaxdiagram? Det är väldigt enkelt: allt du behöver göra är att hitta och sedan följa vägen från diagrammets ingång (vänster) till dess utgång (höger). Om en sådan väg finns är meningen eller konstruktionen syntaktisk korrekt. Om det inte finns någon sådan väg kommer kompilatorn inte att acceptera denna konstruktion. När du arbetar med syntaxdiagram, var uppmärksam på riktningen för förbikopplingen som anges av pilarna, eftersom det bland banorna kan finnas de som kan följas från höger till vänster. Faktum är att syntaktiska diagram återspeglar översättarens logik när man analyserar inmatningsmeningarna i programmet.

Tillåtna tecken när du skriver programtext är:

Alla latinska bokstäver: A-Z, a-z. I det här fallet anses stora och små bokstäver vara likvärdiga;

Siffror från 0 till 9;

Tecken?, @, $, _, &;

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

Assembler-meningar bildas av lexem, som är syntaktiskt oskiljaktiga sekvenser av giltiga språksymboler som är meningsfulla för översättaren.

Polletterna är:

identifierare är sekvenser av giltiga tecken som används för att beteckna programobjekt såsom opkoder, variabelnamn och etikettnamn. Regeln för att skriva identifierare är följande: en identifierare kan bestå av ett eller flera tecken. Som tecken kan du använda bokstäver i det latinska alfabetet, siffror och några specialtecken - _, ?, $, @. En identifierare kan inte börja med ett siffror. Längden på identifieraren kan vara upp till 255 tecken, även om översättaren bara accepterar de första 32 tecknen och ignorerar resten. Du kan justera längden på möjliga identifierare med alternativet kommandorad mv. Dessutom är det möjligt att säga åt översättaren att skilja mellan stora och små bokstäver eller ignorera deras skillnad (vilket görs som standard).

^ Kommandon för monteringsspråk.

Assembler-kommandon avslöjar förmågan att överföra sina krav till datorn, mekanismen för att överföra kontroll i programmet (loopar och hopp) för logiska jämförelser och programorganisation. Men programmeringsuppgifter är sällan så enkla. De flesta program innehåller en serie loopar där flera instruktioner upprepas tills ett visst krav uppnås, och olika kontroller för att avgöra vilken av de flera åtgärderna som ska utföras. Vissa kommandon kan överföra kontroll genom att ändra den normala sekvensen av steg genom att direkt modifiera offsetvärdet i kommandopekaren. Som nämnts tidigare finns det olika kommandon för olika processorer, men vi kommer att överväga ett antal kommandon för processorerna 80186, 80286 och 80386.

För att beskriva flaggornas tillstånd efter att ha utfört ett visst kommando kommer vi att använda ett urval från tabellen som återspeglar strukturen för eflags flaggregistret:

Den nedre raden i denna tabell listar värdena för flaggorna efter att kommandot har utförts. I det här fallet används följande notationer:

1 - efter att kommandot har utförts sätts flaggan (lika med 1);

0 - efter att kommandot har utförts återställs flaggan (lika med 0);

r - flaggans värde beror på resultatet av kommandot;

Efter att ha utfört kommandot är flaggan odefinierad;

mellanslag - efter att ha utfört kommandot ändras inte flaggan;

Följande notation används för att representera operander i syntaxdiagram:

r8, r16, r32 - operand i ett av registren för storleksbyte, ord eller dubbelord;

m8, m16, m32, m48 - operand i minnesstorlek av byte, ord, dubbelord eller 48 bitar;

i8, i16, i32 - omedelbar operand av storlek byte, ord eller dubbelord;

a8, a16, a32 - relativ adress (offset) i kodsegmentet.

Kommandon (i alfabetisk ordning):

*Dessa kommandon beskrivs i detalj.

LÄGG TILL
(Tillägg)

Tillägg

^ Kommandoöversikt:

lägg till destination, källa

Syfte: tillägg av två käll- och måloperander av byte-, ord- eller dubbla orddimensioner.

Arbetsalgoritm:

lägg till käll- och destinationsoperander;

skriv resultatet av tillägget till mottagaren;

sätta flaggor.

Status för flaggor efter kommandoexekvering:

Ansökan:
Kommandot add används för att lägga till två heltalsoperander. Resultatet av tillägget placeras på adressen till den första operanden. Om resultatet av tillägget överskrider gränserna för destinationsoperanden (ett spill inträffar), bör denna situation beaktas genom att analysera cf-flaggan och sedan eventuellt använda adc-kommandot. Till exempel, låt oss lägga till värdena i register ax och minnesområde ch. När du lägger till bör du ta hänsyn till möjligheten för spill.

Registrera plus register eller minne:

|000000dw|modregr/rm|

Registrera AX (AL) plus omedelbart värde:

|0000010w|--data--|data om w=1|

Register eller minne plus omedelbart värde:

|100000sw|mod000r/m|--data--|data om BW=01|

RINGA UPP
(RINGA UPP)

Anropa en procedur eller uppgift

^ Kommandoöversikt:

Ändamål:

överföring av kontroll till en nära eller fjärran procedur med lagring av adressen till returpunkten på stapeln;

uppgiftsbyte.

Arbetsalgoritm:
bestäms av operandtypen:

Etiketten är nära - innehållet i eip / ip-kommandopekaren skjuts upp på stacken och ett nytt adressvärde som motsvarar etiketten laddas in i samma register;

Far-etikett - innehållet i eip/ip och cs-kommandopekaren skjuts in i stacken. Sedan laddas de nya adressvärdena som motsvarar det bortre märket in i samma register;

R16, 32 eller m16, 32 - definiera ett register eller en minnescell som innehåller förskjutningar i det aktuella instruktionssegmentet, dit styrning överförs. När kontrollen överförs, skjuts innehållet i eip/ip-kommandopekaren till stacken;

Minnespekare - definierar en minnesplats som innehåller en pekare på 4 eller 6 byte till proceduren som anropas. Strukturen för en sådan pekare är 2+2 eller 2+4 byte. Tolkningen av en sådan pekare beror på mikroprocessorns driftläge:

^ Tillstånd för flaggor efter kommandoexekvering (förutom uppgiftsväxel):

kommandokörning påverkar inte flaggor

När en uppgift byts ändras flaggornas värden enligt informationen om eflagsregistret i TSS-statussegmentet för uppgiften som byts till.
Ansökan:
Anropskommandot låter dig organisera en flexibel och multivariat överföring av kontroll till en subrutin samtidigt som adressen till returpunkten bibehålls.

Objektkod (fyra format):

Direktadressering i ett segment:

|11101000|disp-låg|djup-hög|

Indirekt adressering i ett segment:

|11111111|mod010r/m|

Indirekt adressering mellan segment:

|11111111|mod011r/m|

Direkt adressering mellan segment:

|10011010|offset-låg|offset-hög|seg-låg|seg-hög|

CMP
(jämför operander)

Operand jämförelse

^ Kommandoöversikt:

cmp operand1, operand2

Syfte: jämförelse av två operander.

Arbetsalgoritm:

utföra subtraktion (operand1-operand2);

beroende på resultatet, ställ in flaggor, ändra inte operand1 och operand2 (det vill säga lagra inte resultatet).

Ansökan:
Detta kommando används för att jämföra två operander genom subtraktion, medan operanderna inte ändras. Flaggor sätts som ett resultat av kommandoexekvering. cmp-instruktionen används med de villkorliga hoppinstruktionerna och setbyte-byte-instruktionen setcc.

Objektkod (tre format):

Registrerat eller registrerat minne:

|001110dw|modreg/m|

Omedelbart värde med register AX (AL):

|0011110w|--data--|data om w=1|

Omedelbart värde med register eller minne:

|100000sw|mod111r/m|--data--|data if sw=0|

DEC
(Dekrementera operand med 1)

Operand minskar med en

^ Kommandoöversikt:

dec operand

Syfte: minska värdet på operanden i minnet eller registret med 1.

Arbetsalgoritm:
instruktionen subtraherar 1 från operanden. Status för flaggor efter kommandoexekvering:

Ansökan:
Kommandot dec används för att minska värdet på en byte, ord, dubbelord i minnet eller register med ett. Observera att kommandot inte påverkar cf-flaggan.

Registrera: |01001reg|

^ Register eller minne: |1111111w|mod001r/m|

DIV
(DIVide osignerad)

Division osignerad

Kommandoschema:

div avdelare

Syfte: att utföra en divisionsoperation på två binära värden utan tecken.

^ Arbetsalgoritm:
Kommandot kräver två operander - utdelningen och divisorn. Utdelningen anges implicit och dess storlek beror på storleken på divisorn, som anges i kommandot:

om divisorn är i byte måste utdelningen finnas i register ax. Efter operationen placeras kvoten i al och resten i ah;

om divisor är ett ord, så måste utdelningen finnas i registerparet dx:ax, med den låga delen av utdelningen i ax. Efter operationen placeras kvoten i ax och resten i dx;

om divisor är ett dubbelord så måste utdelningen finnas i registerparet edx:eax, med den låga delen av utdelningen i eax. Efter operationen placeras kvoten i eax och resten i edx.

^ Tillstånd för flaggor efter kommandoexekvering:

Ansökan:
Kommandot utför en heltalsdelning av operanderna och returnerar resultatet av divisionen som en kvot och resten av divisionen. När du utför en divisionsoperation kan ett undantag inträffa: 0 - divisionsfel. Denna situation uppstår i ett av två fall: divisorn är 0, eller så är kvoten för stor för att passa in i eax/ax/al-registret.

Objektkod:

|1111011w|mod110r/m|

INT
(Avbryta)

Anropar en rutin för avbrottsservice

^ Kommandoöversikt:

int interrupt_number

Syfte: anropa avbrottsservicerutinen med det avbrottsnummer som anges av instruktionsoperanden.

^ Arbetsalgoritm:

skjut upp registret eflags/flaggor och returadressen till stacken. Vid skrivning av returadressen skrivs först innehållet i cs-segmentregistret, sedan innehållet i eip/ip-kommandopekaren;

återställ if och tf flaggorna till noll;

överföra kontrollen till avbrottshanteraren med angivet nummer. Styröverföringsmekanismen beror på mikroprocessorns driftläge.

^ Tillstånd för flaggor efter kommandoexekvering:

Ansökan:
Som du kan se från syntaxen finns det två former av detta kommando:

int 3 - har sin egen individuella opcode 0cch och upptar en byte. Denna omständighet gör det mycket bekvämt att använda i olika programvarufelsökningar för att ställa in brytpunkter genom att ersätta den första byten i en instruktion. Mikroprocessorn, som möter ett kommando med opkoden 0cch i sekvensen av kommandon, anropar avbrottshanteraren med vektornummer 3, som tjänar till att kommunicera med mjukvarufelsökaren.

Den andra formen av instruktionen är två byte lång, har en opkod på 0cdh och låter dig initiera ett anrop till en avbrottsservicerutin med ett vektornummer i intervallet 0-255. Funktioner för överföring av kontroll, som noterat, beror på mikroprocessorns driftläge.

Objektkod (två format):

Registrera: |01000reg|

^ Register eller minne: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(Hoppa om skick)

(Hoppa om CX=Noll/ Hoppa om ECX=Noll)

Hoppa om villkoret är uppfyllt

Hoppa om CX/ECX är noll

^ Kommandoöversikt:

jcc etikett
jcxz etikett
jecxz etikett

Syfte: övergång inom det aktuella segmentet av kommandon, beroende på något tillstånd.

^ Kommandoalgoritm (förutom jcxz/jecxz):
Kontrollera flaggornas tillstånd beroende på op-koden (den återspeglar tillståndet som kontrolleras):

om villkoret som testas är sant, gå till cellen som indikeras av operanden;

om villkoret som kontrolleras är falskt, skicka sedan kontrollen till nästa kommando.

jcxz/jecxz kommandoalgoritm:
Kontrollera villkoret att innehållet i ecx/cx-registret är lika med noll:

om det kontrollerade skicket

Programmering på maskininstruktionsnivå är den lägsta nivå där programmering är möjlig. Systemet med maskininstruktioner måste vara tillräckligt för att genomföra de nödvändiga åtgärderna genom att utfärda instruktioner till datorhårdvaran.

Varje maskininstruktion består av två delar:

  • operationssal - bestämma "vad man ska göra";
  • operand - definierar bearbetningsobjekt, "vad man ska göra med".

Maskininstruktionen för mikroprocessorn, skriven i assemblerspråk, är en enda rad med följande syntaktiska form:

etikett kommando/direktiv operand(er) ;kommentarer

I det här fallet är ett obligatoriskt fält på en rad ett kommando eller direktiv.

Etiketten, kommandot/direktivet och operanderna (om några) är åtskilda med minst ett mellanslag eller tabbtecken.

Om ett kommando eller direktiv måste fortsätta på nästa rad, används bakstrecket: \.

Som standard skiljer inte assemblerspråk mellan stora och små bokstäver i kommandon eller direktiv.

Exempel på kodrader:

Countdb 1 ;Namn, direktiv, en operand
mov eax,0 ;Kommando, två operander
cbw ; Team

Taggar

Märka i assemblerspråk kan innehålla följande symboler:

  • alla bokstäver i det latinska alfabetet;
  • siffror från 0 till 9;
  • specialtecken: _, @, $, ?.

En prick kan användas som det första tecknet i en etikett, men vissa kompilatorer avråder från detta tecken. Reserverade assembly-språknamn (direktiv, operatorer, kommandonamn) kan inte användas som etiketter.

Det första tecknet i etiketten måste vara en bokstav eller ett specialtecken (inte en siffra). Maximal längd etiketter - 31 tecken. Alla etiketter som är skrivna på en rad som inte innehåller ett assemblerdirektiv måste sluta med ett kolon: .

Lag

Team talar om för översättaren vilken åtgärd mikroprocessorn ska utföra. I ett datasegment definierar ett kommando (eller direktiv) ett fält, en arbetsyta eller en konstant. I ett kodsegment definierar en instruktion en åtgärd, såsom ett drag (mov) eller ett tillägg (lägg till).

direktiv

Montören har ett antal operatörer som låter dig styra processen för att montera och generera en lista. Dessa operatörer kallas direktiv . De agerar bara i processen för att montera programmet och, till skillnad från instruktioner, genererar inte maskinkoder.

operander

Operand – ett objekt på vilket ett maskinkommando eller en programmeringsspråksoperatör exekveras.
En instruktion kan ha en eller två operander, eller inga operander alls. Antalet operander anges implicit av instruktionskoden.
Exempel:

  • Inga operander ret ;Return
  • En operand inc ecx ;Öka ecx
  • Två operander lägger till eax,12 ;Lägg till 12 till eax

Etiketten, kommandot (direktiv) och operanden behöver inte starta på någon speciell position i strängen. Det rekommenderas dock att skriva dem i en kolumn för bättre läsbarhet av programmet.

Operander kan vara

  • identifierare;
  • teckensträngar omslutna av enkla eller dubbla citattecken;
  • heltal i binära, oktala, decimala eller hexadecimala.
Identifierare

Identifierare – sekvenser av giltiga tecken som används för att beteckna programobjekt såsom operationskoder, variabelnamn och etikettnamn.

Regler för att skriva identifierare.

  • Identifieraren kan vara ett eller flera tecken.
  • Som tecken kan du använda bokstäver i det latinska alfabetet, siffror och några specialtecken: _, ?, $, @.
  • En identifierare kan inte börja med ett siffror.
  • ID:t kan vara upp till 255 tecken långt.
  • Översättaren accepterar de första 32 tecknen i identifieraren och ignorerar resten.
Kommentarer

Kommentarer separeras från den körbara raden med ett tecken; . I det här fallet är allt som skrivs efter semikolontecknet och fram till slutet av raden en kommentar. Användningen av kommentarer i ett program förbättrar dess tydlighet, särskilt när syftet med en uppsättning instruktioner är oklart. Kommentaren kan innehålla alla utskrivbara tecken, inklusive mellanslag. Kommentaren kan sträcka sig över hela raden eller följa kommandot på samma rad.

Monteringsprogrammets struktur

Ett program skrivet på assemblerspråk kan bestå av flera delar, så kallade moduler . Varje modul kan definiera ett eller flera data-, stack- och kodsegment. Alla kompletta assemblerspråksprogram måste innehålla en huvud- eller huvudmodul från vilken körningen börjar. En modul kan innehålla kod, data och stacksegment som deklareras med lämpliga direktiv. Innan du deklarerar segment måste du ange minnesmodellen med .MODEL-direktivet.

Ett exempel på ett "gör ingenting"-program i assemblerspråk:

686P
.MODEL FLAT, STDCALL
.DATA
.KODA
START:

RÖTA
SLUT START

Detta program innehåller endast en mikroprocessorinstruktion. Detta kommando är RET. Det säkerställer att programmet avslutas korrekt. I allmänhet används detta kommando för att avsluta en procedur.
Resten av programmet är relaterat till översättarens funktion.
.686P - Kommandon i skyddat läge för Pentium 6 (Pentium II) är tillåtna. Detta direktiv väljer den assemblerinstruktionsuppsättning som stöds genom att specificera processormodellen. Bokstaven P i slutet av direktivet talar om för översättaren att processorn körs i skyddat läge.
.MODEL FLAT, stdcall är en platt minnesmodell. Denna minnesmodell används i operationssalen Windows-system. stdcall
.DATA är ett programsegment som innehåller data.
.CODE är ett programblock som innehåller kod.
START är en etikett. I assembler spelar etiketter en stor roll, vilket inte kan sägas om moderna högnivåspråk.
SLUT START - slutet av programmet och ett meddelande till översättaren att programmet måste startas från etiketten START.
Varje modul måste innehålla ett END-direktiv som markerar slutet källkod program. Alla rader som följer END-direktivet ignoreras. Att utelämna END-direktivet genererar ett fel.
Etiketten efter END-direktivet talar om för kompilatorn namnet på huvudmodulen från vilken programkörningen börjar. Om programmet innehåller en modul kan etiketten efter END-direktivet utelämnas.

Assembly språkkommandon (föreläsning)

FÖRELÄSNINGSPLAN

1. Huvudgrupper av verksamheter.

Pentium.

1. Huvudgrupper av verksamheter

Mikroprocessorer utför en uppsättning instruktioner som implementerar följande huvudgrupper av operationer:

vidarebefordran,

aritmetiska operationer,

logiska operationer,

skiftverksamhet,

jämförelse och testoperationer,

bitoperationer,

Programhanteringsverksamhet;

Processorkontrolloperationer.

2. Mnemokoder för processorkommandon Pentium

När man beskriver kommandon används vanligtvis deras mnemoniska beteckningar (mnemoniska koder), som tjänar till att specificera kommandot vid programmering i Assembly-språk. För olika versioner Monteringsminne för vissa kommandon kan skilja sig åt. Till exempel, för ett kommando för att anropa en subrutin, används mnemonkodenRINGA UPP eller JSR ("Hoppa till subrutin”). Mnemonkoderna för de flesta kommandon för huvudtyperna av mikroprocessorer är dock desamma eller skiljer sig något, eftersom de är förkortningar av motsvarande engelska ord som definierar operationen som utförs. Överväg kommandominne som används för processorer Pentium.

Vidarebefordra kommandon. Huvudkommandot för denna grupp är kommandotMOV , som tillhandahåller dataöverföring mellan två register eller mellan ett register och en minnescell. Vissa mikroprocessorer implementerar en överföring mellan två minnesceller, såväl som en gruppöverföring av innehållet i flera register från minnet. Till exempel mikroprocessorer i 68-familjen Motorola xxx kör kommandotFLYTTA , som tillhandahåller överföring från en minnescell till en annan, och kommandotMOVEM , som skriver till minnet eller laddar från minnet innehållet i en given uppsättning register (upp till 16 register). TeamXCHG utför ett ömsesidigt utbyte av innehållet i två processorregister eller ett register och en minnescell.

Mata in kommandon I och utgång UT implementera överföringen av data från processorregistret till en extern enhet eller mottagandet av data från en extern enhet till registret. Dessa kommandon anger numret på den gränssnittsenhet (I/O-port) genom vilken data överförs. Observera att många mikroprocessorer inte har särskilda instruktioner för åtkomst externa enheter. I detta fall utförs inmatning och utmatning av data i systemet med kommandotMOV , som anger adressen till den nödvändiga gränssnittsenheten. Således adresseras en extern enhet som en minnescell, och en specifik sektion tilldelas i adressutrymmet, i vilken adresserna för gränssnittsenheter (portar) som är anslutna till systemet finns.

Kommandon för aritmetiska operationer. Huvudkommandona i denna grupp är addition, subtraktion, multiplikation och division, som har ett antal alternativ. Tilläggskommandon LÄGG TILL och subtraktion SUB utföra lämpliga operationer medchar två register, ett register och en minnesplats, eller använder en omedelbar operand. Lag AD C , SB B utföra addition och subtraktion, med hänsyn till attributets värdeC, inställd under bildandet av överföringen i färd med att utföra föregående operation. Med hjälp av dessa kommandon implementeras sekventiell tillägg av operander, vars antal siffror överstiger processorkapaciteten. Team NEG ändrar operandens tecken och konverterar den till tvåkomplement.

Multiplikation och division kan utföras på tecken med tecken (kommandonjag MUL, jag DIV ) eller osignerad (kommandon MUL, DIV ). Resultatet av operationen finns i registret. När du multiplicerar (kommandonMUL , IMUL ) resulterar i ett tvåsiffrigt resultat, som använder två register för att rymma. När du delar (kommandonDIV , IDIV ) som utdelning används en operand med fördubblad kapacitet, placerad i två register, och som ett resultat skrivs kvoten och resten till två register.

Logiska kommandon . Nästan alla mikroprocessorer utför logiska operationer AND, OR, Exclusive OR, som utförs på operandbitarna med samma namn med hjälp av kommandon OCH, ELLER, X ELLER . Operationer utförs på innehållet i två register, ett register och en minnesplats, eller med användning av en omedelbar operand. Team INTE Inverterar värdet för varje bit i operanden.

Skiftkommandon. Mikroprocessorer utför aritmetiska, logiska och cykliska förskjutningar av de adresserade operanderna med en eller flera bitar. Operanden som ska skiftas kan vara i ett register eller en minnesplats, och antalet skiftbitar specificeras med användning av den omedelbara operanden som finns i instruktionen, eller bestäms av innehållet i det specificerade registret. Överlåtelseskylten är vanligtvis inblandad i genomförandet av skiftetCi statusregistret (SR eller EFLAGS), som innehåller den sista biten av operanden som dras ut ur registret eller minnesplatsen.

Jämförelse- och testkommandon . Operandjämförelse görs vanligtvis med instruktionenCMP , som utför subtraktion av operander med inställning av funktionernas värden N, Z, V, C i statusregistret enligt resultatet. I det här fallet sparas inte resultatet av subtraktionen, och operandernas värden ändras inte. Den efterföljande analysen av de erhållna karakteristiska värdena gör det möjligt att bestämma det relativa värdet (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Vissa mikroprocessorer utför ett testkommando TST , som är en enkel operandvariant av jämförelseinstruktionen. När detta kommando utförs sätts tecknen N, Z enligt tecknet och värdet (lika eller icke-noll) för den adresserade operanden.

Bitdriftsinstruktioner . Dessa kommandon anger värdet på attributetCi statusregistret enligt värdet på den bit som testasmiljarder i den adresserade operanden. I vissa mikroprocessorer, enligt resultatet av att testa lite, sätts ett teckenZ. Testbitnummernställs antingen av innehållet i registret som anges i kommandot, eller av en omedelbar operand.

Kommandon för denna grupp implementerar olika alternativ för att ändra den testade biten BT behåller värdet på denna bit oförändrat.Command B T S efter testning ställer in värde miljarder=1 och kommandot B T C - betydelse miljarder=0.Kommando B T C inverterar värdet på bit bn efter att ha testat det.

Programledningsverksamhet. För att styra programmet används ett stort antal kommandon, bland annat:

- ovillkorliga kommandon för kontrollöverföring;

- villkorliga hoppkommandon;

- kommandon för att organisera programcykler;

- avbryta kommandon;

- funktionsändringskommandon.

Ovillkorlig överföring av kontroll utförs av kommandotJMP , som laddas i programräknarenPCnytt innehåll som är adressen till nästa kommando som ska köras. Denna adress anges antingen direkt i kommandotJMP (direktadress), eller beräknas som summan av det aktuella innehålletPCoch offset specificerad i kommandot, vilket är ett signerat nummer (relativ adressering). SomPCinnehåller adressen till nästa kommando i programmet, sedan ställer den sista metoden in adressen för övergången, förskjuten i förhållande till nästa adress med ett givet antal byte. Om förskjutningen är positiv, utförs övergången till nästa kommandon i programmet, om förskjutningen är negativ, till de föregående.

Subrutinen anropas också genom ovillkorlig överföring av kontroll med hjälp av kommandotRINGA UPP (eller JSR ). Men i det här fallet innan du laddar inPC nytt innehåll som anger adressen för den första instruktionen av subrutinen, är det nödvändigt att spara dess nuvarande värde (adressen för nästa instruktion) för att säkerställa en återgång till huvudprogrammet efter exekvering av subrutinen (eller till föregående subrutin vid kapsling av subrutiner). Villkorliga hoppinstruktioner (programgrenar) laddas inPCnytt innehåll om vissa villkor är uppfyllda, vilka vanligtvis sätts efter det aktuella värdet av olika attribut i statusregistret. Om villkoret inte är uppfyllt, exekveras nästa programkommando.

Funktionshanteringskommandon ger skrivning - läser innehållet i statusregistret, som lagrar egenskaper, samt ändrar värdena för individuella egenskaper. Till exempel implementerar Pentium-processorer kommandon LAHF och SAHF , som laddar den låga byten, som innehåller tecknen, från statusregistret EFLAG till låg byte av register EAX och utfyllnad låg byte EFLAGS från registret E AX.. Kommandon CLC, STC ställ in värdena för överföringsflaggan CF=0, CF=1 och kommandot CMC gör att värdet på denna funktion inverteras. Eftersom egenskaper bestämmer flödet av programexekvering under villkorliga hopp, används vanligtvis instruktioner för egenskapsändring för att styra programmet.

Processorkontrollkommandon . Denna grupp inkluderar stoppkommandon, ingen operation och ett antal kommandon som bestämmer driftsättet för processorn eller dess individuella block. TeamHLT avslutar programexekveringen och försätter processorn i ett stoppläge, som avslutas från vilket inträffar vid mottagande av avbrotts- eller omstartssignaler (återställa). Team NEJ En ("tom" instruktion), som inte gör att några operationer utförs, används för att implementera programförseningar eller fylla luckor som bildas i programmet.

Speciallag CLI, STI inaktivera och aktivera tjänsten för avbrottsbegäranden. I processorer Pentium en kontrollbit (flagga) används för dettaOM i register EFLAGS.

Många moderna mikroprocessorer utfärdar ett identifieringskommando som gör att användaren eller andra enheter kan få information om vilken typ av processor som används i ett givet system. I processorer Pentuim det är vad kommandot är till för CPUID , under vilken de nödvändiga uppgifterna om processorn kommer in i registren EAX,ebx,ECX,EDX och kan sedan läsas av användaren eller operativsystemet.

Beroende på de driftlägen som implementeras av processorn och de specificerade typerna av bearbetade data, kan uppsättningen av körbara kommandon utökas avsevärt.

Vissa processorer utför BCD-aritmetiska operationer eller utför speciella rvid bearbetning av sådana tal. Många högpresterande processorer inkluderar FPU - nummerbehandlingsenhet c "flytpunkt".

I ett antal moderna processorer är gruppbearbetning av flera heltal eller tal implementerad. c ”flytande punkt” med ett enda kommando enligt principen SIMD ("Single Instruction – Multiple Data ”) - “Ett kommando – Massor av data”. Samtidigt utförande av operationer på flera operander ökar avsevärt processorns prestanda vid arbete med video- och ljuddata. Sådana operationer används i stor utsträckning inom bildbehandling, ljudsignalbehandling och andra tillämpningar. För att utföra dessa operationer introduceras speciella block i processorerna som implementerar motsvarande uppsättningar instruktioner, som i olika typer av processorer ( Pentium, Athlon) fick namnetMMX (“ Milti-Medieförlängning ”) – Multimedia Extension,SSE(“ Streaming SIMD Extension ”) – Streaming SIMD - förlängning, “3 DFörlängning- 3D-expansion.

En karaktäristisk egenskap hos företagets processorer Intel , som börjar med modell 80286, är prioritetskontrollen vid åtkomst till minne, som tillhandahålls när processorn arbetar i det skyddade virtuella adressläget - " Skyddat läge " (skyddat läge). För att implementera detta läge används speciella grupper av kommandon, som tjänar till att organisera minnesskydd i enlighet med den accepterade prioritetsåtkomstalgoritmen.

1. PC-arkitektur…………………………………………………………………………5

    1.1. Register.

    1.1.1 Register för allmänna ändamål.

1.1.2. segmentregister

1.1.3 Flaggregister

1.2. Organisation av minnet.

1.3. Datarepresentation.

1.3.1 Datatyper

1.3.2 Tecken- och strängrepresentation

2. Programförklaringar …………………………………………

    1. Monteringsspråkkommandon

2.2. Adresseringslägen och maskininstruktionsformat

3. Pseudooperatörer ………………………………………………………………….

3.1 Datadefinitionsdirektiv

3.2 Uppbyggnad av monteringsprogrammet

3.2.1 Programsegment. anta direktiv

3.2.3 Förenklat segmenteringsdirektiv

4. Montering och länkning av programmet ………………………….

5. Dataöverföringskommandon……………………………………………………….

    5.1 Allmänna kommandon

    5.2 Stackkommandon

5.3 I/O-kommandon

5.4 Kommandon för vidarebefordran av adress

5.5 Kommandon för flaggöverföring

6. Aritmetiska kommandon ……………………………………………………….

    6.1 Aritmetiska operationer på binära heltal

6.1.1 Addition och subtraktion

6.1.2 Kommandon för att öka och minska mottagaren med ett

6.2 Multiplikation och division

6.3 Skyltbyte

7. Logiska operationer ………………………………………………………….

8. Växlingar och cykliska växlingar …………………………………………………

9. Strängoperationer ………………………………………………………….

10. Logik och organisation av program ………………………………………………

10.1 Ovillkorliga hopp

10.2 Villkorliga hopp

10.4 Rutiner på assemblerspråk

10.5 Avbryter INT

10.6 Systemprogramvara

10.6.1.1 Läsa tangentbordet.

10.6.1.2 Visa tecken på skärmen

10.6.1.3 Avsluta program.

10.6.2.1 Välja visningslägen

11. Diskminne …………………………………………………………………………..

11.2 Filallokeringstabell

11.3 Disk I/O

11.3.1 Skriva en fil till disk

11.3.1.1 ASCIIZ-data

11.3.1.2 Filnummer

11.3.1.3 Skapa en diskfil

11.3.2 Läsa en diskfil

Introduktion

Monteringsspråk är en symbolisk representation av maskinspråk. Alla processer i en persondator (PC) på den lägsta hårdvarunivån drivs endast av maskinspråkkommandon (instruktioner). Det är omöjligt att verkligen lösa hårdvarurelaterade problem (eller till och med, dessutom hårdvarurelaterade, som att förbättra ett programs hastighet), utan kunskap om assembler.

Assembler är en bekväm form av kommandon direkt för PC-komponenter och kräver kunskap om egenskaperna och förmågorna hos den integrerade kretsen som innehåller dessa komponenter, nämligen PC-mikroprocessorn. Således är assemblerspråk direkt relaterat till den interna organisationen av PC:n. Och det är ingen slump att nästan alla kompilatorer av högnivåspråk stöder åtkomst till assembler-programmeringsnivån.

En del av förberedelsen av en professionell programmerare är nödvändigtvis studiet av assembler. Detta beror på att programmering av assemblerspråk kräver kunskap om PC-arkitektur, vilket gör att du kan skapa mer effektiva program på andra språk och kombinera dem med assemblerprogram.

Manualen behandlar programmering i assemblerspråk för datorer baserade på Intels mikroprocessorer.

Denna handledning riktar sig till alla som är intresserade av processorns arkitektur och grunderna för programmering i Assembly-språk, först och främst till utvecklarna av mjukvaruprodukten.

    PC-arkitektur.

Datorarkitektur är en abstrakt representation av en dator som återspeglar dess struktur, kretsar och logiska organisation.

Alla moderna datorer har några gemensamma och individuella arkitektoniska egenskaper. Individuella egenskaper är endast inneboende för en specifik datormodell.

Begreppet datorarkitektur inkluderar:

    blockschema över en dator;

    medel och metoder för åtkomst till elementen i blockschemat för en dator;

    uppsättning och tillgänglighet av register;

    organisation och metoder för adressering;

    metod för presentation och format för datordata;

    en uppsättning datormaskininstruktioner;

    maskininstruktionsformat;

    avbryta hanteringen.

Huvudelementen i datorhårdvara: systemenhet, tangentbord, displayenheter, diskenheter, utskriftsenheter (skrivare) och olika kommunikationsmedel. Systemenheten består av moderkortet, strömförsörjningen och expansionskortplatser för ytterligare kort. Moderkortet innehåller mikroprocessorn, läsminne (ROM), random access memory (RAM) och samprocessorn.

      Register.

Inuti mikroprocessorn finns information i en grupp av 32 register (16 användare, 16 system), mer eller mindre tillgängliga för användning av programmeraren. Eftersom manualen ägnas åt programmering för mikroprocessorn 8088-i486, är det mest logiskt att börja detta ämne med att diskutera de interna registren för mikroprocessorn som är tillgängliga för användaren.

Användarregister används av programmeraren för att skriva program. Dessa register inkluderar:

    åtta 32-bitars register (allmänna register) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

    sex 16-bitars segmentregister: CS,DS, SS, ES, FS,GS;

    status- och kontrollregister: EFLAGS/FLAGS flaggregister och EIP/IP kommandopekarregister.

Delar av ett 32-bitars register visas med ett snedstreck. Prefixet E (Utökad) anger användningen av ett 32-bitars register. För att arbeta med bytes används register med prefixen L (låg) och H (hög), till exempel AL, CH - som betecknar de låga och höga byten i registrens 16-bitarsdelar.

        Allmänna register.

EAX/AX/AH/AL(Ackumulatorregister) - batteri. Används i multiplikation och division, i I/O-operationer och i vissa operationer på strängar.

EBX/BX/BH/BL - basregister(basregister), används ofta vid adressering av data i minnet.

ECX/CX/CH/CL - disken(räkneregister), används som räknare för antalet loopupprepningar.

EDX/DX/DH/DL - dataregister(dataregister), används för att lagra mellanliggande data. Vissa kommandon kräver det.

Alla register i denna grupp ger dig tillgång till deras "nedre" delar. Endast de nedre 16- och 8-bitarsdelarna av dessa register kan användas för självadressering. De övre 16 bitarna i dessa register är inte tillgängliga som oberoende objekt.

För att stödja strängbearbetningskommandon som tillåter sekventiell bearbetning av strängar av element med en längd på 32, 16 eller 8 bitar, används följande:

ESI/SI (källindexregister) - index källa. Innehåller adressen till det aktuella källelementet.

EDI/DI (avståndsindexregister) - index mottagare(mottagare). Innehåller den aktuella adressen i destinationssträngen.

Mikroprocessorns arkitektur på hård- och mjukvarunivå stöder datastrukturen - stacken. För att arbeta med stacken finns det speciella kommandon och specialregister. Det bör noteras att stacken fylls mot mindre adresser.

ESP/SP (stackpekarregister) - Registrera pekare stack. Innehåller en pekare till toppen av stapeln i det aktuella stapelsegmentet.

EBP/BP (baspekarregister) – stackbaspekarregister. Designad för att organisera slumpmässig tillgång till data inuti stacken.

1.1.2. segmentregister

Mjukvarumodellen för mikroprocessorer har sex segmentregister: CS, SS, DS, ES, GS, FS. Deras existens beror på detaljerna i organisationen och användningen av RAM av Intels mikroprocessorer. Mikroprocessorns hårdvara stödjer den strukturella organisationen av programmet som består av segment. Segmentregister används för att indikera vilka segment som är tillgängliga för närvarande. Mikroprocessorn stöder följande typer av segment:

    kodsegment. Innehåller programkommandon För att komma åt detta segment, använd CS-registret (kodsegmentregister) - segmentkodregister. Den innehåller adressen till maskininstruktionssegmentet som mikroprocessorn har tillgång till.

    datasegment. Innehåller data som bearbetas av programmet. För att komma åt detta segment används DS-registret (datasegmentregister) - segmentdataregister, som lagrar adressen för det aktuella programmets datasegment.

    Stack segment. Detta segment är ett minnesområde som kallas stacken. Mikroprocessorn organiserar stacken enligt principen - den första "kom", den första "vänster". För att komma åt stacken används SS-registret (stacksegmentregister) - stacksegmentregister A som innehåller adressen till stacksegmentet.

    Ytterligare datasegment. Den data som ska behandlas kan vara i ytterligare tre datasegment. Som standard antas data vara i datasegmentet. När du använder ytterligare datasegment måste deras adresser specificeras explicit med hjälp av speciella segmentomdefinieringsprefix i kommandot. Adresser till ytterligare datasegment måste finnas i registren ES, GS, FS (extenSion data segment registers).

        Kontroll- och statusregister

Mikroprocessorn innehåller flera register som innehåller information om tillståndet för både själva mikroprocessorn och programmet vars instruktioner för närvarande laddas in i pipelinen. Detta är:

EIP/IP kommandopekarregister;

    EFLAGS/FLAGGS flaggregister.

Med hjälp av dessa register kan du få information om resultatet av kommandoexekveringen och påverka tillståndet för själva mikroprocessorn.

EIP/IP (instruktionspekarregister) - pekare kommandon. EIP/IP-registret är 32 eller 16 bitar brett och innehåller förskjutningen av nästa instruktion som ska exekveras i förhållande till innehållet i CS-segmentregistret i det aktuella instruktionssegmentet. Detta register är inte direkt tillgängligt, men det ändras genom hoppinstruktioner.

EFLAGS/FLAGGS (Flaggaregister) - Registrera flaggor. Bitdjup 32/16 bitar. Individuella bitar i detta register har ett specifikt funktionellt syfte och kallas flaggor. En flagga är en bit som är satt till 1 ("flaggan är satt") om något villkor är sant och 0 ("flaggan rensas") annars. Den nedre delen av detta register är helt analog med FLAGS-registret för i8086.

1.1.3 Flaggregister

Flaggregistret är 32-bitars och har namnet EFLAGS (Fig. 1). Enskilda bitar i registret har ett specifikt funktionssyfte och kallas flaggor. Var och en av dem tilldelas ett specifikt namn (ZF, CF, etc.). De lägre 16 bitarna av EFLAGS representerar 16-bitars FLAGS-registret som används vid exekvering av program skrivna för i086- och i286-mikroprocessorerna.

Fig.1 Register över flaggor

Vissa flaggor kallas villkorsflaggor; de ändras automatiskt när kommandon körs och fixar vissa egenskaper för deras resultat (till exempel om det är lika med noll). Andra flaggor kallas statsflaggor; de ändras från programmet och påverkar processorns vidare beteende (till exempel blockerar de avbrott).

Skick flaggor:

CF (bärflagga) - bär flagga. Det tar värdet 1 om, när man adderar heltal, en bärenhet uppträdde som inte "passade" in i bitrutnätet, eller om, när man subtraherar tal utan tecken, den första av dem var mindre än den andra. I skiftkommandona läggs biten som är off-grid in i CF. CF fixar också funktionerna i multiplikationsinstruktionen.

OF (spillflagga) översvämningsflagga. Den sätts till 1 om man, när man adderar eller subtraherar heltal med ett tecken, resultatet erhålls, modulo överskrider det tillåtna värdet (mantissan rann över och den "klättrade" in i teckenbiten).

ZF (nollflagga) noll flagga. Sätt till 1 om resultatet av kommandot är 0.

SF (SIgn flagga) - flagga tecken. Ställ in på 1 om operationen på signerade nummer resulterar i ett negativt resultat.

PF (paritetsflagga) - flagga paritet. Det är lika med 1 om resultatet av nästa kommando innehåller ett jämnt antal binära ettor. Det beaktas vanligtvis endast under I/O-operationer.

AF (hjälpbärflagga) - extra bärflagga. Fixar funktionerna för att utföra operationer på binära decimala tal.

Statusflaggor:

DF (riktningsflagga) riktning flagga. Ställer in riktningen för skanningslinjer i strängkommandon: med DF=0 skannas linjer "framåt" (från början till slut), med DF=1 - i motsatt riktning.

IOPL (input/output behörighetsnivå) - I/O-behörighetsnivå. Används i mikroprocessorns skyddade läge för att kontrollera åtkomst till I/O-kommandon, beroende på privilegiet för uppgiften.

NT (kapslade uppgift) uppgift häckande flagga. Används i mikroprocessorns skyddade läge för att registrera det faktum att en uppgift är kapslad i en annan.

Systemflagga:

IF (avbrottsflagga) - avbryta flaggan. Med IF=0 slutar processorn att svara på avbrott som kommer till den, med IF=1 tas blockeringen av avbrott bort.

TF (fällflagga) spåra flaggan. Med TF=1, efter att ha utfört varje instruktion, gör processorn ett avbrott (med nummer 1), som kan användas vid felsökning av ett program för att spåra det.

RF (återuppta flagga) återuppta flagga. Används vid hantering av avbrott från felsökningsregister.

VM (virtuellt 8086-läge) - virtuell 8086 flagga. 1 - processorn arbetar i virtuellt läge 8086. 0 - processorn arbetar i verkligt eller skyddat läge.

AC (Alignment check) - uppriktningskontrollflagga. Designad för att möjliggöra inriktningskontroll vid åtkomst till minne.

      Organisation av minnet.

Det fysiska minnet som mikroprocessorn har tillgång till kallas fungerande minne ( eller random access memory BAGGE). RAM är en kedja av byte som har sin egen unika adress (dess nummer), som kallas fysisk. Utbudet av fysiska adresser är från 0 till 4 GB. Minneshanteringsmekanismen är helt hårdvarubaserad.

Mikroprocessorn stöder flera modeller av RAM-användning i hårdvara:

    segmenterad modell. I denna modell är programminnet uppdelat i sammanhängande minnesområden (segment), och själva programmet kan bara komma åt data som finns i dessa segment;

    sidmodell. I det här fallet betraktas RAM som en uppsättning block med en fast storlek på 4 KB. Den huvudsakliga tillämpningen av denna modell är relaterad till organisationen av virtuellt minne, vilket gör att program kan använda mer minnesutrymme än mängden fysiskt minne. För en Pentium-mikroprocessor kan storleken på det möjliga virtuella minnet vara upp till 4 TB.

Användningen och implementeringen av dessa modeller beror på mikroprocessorns driftläge:

    Verkligt adressläge (riktigt läge). Läget liknar driften av i8086-processorn. Krävs för driften av program utformade för tidiga processormodeller.

    Skyddat läge. I skyddat läge blir det möjligt att multitaska informationsbearbetning, minnesskydd med hjälp av en fyra-nivå privilegiemekanism och dess personsökning.

    Virtuellt 8086-läge. I detta läge blir det möjligt att köra flera program för i8086. I det här fallet kan real-mode-program fungera.

Segmentering är en adresseringsmekanism som säkerställer att det finns flera oberoende adressutrymmen. Ett segment är ett oberoende, hårdvarustödt minnesblock.

Varje program i det allmänna fallet kan bestå av valfritt antal segment, men det har direkt tillgång till de tre huvudsakliga: kod, data och stack - och från ett till tre ytterligare datasegment. Operativsystemet placerar programsegment i RAM vid vissa fysiska adresser och placerar sedan värdena för dessa adresser i lämpliga register. Inom ett segment tillträder programmet adresser relativt segmentets början linjärt, det vill säga börjar vid adress O och slutar vid en adress som är lika med segmentets storlek. Släktadress eller partiskhet, som mikroprocessorn använder för att komma åt data inom ett segment kallas effektiv.

Bildande av en fysisk adress i verkligt läge

I verkligt läge är det fysiska adressintervallet från 0 till 1 MB. Den maximala segmentstorleken är 64 kB. När man hänvisar till en specifik fysisk adress RAM bestäms av adressen till början av segmentet och förskjutningen inom segmentet. Segmentstartadressen hämtas från motsvarande segmentregister. I detta fall innehåller segmentregistret endast de övre 16 bitarna av den fysiska adressen i början av segmentet. De saknade nedre fyra bitarna i 20-bitarsadressen erhålls genom att skifta segmentregistrets värde till vänster med 4 bitar. Skiftoperationen utförs i hårdvara. Det resulterande 20-bitarsvärdet är den faktiska fysiska adressen som motsvarar början av segmentet. d.v.s fysisk adress specificeras som ett "segment:offset"-par, där "segment" är de första 16 bitarna i startadressen för minnessegmentet som cellen tillhör, och "offset" är 16-bitarsadressen för denna cell, räknat från början av detta minnessegment (värde 16*segment +offset ger cellens absoluta adress). Om till exempel värdet 1234h lagras i CS-registret, så definierar adressparet 1234h:507h en absolut adress lika med 16*1234h+507h =12340h+507h = 12847h. Ett sådant par skrivs i form av ett dubbelord och (som för siffror) i en "inverterad" form: det första ordet innehåller förskjutningen, och det andra - segmentet, vart och ett av dessa ord i sin tur representeras i "omvänd" form. Till exempel skulle paret 1234h:5678h skrivas så här:| 78 | 56| 34 | 12|.

Denna mekanism för bildandet av en fysisk adress låter dig göra programvaran flyttbar, det vill säga inte beroende av specifika nedladdningsadresser i RAM.

Ämne 2.5 Processorprogrammering Grundläggande

När programmets längd ökar blir det svårare att komma ihåg koderna för olika operationer. Mnemonics ger lite hjälp i detta avseende.

Det symboliska instruktionskodningsspråket kallas assemblerare.

assembleringsspråkär ett språk där varje påstående motsvarar exakt en maskininstruktion.

hopsättning kallas att konvertera ett program från assemblerspråk, d.v.s. förbereda ett program på maskinspråk genom att ersätta symboliska namn på operationer med maskinkoder och symboliska adresser med absoluta eller relativa tal, samt inkludera biblioteksprogram och generera sekvenser av symboliska instruktioner genom att specificera specifika parametrar i mikroinstruktioner. Detta program placeras vanligtvis i ROM eller läggs in i RAM från något externt medium.

Assembly språk har flera funktioner som skiljer det från högnivåspråk:

1. Detta är en en-till-en-överensstämmelse mellan assembly-språkpåståenden och maskininstruktioner.

2. Assemblyspråksprogrammeraren har tillgång till alla objekt och kommandon som finns på målmaskinen.

En förståelse för grunderna för programmering i maskinorienterade språk är användbar för:



Bättre förståelse för PC-arkitektur och bättre användning av datorer;

Att utveckla mer rationella strukturer av algoritmer för program för att lösa tillämpade problem;

Möjligheten att visa och korrigera körbara program med tilläggen .exe och .com, kompilerade från alla högnivåspråk, i händelse av förlust av källprogrammen (genom att anropa dessa program till DEBUG-programfelsökningen och dekompilera deras visning i assemblerspråk );

Att sammanställa program för att lösa de mest kritiska uppgifterna (ett program som kompilerats på ett maskinorienterat språk är vanligtvis mer effektivt - kortare och snabbare med 30-60 procent av programmen som erhålls som ett resultat av översättning från högnivåspråk)

För implementering av procedurer som ingår i huvudprogrammet som separata fragment i händelse av att de inte kan implementeras vare sig på det högnivåspråk som används eller med OS-tjänstprocedurer.

Ett assemblerspråksprogram kan bara köras på datorer i samma familj, medan ett program skrivet på ett högnivåspråk potentiellt kan köras på olika maskiner.

Assembly-språkalfabetet består av ASCII-tecken.

Tal är bara heltal. Skilja på:

Binära tal som slutar med bokstaven B;

Decimaltal som slutar med D;

Hexadecimala tal som slutar med bokstaven N.

RAM, register, datarepresentation

För en viss serie riksdagsledamöter används ett individuellt programmeringsspråk - assemblerspråk.

Assembly språk intar en mellanposition mellan maskinkoder och högnivåspråk. Programmering på detta språk är lättare. Ett assemblerspråksprogram använder kapaciteten hos en viss maskin (mer exakt, MP) mer rationellt än ett program på ett högnivåspråk (vilket är lättare för en programmerare än assembler). Vi kommer att överväga de grundläggande principerna för programmering i maskinorienterade språk med hjälp av assemblerspråket för MP KR580VM80 som ett exempel. För programmering i språket används en allmän teknik. Specifika tekniker för inspelning av program är relaterade till arkitekturen och kommandosystemets egenskaper hos mål-MP.

Mjukvarumodell av ett mikroprocessorsystem baserat på MP KR580VM80

Programmodellen för MPS i enlighet med figur 1

MP-portar minne

S Z AC P C

Bild 1

Ur programmerarens synvinkel har KR580VM80 MP följande programtillgängliga register.

MEN– 8-bitars ackumulatorregister. Det är MP:s huvudregister. Varje operation som utförs i ALU involverar att placera en av operanderna som ska behandlas i ackumulatorn. Resultatet av operationen i ALU lagras också vanligtvis i A.

B, C, D, E, H, L– 8-bitars register för allmänna ändamål (RON). MP internminne. Designad för att lagra den bearbetade informationen, såväl som resultatet av operationen. Vid bearbetning av 16-bitars ord från register bildas paren BC, DE, HL, och dubbelregistret kallas första bokstaven - B, D, H. I registerparet är det första registret det högsta. H, L-registren, som används både för att lagra data och för att lagra 16-bitars adresser för RAM-celler, har en speciell egenskap.

FL– flaggregister (funktionsregister) Ett 8-bitars register som lagrar fem egenskaper av resultatet av att utföra aritmetiska och logiska operationer i MP. FL-format enligt bilden

Bit C (CY - bär) - bär, satt till 1 om det fanns en bäring från bytens höga ordning vid utförande av aritmetiska operationer.

Bit P (paritet) - paritet, sätts till 1 om antalet enheter i bitarna i resultatet är jämnt.

AC-biten är en extra överföring, utformad för att lagra överföringsvärdet från den nedre tetraden av resultatet.

Bit Z (noll) - sätt till 1 om resultatet av operationen är 0.

S-biten (tecken) sätts till 1 om resultatet är negativt och till 0 om resultatet är positivt.

SP-- stackpekaren, ett 16-bitars register, är utformad för att lagra adressen till minnesplatsen där den sista byten som skrevs in i stacken skrevs.

RS– programräknare (programräknare), 16-bitars register, utformad för att lagra adressen till nästa exekverbara instruktion. Programräknarens innehåll ökas automatiskt med 1 omedelbart efter att nästa instruktionsbyte har hämtats.

I det initiala minnesområdet på adressen 0000H - 07FF finns ett kontrollprogram och demoprogram. Detta är ROM-området.

0800 - 0AFF - adressområde för inspelning av de program som studeras. (BAGGE).

0В00 - 0ВВ0 - adressområde för dataregistrering. (BAGGE).

0BB0 är startadressen för stacken. (BAGGE).

Stack är ett speciellt organiserat område av RAM designat för tillfällig lagring av data eller adresser. Det sista numret som skjuts upp på högen är det första numret som hoppade av stapeln. Stackpekaren lagrar adressen för den sista stackplatsen där informationen lagras. När en subrutin anropas lagras returadressen till huvudprogrammet automatiskt i stacken. Som regel, i början av varje subrutin, lagras innehållet i alla register som är involverade i dess exekvering i stacken, och i slutet av subrutinen återställs de från stacken.

Assembly Language Data Format och kommandostruktur

Minne MP KR580VM80 är en array av 8-bitars ord som kallas bytes. Varje byte har sin egen 16-bitars adress som bestämmer dess position i sekvensen av minnesceller. MP kan adressera 65536 byte minne, som kan innehålla både ROM och RAM.

Dataformat

Data lagras i minnet som 8-bitars ord:

D7 D6 D5 D4 D3 D2 D1 D0

Den minst signifikanta biten är bit 0, den mest signifikanta biten är bit 7.

Kommandot kännetecknas av formatet, d.v.s. antalet bitar som tilldelats för det, vilka är uppdelade byte-för-byte i vissa funktionella fält.

Kommandoformat

MP KR580VM80-kommandon har en, två eller tre-byte format. Multi-byte instruktioner måste placeras i angränsande PLs. Formatet på kommandot beror på detaljerna för operationen som utförs.

Den första byten av kommandot innehåller op-koden skriven i mnemonisk form.

Det definierar formatet för kommandot och de åtgärder som måste utföras av MP på data under dess exekvering, och metoden för adressering, och kan också innehålla information om var data finns.

Den andra och tredje byten kan innehålla data som ska opereras på, eller adresser som indikerar platsen för data. De data som operationer utförs på kallas operander.

Single-byte kommandoformat enligt figur 2

Figur 4

I monteringsspråksinstruktioner har opkoden en förkortad form för att skriva engelska ord - en mnemonisk notation. Mnemonics (från grekiskans mnemonics - konsten att memorera) gör det lättare att komma ihåg kommandon efter deras funktionella syfte.

Före körning översätts källprogrammet med hjälp av ett översättningsprogram, kallat assembler, till språket för kodkombinationer - maskinspråk, i denna form placeras det i MP:ns minne och används sedan när kommandot utförs.


Adresseringsmetoder

Alla operandkoder (ingång och utgång) måste finnas någonstans. De kan finnas i MP:s interna register (det bekvämaste och snabbaste alternativet). De kan placeras i systemminnet (det vanligaste alternativet). Slutligen kan de finnas i I/O-enheter (det sällsynta fallet). Placeringen av operanderna bestäms av instruktionskoden. Det finns olika metoder genom vilka instruktionskoden kan bestämma var den ingående operanden ska hämtas från och var den ska placeras. Dessa metoder kallas adresseringsmetoder.

För MP KR580VM80 finns det följande adresseringsmetoder:

Omedelbar;

Registrera;

indirekt;

Stack.

Omedelbar adressering förutsätter att operanden (ingången) finns i minnet omedelbart efter instruktionskoden. Operanden är vanligtvis en konstant som behöver skickas någonstans, läggas till något, etc. data finns i den andra eller andra och tredje byten av instruktionen, med lågdatabyten i den andra kommandobyten och högdatabyten i den tredje kommandobyten.

Hetero (aka absolut) adressering förutsätter att operanden (ingång eller utgång) finns i minnet på adressen vars kod finns inuti programmet omedelbart efter instruktionskoden. Används i tre-byte-kommandon.

Registrera adressering förutsätter att operanden (ingång eller utgång) finns i det interna MP-registret. Används i enkelbyte-kommandon

Indirekt (implicit) adressering förutsätter att MP:ns interna register inte är operanden i sig, utan dess adress i minnet.

Stack adressering förutsätter att kommandot inte innehåller en adress. Adressering till minnesceller med innehållet i 16-bitars SP-registret (stackpekare).

Kommandosystem

MP-kommandosystemet är en komplett lista över elementära åtgärder som MP kan utföra. MP som styrs av dessa kommandon utför enkla åtgärder, såsom elementära aritmetiska och logiska operationer, dataöverföring, jämförelse av två värden, etc. Antalet kommandon för MP KR580VM80 är 78 (inklusive modifieringar 244).

Det finns följande grupper av kommandon:

Dataöverföring;

Aritmetisk;

Hjärngymnastik;

Hoppkommandon;

Kommandon för input-output, kontroll och arbete med stacken.


Symboler och förkortningar som används för att beskriva kommandon och skriva program

Symbol Minskning
ADDR 16 bitars adress
DATA 8-bitars data
DATA 16 16 bitars data
HAMN 8-bitars I/O-adress (I/O-enheter)
BYTE 2 Andra kommandobyte
BYTE 3 Tredje kommandobyte
R, Rl, R2 Ett av registren: A, B, C, D, E, H, L
RP Ett av registerparen: B - sätter ett flygplanspar; D - sätter ett par av DE; H - anger ett par HL
RH Första registret av paret
RL Andra register av paret
Λ Boolesk multiplikation
V Boolean addition
Modulo två tillägg
M Minnescell vars adress anger innehållet i HL-registerparet, dvs M = (HL)
Dela med sig