Instruktionsstrukturen för assemblerspråk innehåller. Assembler Commands (föreläsning)

Assembler Commands (föreläsning)

FÖRELÄSNINGSPLAN

1. De viktigaste verksamhetsgrupperna.

Pentium.

1. Grundläggande verksamhetsgrupper

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

Vidarebefordran,

Aritmetiska operationer,

Logiska operationer,

Skiftoperationer,

Jämförelse och testoperationer,

Bitoperationer,

Programkontrolloperationer;

Processorstyrning.

2. Mnemokoder för processorkommandon Pentium

Vid beskrivning av kommandon används vanligtvis deras mnemoniska symboler (mnemoniska koder), som används för att ställa in kommandot vid programmering på Assembly -språk. För olika versioner Assembler mnemoniska koder för vissa kommandon kan skilja sig åt. Till exempel, för ett kommando att anropa en subrutin, används mnemonkodenRING UPP eller JSR ("Hoppa till SubRoutine”). Men de mnemoniska koderna för de flesta kommandon för huvudtyperna av mikroprocessorer sammanfaller eller skiljer sig något, eftersom de är förkortningar av motsvarande engelska ord som avgör vilken operation som utförs. Tänk på de mnemoniska koderna för kommandon som används för processorer Pentium.

Vidarebefordra kommandon. Huvudlaget i denna grupp är lagetMOV , som tillhandahåller dataöverföring mellan två register eller mellan ett register och en minnescell. Vissa mikroprocessorer implementerar överföring mellan två minnesceller, samt bulköverföring av innehållet i flera register från minnet. Till exempel mikroprocessorer i 68-familjen xxx från Motorola kör kommandotFLYTTA , som tillhandahåller överföring från en minnescell till en annan, och kommandotMOVEM , som skriver till minnet eller laddar ur minnet innehållet i en given uppsättning register (upp till 16 register). KommandoXCHG gör ömsesidigt utbyte av innehållet i två register i processorn eller ett register och en minnescell.

Mata in kommandon I och uttag UT överföra data från processorregistret till en extern enhet eller ta emot data från en extern enhet till ett register. Dessa kommandon anger antalet gränssnittsenheter (I / O -port) genom vilka data överförs. Observera att många mikroprocessorer inte har särskilda instruktioner för åtkomst externa enheter... I detta fall utförs datainmatning och -utmatning i systemet med kommandotMOV , där adressen till den erforderliga gränssnittsenheten är inställd. Således adresseras den externa enheten som en minnescell, och en viss sektion tilldelas i adressutrymmet, i vilken adresserna till gränssnittsenheterna (portarna) som är anslutna till systemet finns.

Aritmetiska kommandon. Huvudkommandona i denna grupp är kommandona addition, subtraktion, multiplikation och division, som har ett antal alternativ. Tilläggskommandon LÄGG TILL och subtraktion SUB utföra lämpliga operationer medcbesatt av två register, ett register och en minnesplats, eller använder en omedelbar operand. Kommandon AD C , SB B göra addition och subtraktion med hänsyn till attributets värdeC, som ställs in när överföringen bildas under utförandet av den föregående operationen. Med hjälp av dessa kommandon realiseras den sekventiella additionen av operander, vars antal bitar överstiger processorns kapacitet. Kommando NEG ändrar operandens tecken och översätter den till en komplementkod.

Multiplikations- och divisionsoperationer kan utföras på signerade nummer (kommandonI MUL, I DIV ) eller osignerade (kommandon MUL, DIV En av operanderna är alltid tilldelad i ett register, den andra kan vara i ett register, minnesplats eller en direkt operand. Resultatet av operationen finns i registret. Vid multiplicering (kommandonMUL , IMUL ), är resultatet ett tvåsiffrigt resultat, för vilket två register används. Vid delning (kommandonDIV , IDIV ) som utdelning används en tvåsiffrig operand, placerad i två register, och som ett resultat skrivs kvoten och resten i två register.

booleska kommandon ... Nästan alla mikroprocessorer utför logiska operationer AND, OR, Exclusive OR, som utförs på samma bitar av operanderna 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. Kommando INTE inverterar värdet för varje bit av operanden.

Skift kommandon... Mikroprocessorer utför aritmetiska, logiska och cykliska förskjutningar av de adresserade operanderna med en eller flera bitar. Den skiftade operanden 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. Överföringsfunktionen är vanligtvis involverad i genomförandet av skiftet.Ci statusregistret (SR eller EFLAGS), i vilken den sista biten av operanden finns, som avlägsnas från registret eller minnescellen.

Jämför och testa lag ... Jämförelse av operander görs vanligtvis med kommandotCMP , som subtraherar operander med inställning av de karakteristiska värdena N, Z, V, C i statusregistret enligt resultatet. I detta fall sparas inte resultatet av subtraktionen och operandernas värden ändras inte. Efterföljande analys av de erhållna funktionsvärdena kan du bestämma det relativa värdet (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

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

Bitoperationskommandon ... Dessa kommandon anger värdet på egenskapenCi statusregistret enligt värdet på den testade bitenmiljarder i den adresserade operanden. I vissa mikroprocessorer, enligt resultatet av att testa biten, sätts tecknetZ... Testbitsnummernställs antingen av innehållet i registret som anges i kommandot, eller av en direkt operand.

Kommandona i denna grupp implementerar olika alternativ för att ändra den testade biten. BT håller värdet på denna bit oförändrat. B T S efter testning ställer in värdet miljarder= 1 och kommandot B T C - mening miljarder= 0 kommando B T C inverterar värdet på bn -biten efter att ha testat den.

Programkontrolloperationer. Ett stort antal kommandon används för att styra programmet, bland annat:

- ovillkorliga kontrollöverföringskommandon;

- villkorliga hoppkommandon;

- lag för att organisera programcykler;

- avbryta kommandon;

- kommandon för att ändra funktioner.

Ovillkorlig överföring av kontroll utförs av kommandotJMP som laddas in i programräknarenPCnytt innehåll, vilket är adressen till nästa kommando som ska utföras. Den här adressen anges antingen direkt i kommandotJMP (direkt adressering), eller beräknad som summan av det aktuella innehålletPCoch kommandoförskjutningen, som är ett signerat nummer (relativ adressering). EftersomPCinnehåller adressen för nästa programkommando, så ställer den sista metoden hoppadressen förskjuten från nästa adress med ett visst antal byte. Med en positiv offset utförs övergången till de efterföljande kommandona i programmet, med en negativ offset - till de föregående.

Ett subrutinsamtal görs också genom ovillkorlig överföring av kontroll med kommandotRING UPP (eller JSR ). Men i det här fallet, innan du laddar inPC nytt innehåll som anger adressen för det första kommandot i delrutan, är det nödvändigt att spara dess nuvarande värde (adressen för nästa kommando) för att säkerställa en återgång till huvudprogrammet (eller till den föregående delrutinen vid kapning av underprogram) efter att subrutinen har körts. Villkorade grenkommandon (programgrenar) laddas inPCnytt innehåll om vissa villkor är uppfyllda, som vanligtvis sätts i enlighet med det aktuella värdet på olika tecken i statusregistret. Om villkoret inte är uppfyllt utförs nästa programkommando.

Karakteristiska hanteringskommandon ger skrivning - läsning av innehållet i statusregistret, där egenskaperna lagras, samt ändrar värdena för individuella egenskaper. Till exempel i Pentium -processorer implementeras kommandona LAHF och SAHF som laddar den låga byten som innehåller tecknen från statusregistret EFLAG till den låga byten i registret EAX och vaddering av den låga byten EFLAGS från registret E AX.. Lag CLC, STC utför inställningen av värdena för överföringsattributet CF = 0, CF = 1 och kommandot CMC orsakar inversion av värdet för detta attribut. Eftersom funktionerna bestämmer programmets genomförande under villkorliga hopp, används kommandon för att ändra funktionerna vanligtvis för att styra programmet.

CPU -kommandon ... Denna grupp inkluderar stoppkommandon, inga operationer och ett antal kommandon som bestämmer processorns driftsläge eller dess enskilda block. KommandoHLT avslutar körningen av programmet och sätter processorn i ett stoppläge, från vilket utgången inträffar när en avbrotts- eller omstartssignal tas emot (Återställa). Kommando NOP ("Tomt" kommando), som inte orsakar utförandet av några operationer, används för att genomföra programfördröjningar eller fylla i luckorna som bildas i programmet.

Specialkommandon CLI, STI inaktivera och aktivera service av avbrottsförfrågningar. I processorer Pentium styrbiten (flaggan) används för dettaOM i registret EFLAGS.

Många moderna mikroprocessorer utför ett identifieringskommando som tillåter en användare eller annan enhet att få information om vilken typ av processor som används i ett givet system. I processorer Pentuim kommandot används för detta CPUID , när den körs, går den nödvändiga informationen om processorn till registren EAX,EBX,ECX,EDX och kan sedan läsas av användaren eller operativsystemet.

Beroende på de driftsätt som implementeras av processorn och de angivna typerna av bearbetade data kan uppsättningen körbara kommandon utökas avsevärt.

Vissa processorer utför aritmetiska operationer med binära decimaltal eller utför speciella kommandon för att korrigera resultatet vid bearbetning av sådana nummer. Många högpresterande processorer inkluderar FPU - nummerbehandlingsenhet c Flytpunkt.

Ett antal moderna processorer implementerar gruppbehandling av flera heltal eller tal c Flytpunkt med en enda instruktion SIMD (“Single Instruction - Multiple Data ”) -“ Ett kommando - Massor av data ”. Samtidigt utförande av operationer på flera operander förbättrar processorns prestanda avsevärt vid arbete med video- och ljuddata. Sådana operationer används i stor utsträckning för bildbehandling, ljudsignaler och andra applikationer. För att utföra dessa operationer har speciella block införts i processorerna som implementerar motsvarande uppsättningar instruktioner, som i olika typer av processorer ( Pentium, Athlon) namngavsMMX (“ Milti- Medieförlängning ”) - Multimedia -tillägg,SSE(“Streaming SIMD Extension”) - Streaming SIMD - förlängning, “3 DFörlängning- 3D -expansion.

Ett kännetecken för företagets processorer Intel , från och med modell 80286, tillhandahålls prioritetskontroll vid åtkomst av 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 antagna prioritetsåtkomstalgoritmen.

Av ändamål kan kommandon särskiljas (inom parentes är exempel på mnemoniska driftskoder för assembler -kommandon på en dator som IBM PC):

l utföra aritmetiska operationer (ADD och ADC - addition och addition med överföring, SUB och SBB - subtraktion och subtraktion med ett lån, MUL och IMUL - osignerad och signerad multiplikation, DIV och IDIV - osignerade och signerade divisioner, CMP - jämförelser etc.) ;

l utföra logiska operationer (OR, AND, NOT, XOR, TEST, etc.);

l dataöverföring (MOV - skicka, XCHG - utbyte, IN - gå in i mikroprocessorn, OUT - utmatning från mikroprocessorn, etc.);

l överföring av kontroll (programgrenar: JMP - ovillkorlig gren, CALL - proceduranrop, RET - retur från proceduren, J * - villkorad gren, LOOP - loop -kontroll, etc.);

l bearbetning av teckensträngar (MOVS - överföringar, CMPS - jämförelser, LODS - nedladdningar, SCAS - skanningar. Dessa kommandon används vanligtvis med prefixet (repetitionsmodifierare) REP;

l programavbrott (INT - mjukvaruavbrott, INTO - villkorliga avbrott vid spill, IRET - återgång från avbrott);

l mikroprocessorstyrning (ST * och CL * - inställning och rensning av flaggor, HLT -stopp, Vänta - väntar, NOP - tomgång, etc.).

En komplett lista över assembler-kommandon finns på gång.

Dataöverföringskommandon

l MOV dst, src - dataöverföring (flytt - överför från src till dst).

Överföringar: en byte (om src och dst är i byte -format) eller ett ord (om src och dst är i ordformat) mellan registren eller mellan register och minne, och skriver också ett omedelbart värde till ett register eller minne.

DST- och src -operanderna måste ha samma byte- eller ordformat.

Src kan vara av typen: r (register) - register, m (minne) - minne, i (impedans) - omedelbart värde. Dst kan vara av typen r, m. Du kan inte använda följande operander i ett kommando: rsegm tillsammans med i; två operander av typ m och två operander av typ rsegm). I operand kan också vara ett enkelt uttryck:

mov AX, (152 + 101B) / 15

Uttrycket utvärderas endast under översättning. Byter inte flaggor.

l PUSH src - trycka ett ord på högen (push - trycka igenom; tryck på stacken från src). Skjuter innehållet i src till toppen av stapeln-alla 16-bitarsregister (inklusive segment) eller två minnesplatser som innehåller ett 16-bitars ord. Flaggor ändras inte;

l POP dst - pop ett ord från bunten (pop - pop; läs från bunten till dst). Pops ett ord från toppen av stacken och placerar det i dst - valfritt 16 -bitars register (inklusive segment) eller två minnesplatser. Flaggorna ändras inte.

För att maskinen ska kunna utföra mänskliga kommandon på hårdvarunivå är det nödvändigt att ställa in en viss sekvens av åtgärder på språket "nollor och enor". Monteraren kommer att bli en assistent i denna fråga. Det är ett verktyg som fungerar med översättning av kommandon till maskinspråk. Men att skriva ett program är en mycket mödosam och komplex process. Detta språk är inte avsett att skapa lätta och enkla handlingar. För närvarande kan alla programmeringsspråk som används (Assembler fungerar bra) låta dig skriva speciella effektiva uppgifter som i hög grad påverkar maskinvarans funktion. Huvudsyftet är att skapa mikroinstruktioner och små koder. Detta språk ger fler möjligheter än till exempel Pascal eller C.

En kort beskrivning av Assembler-språk

Alla programmeringsspråk är indelade i nivåer: låg och hög. Vilket som helst av det syntaktiska systemet i "familjen" av Assembler skiljer sig genom att det på en gång förenar några av fördelarna med de mest utbredda och moderna språken. De har gemensamt med andra att datasystemet kan användas fullt ut.

En utmärkande egenskap hos kompilatorn är dess användarvänlighet. I detta skiljer det sig från dem som bara arbetar med höga nivåer. Om du tar hänsyn till något sådant programmeringsspråk är Assembler dubbelt så snabb och bättre. Det tar inte för lång tid att skriva ett lätt program i den.

Kort om språkets struktur

Om vi ​​pratar i allmänhet om arbetet och strukturen för språkets funktion, kan vi med säkerhet säga att dess kommandon helt överensstämmer med processorns. Det vill säga att monteraren använder mnemoniska koder som är mest praktiska för människor att skriva.

Till skillnad från andra programmeringsspråk använder Assembler specifika etiketter istället för adresser för att skriva minnesplatser. De översätts till de så kallade direktiven tillsammans med kodexekveringsprocessen. Det här är relativa adresser som inte påverkar processorns funktion (de översätts inte till maskinspråk), men är nödvändiga för igenkänning av själva programmeringsmiljön.

Varje processorlinje har sin egen. I denna situation kommer alla processer, inklusive den översatta, att vara korrekta

Monteringsspråk har flera syntaxer, som kommer att diskuteras i artikeln.

Plusserna med språket

Den viktigaste och bekvämaste funktionen i monteringsspråket är att du kan skriva vilket program som helst för processorn i den, vilket kommer att vara mycket kompakt. Om koden visar sig vara enorm, omdirigeras vissa processer till RAM. Samtidigt utför de allt tillräckligt snabbt och utan misslyckanden, såvida de naturligtvis inte styrs av en kvalificerad programmerare.

Drivrutiner, operativsystem, BIOS, kompilatorer, tolkar etc. är alla assemblerprogram.

När du använder en demonterare som kan översättas från maskin till maskin kan du enkelt förstå hur den eller den systemuppgiften fungerar, även om det inte finns någon förklaring till det. Detta är dock bara möjligt om programmen är lätta. Tyvärr är det ganska svårt att förstå icke-triviala koder.

Nackdelar med språket

Tyvärr är det svårt för nybörjare (och ofta proffs) att analysera språket. Monteraren kräver en detaljerad beskrivning av det nödvändiga kommandot. Behovet av att använda maskininstruktioner ökar sannolikheten för felaktiga handlingar och komplexiteten i utförandet.

För att skriva även det enklaste programmet måste en programmerare vara kvalificerad och hans kunskapsnivå är tillräckligt hög. Den genomsnittlige specialisten skriver tyvärr ofta dåliga koder.

Om plattformen som programmet skapas för uppdateras måste alla kommandon skrivas om manuellt - detta krävs av själva språket. Monteraren stöder inte funktionen av automatisk reglering av processernas hälsa och byte av element.

Språkkommandon

Som nämnts ovan har varje processor sin egen uppsättning instruktioner. De enklaste elementen som känns igen av någon typ är följande koder:


Använda direktiv

Att programmera mikrokontroller på språket (Assembler tillåter det och klarar att fungera perfekt) för den lägsta nivån i de flesta fall slutar bra. Det är bäst att använda resursbegränsade processorer. För 32-bitars teknik är detta språk utmärkt. Du kan ofta se direktiv i koder. Vad är detta? Och vad används den till?

Först måste du betona att direktiv inte översätts till maskinspråk. De styr hur kompilatorn fungerar. Till skillnad från kommandon skiljer sig dessa parametrar med olika funktioner inte på grund av olika processorer utan på grund av en annan översättare. Bland huvuddirektiven finns följande:


namns ursprung

Varför fick språket sitt namn - "Assembler"? Vi pratar om en översättare och en kompilator som krypterar data. På engelska betyder Assembler inget annat än en assembler. Programmet monterades inte för hand, en automatisk struktur användes. För närvarande har skillnaden mellan termerna redan försvunnit bland användare och specialister. Monteringsspråk kallas ofta programmeringsspråk, även om det bara är ett verktyg.

På grund av det allmänt accepterade samlingsnamnet har vissa människor det felaktiga beslutet att det finns ett enda lågnivåspråk (eller standardnormer för det). För att programmeraren ska förstå vilken struktur vi talar om är det nödvändigt att klargöra för vilken plattform ett visst monteringsspråk används.

Makroverktyg

Monteringsspråk, som är relativt nya, har makroanläggningar. De gör programmet lättare att skriva och köra. På grund av deras närvaro kör översättaren den skrivna koden många gånger snabbare. När du skapar ett villkorligt urval kan du skriva ett stort kommandoblock, men det är lättare att använda makroverktyg. De låter dig snabbt växla mellan åtgärder, om ett villkor uppfylls eller inte.

När man använder direktiv för makrospråket får programmeraren assembler -makron. Ibland kan det användas i stor utsträckning, och ibland reduceras dess funktionalitet till ett enda kommando. Deras närvaro i koden gör det lättare att arbeta med det, gör det tydligare och mer intuitivt. Men du bör fortfarande vara försiktig - i vissa fall förvärrar makron tvärtom situationen.

Kursarbete

Inom disciplinen "Systemprogrammering"

Ämne nummer 4: "Lösa problem för procedurer"

Alternativ 2

ÖSTRA SIBERIANSKA STATENS UNIVERSITET

TEKNIK OCH KONTROLL

____________________________________________________________________

TEKNIKKOLLEGE

TRÄNING

för termpapper

Disciplin:
Ämne: Lösa problem vid procedurer
Skådespelare: Glavinskaya Arina Aleksandrovna
Chef: DambaevaSesegma Viktorovna
Sammanfattningen av arbetet: studier av rutiner i samlingsspråk,
problemlösning med hjälp av subrutiner
1. Teoretisk del: Grundläggande information om församlingsspråket (set
kommandon etc.), organisering av underrutiner, metoder för att skicka in parametrar
i underrutiner
2. Praktisk del: Utveckla två subrutiner, varav den ena konverterar en given bokstav till versaler (inklusive för ryska bokstäver), och den andra konverterar bokstaven till gemener.
konverterar en given bokstav till stora och den andra omvandlar bokstaven till gemener.
konverterar en bokstav till gemener.
Tidsfrister för projektet enligt schemat:
1. Teoretisk del - 30% med 7 veckor.
2. Praktisk del - 70% vid 11 veckor.
3. Skydd - 100% med 14 veckor.
Krav för registrering:
1. Kursprojektets uppgörelse och förklaring bör presenteras i
elektroniska och papperskopior.
2. Rapportens volym bör vara minst 20 maskinskrivna sidor exklusive bilagor.
3. RPZ är upprättad i enlighet med GOST 7.32-91 och undertecknad av chefen.

Arbetschef __________________

Entreprenör __________________

Utgivningsdatum " 26 " september 2017 G.


Introduktion. 2

1.1 Grundläggande information om Assembler-språket. 3

1.1.1 Kommandoset. 4

1.2 Organisation av subrutiner på Assembly-språk. 4

1.3 Metoder för att skicka parametrar i subrutiner. 6

1.3.1 Överföra parametrar genom register .. 6

1.3.2 Passera parametrar genom stacken. 7

2 PRAKTISK AVSNITT .. 9

2.1 Beskrivning av problemet. nio

2.2 Beskrivning av lösningen på problemet. nio

2.3 Testa programmet .. 7

Slutsats. åtta

Referenser .. 9


Introduktion

Det är allmänt känt att det är svårt att programmera i Assembler. Som ni vet finns det många olika språk nu. hög nivå som gör att du kan lägga mycket mindre ansträngning på att skriva program. Naturligtvis uppstår frågan när en programmerare kan behöva använda Assembler när han skriver program. För närvarande finns det två områden där användning av samlingsspråk är motiverat och ofta nödvändigt.

För det första är det de så kallade maskinberoende systemprogrammen, vanligtvis styr de olika enheter på datorn (sådana program kallas för drivrutiner). Dessa systemprogram använder speciella maskininstruktioner som inte behöver användas i vanliga (eller, som de säger applicerad) program. Dessa kommandon är omöjliga eller mycket svåra att definiera på ett språk på hög nivå.

Assemblarens andra tillämpningsområde är relaterat till optimering av programkörning. Mycket ofta ger översättningsprogram (kompilatorer) från högnivåspråk ett mycket ineffektivt maskinspråkprogram. Detta gäller vanligtvis program av beräkningskaraktär, där en mycket liten (ca 3-5%) sektion av programmet (huvudslingan) exekveras för det mesta. För att lösa detta problem kan så kallade flerspråkiga programmeringssystem användas, som låter dig skriva delar av programmet på olika språk. Vanligtvis är huvuddelen av programmet skriven på ett högt programmerat språk (Fortran, Pascal, C, etc.), och de tidskritiska delarna av programmet skrivs i Assembler. I det här fallet kan hastigheten för hela programmet ökas avsevärt. Detta är ofta det enda sättet att få programmet att leverera ett resultat på en rimlig tid.

Syftet med detta kursarbete är att få praktiska färdigheter i programmering i assemblerspråk.

Arbetsuppgifter:

1. Lär dig grundläggande information om Assembler-språket (struktur och komponenter i ett Assembler-program, kommandoformat, organisation av subrutiner, etc.);

2. För att studera typerna av bitoperationer, formatet och logiken för de logiska instruktionerna för Assembler;

3. Lös ett individuellt problem om användningen av subrutiner i Assembler;

4 .. Formulera en slutsats om det utförda arbetet.

1 TEORETISKT AVSNITT

Förstå monteringsspråk

Assembler är ett programmeringsspråk på låg nivå som är ett läsbart format för maskinskrivning av maskininstruktioner.

Monteringsspråksinstruktioner överensstämmer en-till-en med processorinstruktioner och representerar faktiskt en bekväm symbolisk form av notering (mnemonisk kod) för kommandon och deras argument. Monteringsspråk ger också grundläggande mjukvaruabstraktioner: länka delar av programmet och data genom etiketter med symboliska namn och direktiv.

Assembler -direktiven tillåter dig att inkludera datablock (beskrivs uttryckligen eller läst från en fil) i programmet; upprepa ett visst fragment ett visst antal gånger; sammanställa ett fragment villkorligt; ange fragmentets exekveringsadress, ändra värdena på etiketterna under kompileringsprocessen; använda makron med parametrar etc.

Fördelar och nackdelar

· Minsta mängd redundant kod (med färre instruktioner och minnesåtkomst). Som ett resultat - högre hastighet och mindre programstorlek;

· Stora mängder kod, ett stort antal ytterligare små uppgifter;

· Dålig läsbarhet av koden, svårigheter att underhålla (felsökning, lägga till funktioner);

· Svårigheten att genomföra programmeringsparadigm och andra något komplexa konventioner, komplexiteten i gemensam utveckling;

· Färre tillgängliga bibliotek, deras låga kompatibilitet;

· Direkt åtkomst till hårdvara: input-output-portar, specialregister för processorn;

· Maximal "passform" för önskad plattform (användning av speciella instruktioner, tekniska funktioner i "hårdvara");

· Intolerans mot andra plattformar (förutom binärkompatibla).

Förutom instruktioner kan ett program innehålla direktiv: instruktioner som inte direkt översätts till maskininstruktioner, utan styr kompilatorns funktion. Deras uppsättning och syntax varierar avsevärt och beror inte på hårdvaruplattformen, utan på kompilatorn som används (vilket ger upphov till dialekter av språk inom samma familj av arkitekturer). Som en uppsättning direktiv kan man peka ut:

· Datadefinition (konstanter och variabler);

· Hantering av programmets organisation i minnet och parametrarna för utdatafilen;

· Ställa in kompilatorns driftläge;

· Alla typer av abstraktioner (dvs. element på högnivåspråk) - från utformning av procedurer och funktioner (för att förenkla genomförandet av) till villkorade strukturer och loopar (för det strukturerade programmeringsparadigmet);

· Makron.

Kommandoset

Typiska monteringsspråkkommandon är:

Dataöverföringskommandon (mov, etc.)

Aritmetiska kommandon (lägg till, sub, imul, etc.)

Logiska och bitvisa operationer (eller, och, xor, shr, etc.)

· Kommandon för att styra programexekveringen (jmp, loop, ret, etc.)

Avbryta samtalskommandon (kallas ibland kontrollkommandon): int

I / O -kommandon till portar (in, ut)

För mikrokontroller och mikrodatorer är kommandon också karakteristiska som utför kontroll och övergång efter villkor, till exempel:

· Jne - flytta om inte lika;

· Jge - hoppa om det är större eller lika.

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. Datapresentation.

1.3.1 Datatyper

1.3.2 Representation av tecken och strängar

2. Operatörer av assemblerprogrammet …………………………………………

    1. Kommandon för montering av språk

2.2. Adressering av lägen och maskininstruktionsformat

3. Pseudo-operatörer …………………………………………………………….

3.1 Datadefinitionsdirektiv

3.2 Uppbyggnad av ett monteringsspråkprogram

3.2.1 Programsegment. Anta direktiv

3.2.3 Förenklat segmenteringsdirektiv

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

5. Kommandon för att skicka data ………………………………………………….

    5.1 Allmänna kommandon

    5.2 Kommandon för att arbeta med stacken

5.3 I / O -kommandon

5.4 Kommandon för vidarebefordran av adress

5.5 Kommandon för att vidarebefordra flaggor

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 en

6.2 Multiplikation och division

6.3 Skyltbyte

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

8. Skift och cykliska skift …………………………………………………

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

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

10.1 Villkorliga hopp

10.2 Villkorliga hopp

10.4 Rutiner på monteringsspråk

10.5 INT -avbrott

10.6 Systemprogramvara

10.6.1.1 Läsa tangentbordet.

10.6.1.2 Visa tecken på skärmen

10.6.1.3 Slut på program.

10.6.2.1 Välja visningslägen

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

11.2 Filtilldelningstabell

11.3 Disk I / O

11.3.1 Skriva en fil till hårddisken

11.3.1.1 Data i ASCIIZ-format

11.3.1.2 Filnummer

11.3.1.3 Skapa diskfil

11.3.2 Läsa en diskfil

Introduktion

Assembly språk är en symbolisk representation av ett 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 maskinvarurelaterade problem (eller till och med hårdvaruberoende problem som att förbättra programprestanda) utan att känna till assembler.

Assembler är en bekväm form av kommandon direkt för PC -komponenter och kräver kunskap om egenskaperna och funktionerna hos den integrerade kretsen som innehåller dessa komponenter, nämligen PC -mikroprocessorn. Således är monteringsspråk direkt relaterat till datorns interna organisation. Och det är ingen slump att nästan alla språkkompilatorer på hög nivå stöder åtkomst till samlingsspråkets programmeringsnivå.

Ett element i utbildningen av en professionell programmerare är nödvändigtvis studiet av assembler. Detta beror på att programmering av samlingsspråk kräver kunskap om PC -arkitekturen, vilket gör att du kan skapa effektivare program på andra språk och kombinera dem med samlingsspråkprogram.

Manualen behandlar frågor om programmering i assemblerspråk för datorer baserade på mikroprocessorer från Intel.

Denna handledning vänder sig till alla som är intresserade av processorarkitektur och grunderna i samlingsspråksprogrammering, främst mjukvaruutvecklare.

    PC -arkitektur.

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

Alla moderna datorer har några gemensamma och individuella egenskaper hos arkitektur. Enskilda egenskaper är enbart inneboende i en specifik datormodell.

Begreppet datorarkitektur inkluderar:

    blockdiagram över datorn;

    medel och metoder för åtkomst till elementen i datorblockschemat;

    uppsättning och tillgänglighet för register;

    organisation och metoder för adressering;

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

    uppsättning dator maskininstruktioner;

    format för maskininstruktioner;

    avbryta hanteringen.

De viktigaste delarna av datorhårdvara: systemenheten, tangentbordet, bildskärmsenheter, diskenheter, utskriftsenheter (skrivare) och olika kommunikationsmöjligheter. Systemenheten består av ett moderkort, en strömkälla och expansionskortplatser för ytterligare kort. Systemkortet innehåller en mikroprocessor, läsminne (ROM), random access -minne (RAM) och en koprocessor.

      Register.

Inne i mikroprocessorn finns information i en grupp med 32 register (16 användarregister, 16 systemregister), till viss del tillgänglig för programmeraren. Eftersom självstudien ägnas åt programmering för mikroprocessorn 8088-i486, är det mest logiskt att starta detta ämne genom att diskutera de interna registren för mikroprocessorn som är tillgänglig för användaren.

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

    åtta 32-bitars register (register för allmänna ändamål) 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 instruktionspekarregister.

Snedstrecket markerar delarna i ett enda 32-bitars register. E (Extended) prefixet anger användning av ett 32-bitars register. För att arbeta med byte används register med prefixen L (låg) och H (hög), till exempel AL, CH - betecknar de låga och höga byten för 16 -bitarsdelarna i registren.

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

EAX / AX / AH / AL (ackumulatorregister) - batteri... De 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. Det är obligatoriskt för vissa kommandon.

Alla register i denna grupp tillåter åtkomst till sina "lägre" delar. Endast de nedre 16- och 8-bitarsdelarna i 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 linjebearbetningskommandon som tillåter sekventiell bearbetning av kedjor 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 för det aktuella källelementet.

EDI / DI (register över distinationsindex) - index mottagare(mottagare). Innehåller den aktuella adressen i mottagarsträngen.

I mikroprocessorns arkitektur stöds en datastruktur - en stack - på hårdvaru -mjukvarunivå. Det finns speciella kommandon och speciella register för att arbeta med stacken. Det bör noteras att bunten fylls mot mindre adresser.

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

EBP / BP (baspekareregister) - stack baspekarregister... Designad för att organisera slumpmässig åtkomst till data inuti stapeln.

1.1.2. Segmentregister

I mjukvarumodellen för mikroprocessorn finns det 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öder den strukturella organisationen av programmet som består av segment. Segmentregister används för att indikera de segment som för närvarande är tillgängliga. Mikroprocessorn stöder följande segmenttyper:

    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 behandlas av programmet. För att komma åt detta segment, använd DS (register för datasegment) - segmentdataregister som lagrar adressen till datasegmentet för det aktuella programmet.

    Stack segment. Detta segment representerar ett minnesområde som kallas stacken. Mikroprocessorn organiserar stapeln enligt principen - först till kvarn. SS (stack segment register) -registret används för att komma åt stacken - stack segmentregister som innehåller adressen till stacksegmentet.

    Ytterligare datasegment. Den bearbetade informationen kan finnas i ytterligare tre datasegment. Som standard antas data finnas i datasegmentet. När du använder ytterligare datasegment måste deras adresser anges specifikt med hjälp av särskilda segmentöverskridande prefix i kommandot. Adresserna till de extra datasegmenten måste finnas i ES, GS, FS (extenSIon datasegmentregistren) registren.

        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 kommandon för närvarande laddas in i pipelinen. Den:

EIP / IP Command Pointer Register;

    registrera flaggor EFLAGS / FLAGS.

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

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

EFLAGS / FLAGS (Flaggregister) - Registrera flaggor... Bitdjup 32/16 bitar. Individuella bitar i detta register har ett specifikt funktionssyfte och kallas flaggor. En flagga är en bit som tar ett värde av 1 ("flaggan är inställd") om ett visst villkor är uppfyllt och värdet 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 (Figur 1). De enskilda bitarna i registret har ett specifikt funktionellt syfte och kallas flaggor. Var och en av dem har ett specifikt namn (ZF, CF, etc.). De nedre 16 bitarna av EFLAGS representerar 16-bitars FLAGS flaggregister som används vid körning av program skrivna för mikroprocessorn i086 och i286.

Fig. 1 Flaggregister

Vissa flaggor brukar kallas tillståndsflaggor; de ändras automatiskt när kommandona körs och fixar vissa egenskaper hos 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 blockavbrott).

Skickflaggor:

CF (bärflagga) - bära flagga... Tar på sig värdet 1 om, när man lägger till heltal, en bindestreckningsenhet dök upp som inte "passade" in i bitnätet, eller om det första av dem vid subtrahering av osignerade tal var mindre än det andra. I skiftkommandona sätts en bit som har gått utöver bitnätet i CF. CF fångar också funktionerna i multiplikationskommandot.

OF (överflödesflagga) - överflödesflagga... Den sätts till 1 om, när man adderar eller subtraherar tecken med heltal, ett resultat erhålls som är större i absolut värde än det tillåtna värdet (mantissan flödade över och den "klättrade" in i teckenbiten).

ZF (nollflagga) - noll flagga... Den är inställd på 1 om kommandoresultatet var lika med 0.

SF (SIgn flagga) - flagga skylt... Den är inställd på 1 om operationen med signerade nummer resulterar i ett negativt resultat.

PF (paritetsflagga) - flagga paritet... Lika med 1 om resultatet av nästa kommando innehåller ett jämnt antal binära. Det anses vanligtvis bara för I / O -operationer.

AF (extra bärflagga) - extra bärflagga... Åtgärdar särdragen i att utföra operationer på binära decimaltal.

Statusflaggor:

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

IOPL (ingångs-/utgångsbehörighetsnivå) - I / O -behörighetsnivå. Den används i mikroprocessorns skyddade läge för att kontrollera åtkomst till I/O-kommandon, beroende på uppgiftsprivilegiet.

NT (kapslad uppgift) - uppgift häckande flagga. Den används i det skyddade läget för mikroprocessorn för att registrera det faktum att en uppgift är kapslad inom en annan.

Systemflagga:

IF (INTerrupt flagga) - avbryta flaggan... Med IF = 0 slutar processorn att svara på inkommande avbrott, med IF = 1 släpps avbrottslåset.

TF (fällflagga) - spårflagga... Om TF = 1, efter genomförandet av varje instruktion, gör processorn ett avbrott (med nummer 1), som kan användas vid felsökning av programmet för att spåra det.

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

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

AC (Alignment check) - justeringskontrollflagga. Utformad för att möjliggöra justeringskontroll vid åtkomst till minne.

      Organisation av minnet.

Det fysiska minnet som mikroprocessorn har tillgång till kallas BAGGE ( eller slumpmässigt åtkomstminne - BAGGE). RAM är en kedja av byte som har sin egen unika adress (dess nummer), kallad fysisk. Värdeintervallet för 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 minnet för program indelat i sammanhängande minnesområden (segment), och själva programmet kan bara komma åt data som finns i dessa segment;

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

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

    Verkligt adressläge (realläge). Läget liknar driften av i8086 -processorn. Det är nödvändigt för att program som fungerar för tidiga processormodeller fungerar.

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

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

Segmentering är en adresseringsmekanism som tillåter flera oberoende adressutrymmen att existera. Ett segment är ett oberoende, hårdvarustödt minnesblock.

Varje program i allmänhet kan bestå av valfritt antal segment, men det har direktåtkomst till tre huvudsakliga: kod, data och stack - och från ett till tre ytterligare datasegment. Operativsystemet placerar programsegment i RAM vid specifika fysiska adresser och lägger sedan värdena för dessa adresser i motsvarande register. Inom ett segment får programmet åtkomst till adresser relativt segmentets början linjärt, det vill säga från adress 0 och slutar med en adress som är lika med segmentets storlek. Relativ adress 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 realläge är intervallet för ändring av den fysiska adressen 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 för segmentets början. De saknade minst signifikanta fyra bitarna av en 20-bitars adress erhålls genom att skifta segmentregistervärdet åt vänster med 4 bitar. Skiftoperationen utförs i hårdvara. Det resulterande 20-bitarsvärdet är den verkliga fysiska adressen som motsvarar början av segmentet. Det är fysisk adress specificeras som ett par: segment: offset, där segmentet är de första 16 bitarna i startadressen för minnessegmentet som cellen tillhör, och offset är 16-bitars adressen för denna cell, räknat från början av detta minne segment (värde 16 * segment + förskjutning ger den absoluta celladressen). Om till exempel CS -registret lagrar värdet 1234h, definierar adressparet 1234h: 507h en absolut adress lika med 16 * 1234h + 507h = 12340h + 507h = 12847h. Ett sådant par är skrivet i form av ett dubbelord och (som för siffror) i en "inverterad" form: det första ordet innehåller en förskjutning, och det andra - ett segment, och vart och ett av dessa ord presenteras i sin tur i en "inverterad" form. Till exempel kommer paret 1234h: 5678h att 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 den beror inte på de specifika adresserna för dess laddning i RAM.

Dela detta