Program på assemblerspråk. Generelle kjennetegn ved kommandosystemet til Assembler-språket for IBM-PC (grunnleggende sett med kommandoer, grunnleggende metoder for adressering av operander). Programstruktur i Assembler-språk. Monteringsspråkkommandoer

Generell informasjon om forsamlingsspråk

Symbolsk monteringsspråk kan i stor grad eliminere ulempene ved maskinspråkprogrammering.

Dens største fordel er at alle programelementer i assembly-språk presenteres i symbolsk form. Konvertering av symbolske kommandonavn til deres binære koder er ansvaret for spesialprogram- assembler, som frigjør programmereren fra arbeidskrevende arbeid og eliminerer de uunngåelige feilene.

Symbolske navn som legges inn ved programmering i assemblerspråk reflekterer vanligvis semantikken til programmet, og forkortelsen av kommandoer gjenspeiler hovedfunksjonen deres. For eksempel: PARAM - parameter, TABELL - tabell, MASK - maske, ADD - addisjon, SUB - subtraksjon, etc. osv. Slike navn er enkle å huske for en programmerer.

For programmering i assemblerspråk er det nødvendig å ha komplekse verktøy enn for programmering på maskinspråk: du trenger datasystemer basert på en mikrodatamaskin eller PC med et sett eksterne enheter(alfanumerisk tastatur, tegndisplay, flytende stasjon og utskriftsenhet), samt residente eller kryssprogrammeringssystemer for de nødvendige typene mikroprosessorer. Assembly-språk lar deg effektivt skrive og feilsøke mye mer komplekse programmer enn maskinspråk (opptil 1 - 4 KB).

Monteringsspråk er maskinorientert, det vil si avhengig av maskinspråket og strukturen til den korresponderende mikroprosessoren, siden hver mikroprosessorinstruksjon i dem er tildelt et spesifikt symbolsk navn.

Monteringsspråk gir en betydelig økning i programmerers produktivitet sammenlignet med maskinspråk og beholder samtidig muligheten til å bruke alle programvare-tilgjengelige maskinvareressurser til mikroprosessoren. Dette gjør det mulig for kvalifiserte programmerere å skrive programmer som kan kjøres på mindre enn en kort tid og opptar mindre minne sammenlignet med programmer laget på et høyt nivå språk.

I denne forbindelse er nesten alle programmer for å kontrollere inngangs-/utgangsenheter (drivere) skrevet på assemblerspråk, til tross for tilstedeværelsen av et ganske stort utvalg av høynivåspråk.

Ved å bruke assemblerspråk kan programmereren stille inn følgende parametere:

mnemonics (symbolsk navn) for hver mikroprosessor maskinspråkkommando;

et standardformat for linjer i et program skrevet på assemblerspråk;

format for å indikere på ulike måter adresserings- og kommandovarianter;

format for å spesifisere tegnkonstanter og heltallskonstanter i ulike tallsystemer;

pseudo-kommandoer som styrer prosessen med å sette sammen (oversette) et program.

På assemblerspråk skrives et program linje for linje, det vil si at en linje tildeles for hver kommando.

For mikrodatamaskiner bygget på basis av de vanligste typene mikroprosessorer kan det finnes flere varianter av assemblerspråk, men vanligvis er en mye brukt i praksis – dette er det såkalte standard assemblyspråket

Programmering på maskininstruksjonsnivå er minimumsnivået der programmer kan skrives. Systemet med maskininstruksjoner må være tilstrekkelig til å implementere de nødvendige handlingene ved å gi instruksjoner til maskinvaren.

Hver maskinkommando består av to deler:

· operasjonsstue - bestemme "hva du skal gjøre";

· operand - definerer behandlingsobjekter, "hva skal man gjøre med".

Mikroprosessormaskinkommandoen, skrevet i assemblerspråk, er én linje med følgende syntaktiske form:

etikett kommando/direktiv operand(er) ;kommentarer

I dette tilfellet er det nødvendige feltet i linjen en kommando eller et direktiv.

Etiketten, kommandoen/direktivet og operandene (hvis noen) er atskilt med minst ett mellomrom eller tabulatortegn.

Hvis en kommando eller et direktiv må fortsette på neste linje, brukes omvendt skråstrek: \.

Som standard skiller ikke assemblerspråk mellom store og små bokstaver når du skriver kommandoer eller direktiver.

Direkte adressering: Den effektive adressen bestemmes direkte av forskyvningsfeltet til maskininstruksjonen, som kan være 8, 16 eller 32 biter store.

mov eax, sum ; eax = sum

Samleren erstatter sum med den tilsvarende adressen lagret i datasegmentet (adressert av ds-registeret som standard) og plasserer verdien som er lagret til sum i eax-registeret.

Indirekte adressering har på sin side følgende typer:

· indirekte grunnleggende (register) adressering;

· indirekte grunnleggende (register) adressering med offset;

· indirekte indeksadressering;

· indirekte grunnleggende indeksadressering.

Indirekte grunnleggende (register) adressering. Med denne adresseringen kan den effektive adressen til operanden lokaliseres i alle de generelle registrene, bortsett fra sp/esp og bp/ebp (disse er spesifikke registre for arbeid med stabelsegmentet). Syntaktisk i en kommando uttrykkes denne adresseringsmodusen ved å omslutte registernavnet firkantede parenteser.

mov eax, ; eax = *esi; *esi-verdi ved adresse esi

Introduksjon.

Språket det er skrevet på originalt program, kalt inngang språk, og språket det er oversatt til for utførelse av prosessoren er på fridager tunge. Prosessen med å konvertere inndataspråk til utdataspråk kalles kringkaste. Siden prosessorer er i stand til å kjøre programmer på binært maskinspråk, som ikke brukes til programmering, er oversettelse av alle kildeprogrammer nødvendig. Kjent to veier sendinger: sammenstilling og tolkning.

samling kildeprogrammet blir først fullstendig oversatt til et tilsvarende program i utdataspråket, kalt gjenstand programmet og deretter utført. Denne prosessen implementeres ved hjelp av en spesiell programmer, kalt kompilator. En kompilator der inngangsspråket er en symbolsk form for å representere maskinspråket (utdata) for binære koder kalles montør.

tolkninger Hver tekstlinje i kildeprogrammet blir analysert (tolket) og kommandoen som er spesifisert i den, utføres umiddelbart. Implementeringen av denne metoden er betrodd tolkeprogram. Tolking tar lang tid. For å øke effektiviteten, i stedet for å behandle hver linje, konverterer tolken først alle team strenger til tegn (

). Den genererte sekvensen av symboler brukes til å utføre funksjonene som er tildelt det originale programmet.

Monteringsspråket som er omtalt nedenfor implementeres ved hjelp av kompilering.

Funksjoner ved språket.

Hovedtrekkene til montøren:

● i stedet for binære koder, bruker språket symbolske navn - mnemonikk. For eksempel, for tilleggskommandoen (

) mnemonikk brukes

Subtraksjoner (

multiplikasjon (

Divisjoner (

osv. Symbolske navn brukes også for å adressere minneceller. For å programmere i assemblerspråk, i stedet for binære koder og adresser, trenger du bare å kjenne til symbolske navn som assembleren oversetter til binære koder;

hver setning samsvarer én maskinkommando(kode), dvs. det er en en-til-en-korrespondanse mellom maskinkommandoer og operatører i et assembly-språkprogram;

● språk gir tilgang til alle objekter og lag. Språk på høyt nivå har ikke denne muligheten. For eksempel lar assembly-språket deg sjekke biter av flaggregisteret og språk på høyt nivå (for eksempel,

) har ikke denne evnen. Merk at systemprogrammeringsspråk (for eksempel C) ofte har en mellomposisjon. Når det gjelder tilgjengelighet, er de nærmere assemblerspråk, men har syntaksen til et språk på høyt nivå;

● monteringsspråk er ikke et universelt språk. Hver spesifikk gruppe mikroprosessorer har sin egen assembler. Språk på høyt nivå har ikke denne ulempen.

I motsetning til høynivåspråk tar det mye tid å skrive og feilsøke et program på assemblerspråk. Til tross for dette har forsamlingsspråk fått bred bruk på grunn av følgende omstendigheter:

● et program skrevet på assemblerspråk er betydelig mindre i størrelse og kjører mye raskere enn et program som er skrevet på et overordnet språk. For noen applikasjoner spiller disse indikatorene en primær rolle, for eksempel mange systemprogrammer(inkludert kompilatorer), programmer på kredittkort, mobil, enhetsdrivere osv.;

● noen prosedyrer krever full tilgang til maskinvaren, noe som vanligvis er umulig å gjøre på et språk på høyt nivå. Denne saken inkluderer avbrudds- og avbruddsbehandlere i operativsystemer, samt enhetskontrollere i innebygde sanntidssystemer.

I de fleste programmer er det bare en liten prosentandel av den totale koden som er ansvarlig for en stor prosentandel av programmets utførelsestid. Vanligvis er 1 % av programmet ansvarlig for 50 % av gjennomføringstiden, og 10 % av programmet er ansvarlig for 90 % av gjennomføringstiden. Derfor, for å skrive et spesifikt program under reelle forhold, brukes både assembler og et av høynivåspråkene.

Operatørformat i assemblerspråk.

Et assembly-språkprogram er en liste over kommandoer (utsagn, setninger), som hver opptar en egen linje og inneholder fire felt: et etikettfelt, et operasjonsfelt, et operandfelt og et kommentarfelt. Hvert felt har en egen kolonne.

Etikettfelt.

Kolonne 1 er tildelt etikettfeltet. Etiketten er et symbolsk navn, eller identifikator, adresser hukommelse. Det er nødvendig slik at du kan:

● foreta en betinget eller ubetinget overgang til kommandoen;

● få tilgang til stedet der dataene er lagret.

Slike uttalelser er forsynt med en etikett. For å indikere et navn, brukes (store) bokstaver i det engelske alfabetet og tall. Navnet må ha en bokstav i begynnelsen og et kolonskilletegn på slutten. Kolonetiketten kan skrives på en egen linje, og opkoden kan skrives på neste linje i kolonne 2, noe som forenkler kompilatorens arbeid. Fraværet av et kolon tillater ikke å skille en etikett fra en operasjonskode hvis de er plassert på separate linjer.

I noen versjoner av assembly-språket plasseres kolon bare etter instruksjonsetiketter, ikke etter dataetiketter, og lengden på etiketten kan være begrenset til 6 eller 8 tegn.

Det skal ikke være identiske navn i etikettfeltet, siden etiketten er knyttet til kommandoadresser. Hvis det under programkjøring ikke er nødvendig å kalle en kommando eller data fra minnet, forblir etikettfeltet tomt.

Driftskodefelt.

Dette feltet inneholder mnemonisk kode for en kommando eller pseudo-kommando (se nedenfor). Kommandoen mnemonisk kode velges av språkutviklerne. På assemblerspråk

mnemonic er valgt for å laste et register fra minnet

), og for å lagre innholdet i registeret i minnet - en mnemonikk

). På assemblerspråk

for begge operasjonene kan du bruke samme navn

Hvis valget av mnemoniske navn kan være vilkårlig, bestemmes behovet for å bruke to maskininstruksjoner av prosessorarkitekturen

Mnemonikken til registre avhenger også av assemblerversjonen (tabell 5.2.1).

Operand felt.

Her ligger Tilleggsinformasjon, nødvendig for å utføre operasjonen. I operandfeltet for hoppkommandoer angis adressen som hoppet må gjøres til, samt adresser og registre som er operander for maskinkommandoen. Som et eksempel gir vi operander som kan brukes for 8-bits prosessorer

● numeriske data,

presentert i forskjellige tallsystemer. For å indikere tallsystemet som brukes, etterfølges konstanten av en av latinske bokstaver: IN,

Følgelig, binære, oktale, heksadesimale, desimale tallsystemer (

Du trenger ikke å skrive det ned). Hvis det første sifferet i et heksadesimalt tall er A, B, C,

Deretter legges det til en ubetydelig 0 (null) foran;

● koder for interne mikroprosessorregistre og minneceller

M (kilder eller mottakere av informasjon) i form av bokstavene A, B, C,

M eller deres adresser i et hvilket som helst nummersystem (for eksempel 10B - registeradresse

i binært system);

● identifikatorer,

for registerpar av fly,

De første bokstavene er B,

N; for et par akkumulator og funksjonsregister -

; for programtelleren -

;for stabelpekeren -

● etiketter som angir adressene til operandene eller neste instruksjoner i betinget

(hvis vilkåret er oppfylt) og ubetingede overganger. For eksempel operand M1 i kommandoen

betyr behovet for en ubetinget overgang til kommandoen, hvis adresse i etikettfeltet er merket med identifikatoren M1;

● uttrykk,

som er konstruert ved å koble dataene diskutert ovenfor ved å bruke aritmetiske og logiske operatorer. Merk at metoden for å reservere dataplass avhenger av språkversjonen. Montering språkutviklere for

Definer ordet), og senere inn Alternativt alternativ.

som var på språket for prosessorer helt fra begynnelsen

I språkversjon

brukt

Definer en konstant).

Prosessorer behandler operander av forskjellig lengde. For å definere det tok assemblerutviklere forskjellige beslutninger, for eksempel:

II-registre med forskjellige lengder har forskjellige navn: EAX - for plassering av 32-bits operander (type

); AX - for 16-bit (type

og AN - for 8-bit (type

● for prosessorer

Suffikser legges til hver operasjonskode: suffiks

For type

; suffiks ".B" for type

forskjellige op-koder brukes for operander av forskjellige lengder, for eksempel for å laste en byte, halvord (

) og ord inn i et 64-bits register ved å bruke opkoder

hhv.

Kommentarfelt.

Dette feltet gir forklaringer om handlingene til programmet. Kommentarer påvirker ikke driften av programmet og er beregnet på mennesker. De kan være nødvendige for å modifisere et program, som uten slike kommentarer kan være helt uforståelig selv for erfarne programmerere. En kommentar begynner med et symbol og brukes til å forklare og dokumentere programmer. Startkarakteren til en kommentar kan være:

● semikolon (;) på språk for selskapets prosessorer

Utropstegn(!) på språk for

Hver separat kommentarlinje innledes med en ledende karakter.

Pseudo-kommandoer (direktiver).

I assemblerspråk er det to hovedtyper kommandoer:

grunnleggende instruksjoner som tilsvarer prosessorens maskinkode. Disse kommandoene utfører all behandlingen tiltenkt av programmet;

pseudo-kommandoer eller direktiver, designet for å betjene prosessen med å oversette et program til et kodekombinasjonsspråk. Som eksempel i tabellen. 5.2.2 viser noen pseudo-kommandoer fra assembleren

for familien

.

Ved programmering er det situasjoner der, ifølge algoritmen, den samme kjeden av kommandoer må gjentas mange ganger. For å komme ut av denne situasjonen kan du:

● skriv den nødvendige sekvensen med kommandoer når det skjer. Denne tilnærmingen fører til en økning i volumet av programmet;

● ordne denne sekvensen i en prosedyre (subrutine) og kall den om nødvendig. Denne utgangen har sine ulemper: hver gang du må utføre en spesiell prosedyrekallingskommando og en returkommando, som, hvis sekvensen er kort og ofte brukt, kan redusere hastigheten til programmet betraktelig.

Den enkleste og effektiv metode gjentatt repetisjon av en kjede av kommandoer består i å bruke makro, som kan representeres som en pseudo-kommando designet for å oversette en gruppe kommandoer som ofte finnes i et program.

En makro, eller makrokommando, er preget av tre aspekter: makrodefinisjon, makroinversjon og makroutvidelse.

Makrodefinisjon

Dette er en betegnelse for en gjentatt gjentatt sekvens av programkommandoer, brukt for referanser i programteksten.

Makrodefinisjonen har følgende struktur:

Liste over uttrykk; Makrodefinisjon

I den gitte strukturen til makrodefinisjon kan tre deler skilles:

● tittel

makro, inkludert navnet

Pseudo-kommando

og et sett med parametere;

● merket med prikker kropp makro;

● team

eksamen

makrodefinisjoner.

Makrodefinisjonsparametersettet inneholder en liste over alle parametere gitt i operandfeltet for den valgte gruppen med instruksjoner. Hvis disse parameterne ble gitt tidligere i programmet, trenger de ikke å angis i makrodefinisjonsoverskriften.

For å sette sammen den valgte gruppen av kommandoer igjen, brukes en appell som består av navnet

makrokommandoer og liste over parametere med andre verdier.

Når assembleren møter en makrodefinisjon under kompileringsprosessen, lagrer den den i makrodefinisjonstabellen. Ved påfølgende opptredener i programmet til navnet (

) av en makro, erstatter assembleren den med brødteksten til makroen.

Å bruke et makronavn som opkode kalles makro-reversering(makroanrop), og erstatte det med brødteksten til makroen - makro ekspansjon.

Hvis et program er representert som en sekvens av tegn (bokstaver, tall, mellomrom, skilletegn og vognretur for å flytte til en ny linje), så består makroutvidelse av å erstatte noen kjeder fra denne sekvensen med andre kjeder.

Makroutvidelse skjer under monteringsprosessen, ikke under programkjøring. Metoder for å manipulere strenger med tegn er tilordnet makro betyr.

Monteringsprosessen er utført i to omganger:

● Ved den første passeringen blir alle makrodefinisjoner bevart, og makroanrop utvides. I dette tilfellet blir det originale programmet lest og konvertert til et program der alle makrodefinisjoner er fjernet, og hvert makrokall erstattes av makroens kropp;

● den andre passeringen behandler det resulterende programmet uten makroer.

Makroer med parametere.

For å jobbe med gjentatte sekvenser av kommandoer, hvis parametere kan ha forskjellige verdier, er makrodefinisjoner gitt:

● med faktiske parametere som er plassert i operandfeltet til makrokallet;

● med formell parametere. Under makroutvidelse erstattes hver formell parameter som vises i hoveddelen av makroen med den tilsvarende faktiske parameteren.

bruke makroer med parametere.

Program 1 inneholder to lignende sekvenser av kommandoer, som er forskjellige ved at den første bytter P og

Og den andre

Program 2 inkluderer en makro med to formelle parametere P1 og P2. Under makroutvidelse erstattes hvert P1-tegn i makrokroppen med den første faktiske parameteren (P,

), og symbolet P2 erstattes av den andre faktiske parameteren (

) fra program nr. 1. I makrokallet

program 2 er merket: P,

Den første faktiske parameteren,

Andre faktiske parameter.

Program 1

Program 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Utvidede muligheter.

La oss se på noen avanserte språkfunksjoner

Hvis en makro som inneholder en betinget hoppkommando og en etikett som skal hoppes til kalles to eller flere ganger, vil etiketten dupliseres (duplisert etikettproblem), noe som vil forårsake en feil. Derfor tildeler hvert anrop en egen etikett som en parameter (av programmereren). På språket

etiketten er erklært lokal (

) og takket være avanserte funksjoner genererer assembleren automatisk en annen etikett hver gang makroen utvides.

lar deg definere makroer inne i andre makroer. Denne avanserte funksjonen er veldig nyttig i kombinasjon med betinget kobling av et program. La oss vurdere

IF WORDSIZE GT 16 M2 MAKRO

M2-makroen kan defineres i begge deler av setningen

Definisjonen avhenger imidlertid av hvilken prosessor programmet er satt sammen på: 16-bit eller 32-bit. Hvis M1 ikke kalles, vil ikke makro M2 bli definert i det hele tatt.

En annen avansert funksjon er at makroer kan kalle andre makroer, inkludert seg selv - tilbakevendende anrop. I sistnevnte tilfelle, for å unngå en endeløs sløyfe, må makroen sende en parameter til seg selv som endres med hver utvidelse, og også Sjekk denne parameteren og avslutte rekursjonen når parameteren når en viss verdi.

Om bruk av makromidler i assembler.

Når du bruker makroer, må assembleren kunne utføre to funksjoner: lagre makrodefinisjoner Og utvide makroutfordringer.

Lagrer makrodefinisjoner.

Alle makronavn er lagret i en tabell. Hvert navn er ledsaget av en peker til den tilsvarende makroen slik at den kan kalles om nødvendig. Noen montører har en egen tabell for makronavn, andre har en generell tabell der, sammen med makronavn, alle maskininstruksjoner og direktiver er plassert.

Når du møter en makro under montering er skapt:

nytt bordelement med navnet på makroen, antall parametere og en peker til en annen makrodefinisjonstabell der hoveddelen av makroen vil bli lagret;

● liste formell parametere.

Brødteksten til makroen, som ganske enkelt er en streng med tegn, leses og lagres i makrodefinisjonstabellen. Formelle parametere som forekommer i løkkens kropp er merket spesiell karakter.

Intern representasjon av en makro

fra eksempelet ovenfor for program 2 (s. 244) er:

MOV EAX, MOV EBX, MOV MOV &

der semikolon brukes som vognreturtegnet, og og-tegnet & brukes som det formelle parametertegnet.

Utvide makroanrop.

Hver gang en makrodefinisjon påtreffes under montering, lagres den i makrotabellen. Når en makro kalles, stopper assembleren midlertidig å lese inngangsdata fra inndataenheten og begynner å lese den lagrede makrokroppen. De formelle parameterne som er hentet ut fra makrokroppen, erstattes av faktiske parametere og leveres av samtalen. Parametrene og før-tegnet lar assembleren gjenkjenne dem.

Til tross for at det finnes mange versjoner av assembler, har monteringsprosessene fellestrekk og er like på mange måter. Driften av en to-pass assembler er diskutert nedenfor.

To-pass assembler.

Et program består av en rekke utsagn. Derfor ser det ut til at når du monterer, kan du bruke følgende handlingssekvens:

● oversette det til maskinspråk;

● overføre den resulterende maskinkoden til en fil, og den tilsvarende delen av oppføringen til en annen fil;

● gjenta de oppførte prosedyrene til hele programmet er oversatt.

Denne tilnærmingen er imidlertid ikke effektiv. Et eksempel er det såkalte problemet viderekobling. Hvis den første setningen er et hopp til setning P, plassert helt på slutten av programmet, kan ikke assembleren oversette den. Han må først bestemme adressen til operatør P, og for å gjøre dette må han lese hele programmet. Hver fullstendig lesing av kildeprogrammet kalles passasje. La oss vise hvordan du kan løse lookahead-lenkeproblemet ved å bruke to pass:

på første pass bør du samle inn og lagre alle symboldefinisjoner (inkludert etiketter) i tabellen, og ved den andre passeringen, les og sett sammen hver operatør. Denne metoden er relativt enkel, men en andre gang gjennom det originale programmet krever ekstra tid brukt på I/O-operasjoner;

● ved første pass bør du konvertere programmet til en mellomform og lagre det i en tabell, og utfør den andre passeringen ikke i henhold til det opprinnelige programmet, men i henhold til tabellen. Denne monteringsmetoden sparer tid, siden den andre passasjen ikke utfører I/O-operasjoner.

Første pass.

Første pasningsmål- bygg et symbolbord. Som nevnt ovenfor, er et annet mål med den første passeringen å bevare alle makrodefinisjoner og utvide anrop etter hvert som de vises. Følgelig skjer både symboldefinisjon og makroutvidelse i én omgang. Symbolet kan være enten merkelapp, eller betydning, som et spesifikt navn er tildelt ved å bruke -you-direktivet:

;Verdi - bufferstørrelse

Ved å tildele betydning til symbolske navn i kommandoetikettfeltet, spesifiserer assembleren i hovedsak adressene som hver kommando vil ha under programkjøring. For dette formålet lagrer montøren under monteringsprosessen instruksjonsadresseteller(

) som en spesiell variabel. Ved begynnelsen av den første passeringen settes verdien av spesialvariabelen til 0 og økes etter hver behandlet kommando med lengden på den kommandoen. Som eksempel i tabellen. 5.2.3 viser et programfragment som indikerer lengden på kommandoer og tellerverdier. Ved første passering genereres tabeller symbolske navn, direktiver Og operasjonskoder, og om nødvendig bokstavelig bord. En bokstavelig er en konstant som samleren automatisk reserverer minne for. La oss umiddelbart legge merke til at moderne prosessorer inneholder instruksjoner med umiddelbare adresser, så samlerne deres støtter ikke bokstaver.

Symbol Navnetabell

inneholder ett element for hvert navn (tabell 5.2.4). Hvert element i den symbolske navnetabellen inneholder selve navnet (eller en peker til det), dets numeriske verdi, og noen ganger litt tilleggsinformasjon, som kan omfatte:

● lengden på datafeltet knyttet til symbolet;

● minneomfordelingsbiter (som indikerer om verdien til et symbol endres hvis programmet lastes inn på en annen adresse enn assembleren hadde til hensikt);

● informasjon om hvorvidt symbolet kan nås utenfor prosedyren.

Symboliske navn er etiketter. De kan spesifiseres ved hjelp av operatorer (f.eks.

Direktivtabell.

Denne tabellen viser alle direktivene, eller pseudo-kommandoene, som oppstår når du setter sammen et program.

Driftskodetabell.

For hver operasjonskode har tabellen separate kolonner: operasjonskodebetegnelse, operand 1, operand 2, heksadesimal verdi av operasjonskoden, kommandolengde og kommandotype (tabell 5.2.5). Operasjonskoder er delt inn i grupper avhengig av antall og type operander. Kommandotypen bestemmer gruppenummeret og spesifiserer prosedyren som kalles for å behandle alle kommandoer i den gruppen.

Andre pass.

Mål for den andre pasningen- opprettelse av et objektprogram og utskrift, om nødvendig, av monteringsprotokollen; ut informasjon som er nødvendig for linkeren for å koble prosedyrer som ble satt sammen til forskjellige tider til én kjørbar fil.

I den andre omgangen (som i den første) blir linjene som inneholder utsagnene lest og behandlet én etter én. Den opprinnelige operatoren og utdataoperatoren avledet fra den i heksadesimal gjenstand Koden kan skrives ut eller legges i en buffer for senere utskrift. Etter tilbakestilling av kommandoadressetelleren, kalles kommandoen neste uttalelse.

Kildeprogrammet kan inneholde feil, for eksempel:

det gitte symbolet er ikke definert eller er definert mer enn én gang;

● op-koden er representert med et ugyldig navn (på grunn av en skrivefeil), har ikke nok operander eller har for mange operander;

● ingen operatør

Noen montører kan oppdage et udefinert symbol og erstatte det. Men i de fleste tilfeller, når den støter på en feilsetning, viser assembleren en feilmelding på skjermen og prøver å fortsette monteringsprosessen.

Artikler dedikert til forsamlingsspråk.

Emne 2.5 Grunnleggende om prosessorprogrammering

Etter hvert som lengden på programmet øker, blir det stadig vanskeligere å huske kodene for ulike operasjoner. Mnemonics gir litt hjelp i denne forbindelse.

Det symbolske kommandokodespråket kalles montør.

Forsamlingsspråk er et språk der hver ytring tilsvarer nøyaktig én maskinkommando.

montering kalles å konvertere et program fra assemblerspråk, dvs. å forberede et program på maskinspråk ved å erstatte symbolske navn på operasjoner med maskinkoder, og symbolske adresser med absolutte eller relative tall, samt inkorporere bibliotekprogrammer og generere sekvenser av symbolske instruksjoner ved å spesifisere spesifikke parametere i mikrolag. Dette programmet vanligvis plassert i ROM eller lagt inn i RAM fra noen eksterne medier.

Monteringsspråk har flere funksjoner som skiller det fra språk på høyt nivå:

1. Dette er en en-til-en-korrespondanse mellom assembly-språksetninger og maskininstruksjoner.

2. En assemblerspråkprogrammerer har tilgang til alle objekter og instruksjoner som finnes på målmaskinen.

Å forstå det grunnleggende om programmering i maskinorienterte språk er nyttig for:



Bedre forståelse av PC-arkitektur og mer kompetent bruk av datamaskiner;

Å utvikle mer rasjonelle strukturer av algoritmer for programmer for å løse anvendte problemer;

Muligheten til å vise og korrigere kjørbare programmer med utvidelsen .exe og .com, kompilert fra alle høynivåspråk, i tilfelle tap av kildeprogrammene (ved å kalle de spesifiserte programmene i DEBUG-programmets debugger og dekompilere visningen deres i assembly Språk);

Kompilere programmer for å løse de mest kritiske problemene (et program skrevet på et maskinorientert språk er vanligvis mer effektivt - kortere og raskere med 30-60 prosent av programmene oppnådd som et resultat av oversettelse fra språk på høyt nivå)

Å implementere prosedyrer inkludert i hovedprogrammet i form av separate fragmenter i tilfelle de ikke kan implementeres verken på høynivåspråket som brukes eller ved å bruke OS-tjenesteprosedyrer.

Et program i assemblerspråk kan bare kjøres på én familie av datamaskiner, mens et program skrevet på et høynivåspråk potensielt kan kjøre på forskjellige maskiner.

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

Tall er bare heltall. Det er:

Binære tall slutter med bokstaven B;

Desimaltall som slutter med bokstaven D;

Heksadesimale tall slutter med bokstaven H.

RAM, registre, datapresentasjon

For en viss serie parlamentsmedlemmer brukes et individuelt programmeringsspråk - assembly language.

Monteringsspråk inntar en mellomposisjon mellom maskinkoder og høynivåspråk. Programmering på dette språket er enklere. Et program i assemblerspråk gjør mer effektiv bruk av egenskapene til en spesifikk maskin (mer presist, en MP) enn et program på et høynivåspråk (som er enklere for en programmerer enn assembler). La oss se på de grunnleggende prinsippene for programmering i maskinorienterte språk ved å bruke eksempelet på monteringsspråk for MP KR580VM80. En generell metodikk brukes for å programmere i språket. Spesifikke tekniske teknikker for opptak av programmer er knyttet til funksjonene til arkitekturen og kommandosystemet til mål-MP.

Programvaremodell mikroprosessorsystem basert på MP KR580VM80

Programvaremodell av MPS i samsvar med figur 1

MP-porter minne

S Z A.C. P C

Bilde 1

Fra programmererens synspunkt har MP KR580VM80 følgende programtilgjengelige registre.

EN– 8-biters akkumulatorregister. Det er hovedregisteret til MP. Enhver operasjon utført i en ALU innebærer å plassere en av operandene som skal behandles i akkumulatoren. Resultatet av en operasjon i ALU er også vanligvis lagret i A.

B, C, D, E, H, L– 8-bits registre for generelle formål (GPR). Indre hukommelse MP. Designet for å lagre behandlet informasjon, samt resultatene av operasjonen. Ved behandling av 16-bits ord danner registre parene BC, DE, HL, og dobbeltregisteret kalles den første bokstaven - B, D, H. I et registerpar er det høyeste det første registeret. Registerne H og L har en spesiell egenskap, som brukes både for lagring av data og for lagring av 16-bits adresser til RAM-celler.

FL– flaggregister (tegnregister) 8-bits register der fem tegn på resultatet av å utføre aritmetiske og logiske operasjoner i MP er lagret. FL format i henhold til bildet

Bit C (CY - bære) - bære, satt til 1 hvis det var en bære fra den høye rekkefølgen til byten ved utførelse av aritmetiske operasjoner.

Bit P (paritet) – paritet, satt til 1 hvis antallet enere i bitene til resultatet er partall.

AC-sifferet er en ekstra bære, designet for å lagre bæreverdien fra lavordens tetrad av resultatet.

Bit Z (null) – satt til 1 hvis resultatet av operasjonen er 0.

Bit S (tegn) – settes til 1 hvis resultatet er negativt, og til 0 hvis resultatet er positivt.

SP– stack pointer, et 16-bits register, designet for å lagre adressen til minnecellen der den siste byten som ble satt inn i stabelen ble skrevet.

RS– programteller (programteller), et 16-bits register, designet for å lagre adressen til neste instruksjon som skal utføres. Innholdet i programtelleren økes automatisk med 1 umiddelbart etter henting av neste instruksjonsbyte.

Det opprinnelige minneområdet med adresse 0000Н – 07FF inneholder kontrollprogrammet og demonstrasjonsprogrammer. Dette er ROM-området.

0800 – 0AFF - adresseområde for opptak av programmene som studeres. (RAM).

0В00 – 0ВВ0 - adresseområde for skriving av data. (RAM).

0ВВ0 – startadressen til stabelen. (RAM).

En stabel er et spesielt organisert område med RAM beregnet for midlertidig lagring av data eller adresser. Det siste tallet som er skrevet til stabelen, vises først. Stabelpekeren lagrer adressen til den siste stabelcellen der informasjonen er skrevet. Når en subrutine kalles opp, lagres returadressen til hovedprogrammet automatisk på stabelen. Som regel lagres innholdet i alle registre som er involvert i dens utførelse i begynnelsen av hver subrutine på stabelen, og på slutten av subrutinen blir de gjenopprettet fra stabelen.

Dataformat og kommandostruktur for monteringsspråk

Minnet til MP KR580VM80 er en rekke 8-bits ord kalt bytes.Hver byte har sin egen 16-bits adresse, som bestemmer posisjonen i sekvensen av minneceller. MP kan adressere 65536 byte med minne, som kan inneholde både ROM og RAM.

Dataformat

Data lagres i minnet som 8-bits ord:

D7 D6 D5 D4 D3 D2 D1 D0

Den minst signifikante biten er bit 0, den mest signifikante biten er bit 7.

En kommando er preget av formatet, det vil si antall biter som er tildelt for den, som er delt byte-for-byte i visse funksjonelle felt.

Kommandoformat

MP KR580VM80-kommandoer har ett, to eller tre byte-format. Multibyte-kommandoer må plasseres på tilstøtende språk. Kommandoformatet avhenger av spesifikasjonene til operasjonen som utføres.

Den første byten av kommandoen inneholder operasjonskoden, skrevet i mnemonisk form.

Den bestemmer kommandoformatet og handlingene som må utføres av MP på dataene under utførelsen, og adresseringsmetoden, og kan også inneholde informasjon om plasseringen av dataene.

Den andre og tredje byten kan inneholde data som operasjoner utføres på, eller adresser som indikerer plasseringen av dataene. Dataene som handlinger utføres på kalles operander.

Single-byte kommandoformat i henhold til figur 2

Figur 4

I assembly-språkkommandoer har operasjonskoden en forkortet form for å skrive engelske ord - en mnemonisk notasjon. Mnemonics (fra det greske mnemonic - kunsten å memorere) gjør det lettere å huske kommandoer etter deres funksjonelle formål.

Før utførelse oversettes kildeprogrammet ved hjelp av et oversettelsesprogram kalt assembler til språket for kodekombinasjoner - maskinspråk, i denne formen plasseres det i minnet til MP og brukes deretter når kommandoen utføres.


Adresseringsmetoder

Alle operandkoder (inngang og utgang) må være plassert et sted. De kan være plassert i de interne registrene til MP (den mest praktiske og raskt alternativ). De kan ligge i systemminne(det vanligste alternativet). Til slutt kan de lokaliseres i I/O-enheter (det sjeldneste tilfellet). Plasseringen av operandene bestemmes av instruksjonskoden. Eksistere ulike metoder, med hvilken instruksjonskoden kan bestemme hvor inngangsoperanden skal tas og hvor utgangsoperanden skal plasseres. Disse metodene kalles adresseringsmetoder.

For MP KR580VM80 finnes følgende adresseringsmetoder:

Direkte;

Registrere;

Indirekte;

Stablet.

Direkte adressering forutsetter at (input)-operanden er plassert i minnet umiddelbart etter instruksjonskoden. Operaanden er vanligvis en konstant som må sendes et sted, legges til noe osv. dataene er inneholdt i den andre eller andre og tredje byten av kommandoen, med den lave byten med data plassert i den andre byten av kommandoen, og den høye byten i den tredje kommandobyten.

Rett (aka absolutt) adressering forutsetter at operanden (inngang eller utgang) er plassert i minnet på adressen, hvis kode er plassert inne i programmet umiddelbart etter instruksjonskoden. Brukes i tre-byte kommandoer.

Registrere adressering forutsetter at operanden (inngang eller utgang) er i det interne registeret til MP. Brukes i enkeltbyte-kommandoer

Indirekte (implisitt) adressering forutsetter at det interne registeret til MP ikke inneholder selve operanden, men adressen i minnet.

Stable adressering forutsetter at kommandoen ikke inneholder en adresse. Adressering av minneceller ved hjelp av innholdet i 16-bits SP-registeret (stabelpeker).

Kommandosystem

MP-kommandosystemet er en komplett liste over elementære handlinger som MP er i stand til å utføre. MP kontrollert av disse kommandoene utfører enkle handlinger, slik som elementære aritmetiske og logiske operasjoner, dataoverføring, sammenligning av to verdier, etc. Antallet kommandoer til MP KR580VM80 er 78 (som tar hensyn til modifikasjoner 244).

Følgende grupper av kommandoer skilles ut:

Data overføring;

Aritmetikk;

Hjernetrim;

Hoppkommandoer;

Input/output, control og stack-kommandoer.


Symboler og forkortelser som brukes når du beskriver kommandoer og komponerer programmer

Symbol Reduksjon
ADDR 16-biters adresse
DATA 8-biters data
DATA 16 16-biters data
HAVN 8-biters I/O-enhetsadresse
BYTE 2 Andre byte av kommandoen
BYTE 3 Tredje kommandobyte
R, Rl, R2 Ett av registrene: A, B, C, D, E, H, L
R.P. Ett av registerparene: B - spesifiserer paret BC; D - spesifiserer et DE-par; H – spesifiserer HL-paret
RH Første register av paret
R.L. Andre register av paret
Λ Logisk multiplikasjon
V Logisk tillegg
Tillegg modulo to
M En minnecelle hvis adresse spesifiserer innholdet i registerparet HL, dvs. M = (HL)

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

    1.1. Registrerer.

    1.1.1 Generelle registre.

1.1.2. Segmentregistre

1.1.3 Flaggregister

1.2. Organisering av minne.

1.3. Datapresentasjon.

1.3.1 Datatyper

1.3.2 Representasjon av tegn og strenger

2. Programerklæringer i assembler …………………………………………

    1. Monteringsspråkkommandoer

2.2. Adresseringsmoduser og maskininstruksjonsformater

3. Pseudo-operatører……………………………………………………………….

3.1 Datadefinisjonsdirektiver

3.2 Struktur av et assemblerprogram

3.2.1 Programsegmenter. anta direktiv

3.2.3 Forenklet segmenteringsdirektiv

4. Sette sammen og komponere programmet ………………………….

5. Dataoverføringskommandoer……………………………………………………….

    5.1 Generelle kommandoer

    5.2 Stablekommandoer

5.3 I/O-kommandoer

5.4 Kommandoer for videresending av adresser

5.5 Kommandoer for videresending av flagg

6. Regnekommandoer………………………………………………….

    6.1 Aritmetiske operasjoner på binære heltall

6.1.1 Addisjon og subtraksjon

6.1.2 Kommandoer for å øke og redusere mottakeren med én

6.2 Multiplikasjon og divisjon

6.3 Fortegnsendring

7. Logiske operasjoner……………………………………………………….

8. Skifter og sykliske skift………………………………………………………………

9. Strengeoperasjoner……………………………………………………………….

10. Logikk og organisering av programmer…………………………………………

10.1 Ubetingede hopp

10.2 Betingede hopp

10.4 Prosedyrer på assemblerspråk

10.5 INT-avbrudd

10.6 Systemprogramvare

10.6.1.1 Lese tastaturet.

10.6.1.2 Vise tegn på skjermen

10.6.1.3 Avslutte programmer.

10.6.2.1 Velge visningsmoduser

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

11.2 Filfordelingstabell

11.3 Disk I/O-operasjoner

11.3.1 Skrive en fil til disk

11.3.1.1 ASCIIZ-data

11.3.1.2 Filnummer

11.3.1.3 Opprette en diskfil

11.3.2 Lese en diskfil

Introduksjon

Monteringsspråk er en symbolsk representasjon av maskinspråk. Alle prosesser i en personlig datamaskin (PC) på det laveste maskinvarenivået drives kun av maskinspråkkommandoer (instruksjoner). Det er umulig å virkelig løse problemer relatert til maskinvare (eller til og med, dessuten, avhengig av maskinvare, for eksempel å øke hastigheten på et program), uten kunnskap om assembler.

Samleren er en praktisk form for kommandoer direkte for PC-komponenter og krever kunnskap om egenskapene og egenskapene til den integrerte kretsen som inneholder disse komponentene, nemlig PC-mikroprosessoren. Dermed er monteringsspråk direkte relatert til den interne organiseringen av PC-en. Og det er ingen tilfeldighet at nesten alle høynivåspråkkompilatorer støtter tilgang til assembly-nivået for programmering.

Et element i opplæringen av en profesjonell programmerer er nødvendigvis studiet av assembler. Dette er fordi assembly-språkprogrammering krever kunnskap om PC-arkitektur, som lar deg lage mer effektive programmer på andre språk og kombinere dem med assembly-språkprogrammer.

Håndboken diskuterer programmering i assemblerspråk for datamaskiner basert på Intel-mikroprosessorer.

Denne opplæringen er rettet til alle som er interessert i prosessorarkitektur og det grunnleggende om programmering i Assembly-språk, først og fremst til programvareproduktutviklere.

    PC-arkitektur.

Dataarkitektur er en abstrakt representasjon av en datamaskin, som gjenspeiler dens strukturelle, kretsløp og logiske organisering.

Alle moderne datamaskiner har noen felles og individuelle arkitektoniske egenskaper. Individuelle egenskaper er unike for en bestemt datamaskinmodell.

Konseptet med dataarkitektur inkluderer:

    datamaskin blokkdiagram;

    midler og metoder for tilgang til elementer i datamaskinblokkdiagrammet;

    sett og tilgjengelighet av registre;

    organisering og metoder for adressering;

    metode for presentasjon og format på datadata;

    et sett med instruksjoner for datamaskiner;

    maskininstruksjonsformater;

    avbryte håndteringen.

Hovedelementene i maskinvare: systemenhet, tastatur, skjermenheter, diskstasjoner, utskriftsenheter (skriver) og diverse kommunikasjonsutstyr. Systemenhet består av hovedkort, strømforsyning og utvidelsesceller for ekstra kort. Hovedkortet inneholder en mikroprosessor, skrivebeskyttet minne (ROM), RAM(RAM) og koprosessor.

      Registrerer.

Inne i mikroprosessoren finnes informasjon i en gruppe på 32 registre (16 brukere, 16 system), i en eller annen grad, tilgjengelig for bruk av programmereren. Siden håndboken er viet programmering for 8088-i486 mikroprosessoren, er det mest logisk å starte dette emnet med en diskusjon av de interne registrene til mikroprosessoren som er tilgjengelige for brukeren.

Brukerregistre brukes av programmereren til å skrive programmer. Disse registrene inkluderer:

    åtte 32-bits registre (generelle registre) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

    seks 16-bits segmentregistre: CS, DS, SS, ES, FS, GS;

    status- og kontrollregistre: EFLAGS/FLAGS flaggregister, og EIP/IP kommandopekerregister.

Deler av ett 32-bits register er indikert med en skråstrek. Prefikset E (Utvidet) indikerer bruken av et 32-bits register. For å jobbe med byte brukes registre med prefikser L (lav) og H(høy), for eksempel AL, CH - som angir de lave og høye bytene til 16-bitsdelene av registrene.

        Generelle formålsregistre.

EAX/AX/AH/AL(akkumulatorregister) – batteri. Brukes i multiplikasjon og divisjon, i I/O-operasjoner og i noen strengoperasjoner.

EBX/BX/BH/BL – basisregister(grunnregister), ofte brukt ved adressering av data i minnet.

ECX/CX/CH/CL – disk(telleregister), brukt som teller for antall repetisjoner av loopen.

EDX/DX/DH/DL – dataregister(dataregister), brukes til å lagre mellomdata. I noen lag er bruken obligatorisk.

Alle registre i denne gruppen gir tilgang til deres "nedre" deler. Bare de nedre 16- og 8-bitsdelene av disse registerene kan brukes til selvadressering. De øvre 16 bitene i disse registerene er ikke tilgjengelige som uavhengige objekter.

For å støtte strengbehandlingskommandoer som tillater sekvensiell behandling av kjeder av elementer med en lengde på 32, 16 eller 8 biter, brukes følgende:

ESI/SI (kildeindeksregister) – indeks kilde. Inneholder adressen til gjeldende kildeelement.

EDI/DI (destinasjonsindeksregister) – indeks mottaker(mottaker). Inneholder gjeldende adresse i mållinjen.

I mikroprosessorarkitekturen støttes en datastruktur – en stack – på maskinvare- og programvarenivå. Det er spesielle instruksjoner og spesielle registre for arbeid med stabelen. Det skal bemerkes at stabelen fylles mot mindre adresser.

ESP/SP (stabelpekerregister) – registrere pekeren stable. Inneholder en peker til toppen av stabelen i gjeldende stabelsegment.

EBP/BP (basispekerregister) – stabelbasepekerregister. Designet for å organisere tilfeldig tilgang til data inne i stabelen.

1.1.2. Segmentregistre

Mhar seks segmentregistre: CS, SS, DS, ES, GS, FS. Deres eksistens skyldes den spesifikke organiseringen og bruken av RAM av Intels mikroprosessorer. Mikroprosessormaskinvaren støtter den strukturelle organiseringen av programmet som består av segmenter. For å indikere segmentene som er tilgjengelige i dette øyeblikket segmentregistre er ment. Mikroprosessoren støtter følgende segmenttyper:

    Kodesegment. Inneholder programkommandoer. For å få tilgang til dette segmentet, bruk CS-registeret (kodesegmentregister) - segmentkoderegister. Den inneholder adressen til maskininstruksjonssegmentet som mikroprosessoren har tilgang til.

    Datasegment. Inneholder data behandlet av programmet. For å få tilgang til dette segmentet, bruk DS-registeret (datasegmentregister) - segmentdataregister, som lagrer adressen til det gjeldende programmets datasegment.

    Stabelsegment. Dette segmentet er et minneområde som kalles stabelen. Mikroprosessoren organiserer stabelen i henhold til prinsippet - først "inn", først "ut". For å få tilgang til stabelen, bruk SS-registeret (stacksegmentregister) - stabelsegmentregister, som inneholder adressen til stabelsegmentet.

    Ekstra datasegment. De behandlede dataene kan lokaliseres i ytterligere tre datasegmenter. Som standard antas dataene å være i datasegmentet. Når du bruker ekstra datasegmenter, må adressene spesifiseres eksplisitt ved å bruke spesielle segmentoverstyringsprefikser i kommandoen. Adresser til tilleggsdatasegmenter må finnes i ES-, GS-, FS-registrene (utvidelsesdatasegmentregistre).

        Kontroll- og statusregistre

Mikroprosessoren inneholder flere registre som inneholder informasjon om tilstanden til både selve mikroprosessoren og programmet hvis kommandoer for øyeblikket er lastet inn i rørledningen. Dette:

EIP/IP Instruksjonspekerregister;

    flaggregister EFLAGS/FLAGGER.

Ved å bruke disse registrene kan du få informasjon om resultatene av kommandoutførelse og påvirke tilstanden til selve mikroprosessoren.

EIP/IP (instruksjonspekerregister) – pekeren lag. EIP/IP-registeret er 32-bit eller 16-bit bredt og inneholder forskyvningen av den neste instruksjonen som skal utføres i forhold til innholdet i CS-segmentregisteret i det gjeldende instruksjonssegmentet. Dette registeret er ikke direkte tilgjengelig, men kan endres ved hjelp av hoppinstruksjoner.

EFLAGS/FLAGS (Flaggregister) – registrere flagg. Bitstørrelse 32/16 bits. Individuelle biter av dette registeret har et spesifikt funksjonelt formål og kalles flagg. Et flagg er en bit som tar verdien 1 ("flaggesett") hvis en betingelse er oppfylt, og verdien 0 ("flagget slettet") ellers. Den lave delen av dette registeret er fullstendig lik FLAGS-registeret for i8086.

1.1.3 Flaggregister

Flaggregisteret er 32-bit og heter EFLAGS (fig. 1). Individuelle biter av registeret har et spesifikt funksjonelt formål og kalles flagg. Hver av dem er tildelt et spesifikt navn (ZF, CF, etc.). De nederste 16 bitene av EFLAGS representerer 16-bits FLAGS-flaggregisteret som brukes ved utføring av programmer skrevet for i086- og i286-mikroprosessorene.

Fig.1 Flaggregister

Noen flagg kalles ofte tilstandsflagg; de endres automatisk når kommandoer utføres og registrerer visse egenskaper for resultatet deres (for eksempel om det er lik null). Andre flagg kalles statsflagg; de endrer seg fra programmet og påvirker den videre oppførselen til prosessoren (for eksempel blokkerer de avbrudd).

Tilstandsflagg:

CF (bæreflagg) - bære flagg. Tar verdien 1 hvis, når man legger til heltall, det dukket opp en bæreenhet som ikke "passet" inn i bitrutenettet, eller hvis, når man subtraherer tall uten fortegn, det første av dem var mindre enn det andre. I skiftkommandoer legges biten som er utenfor bitnettet inn i CF. CF fanger også opp funksjonene i multiplikasjonsinstruksjonen.

OF (overløpsflagg) - overløpsflagg. Sett til 1 hvis, når du legger til eller subtraherer fortegnede heltall, resultatet er et resultat som overstiger den tillatte verdien i absolutt verdi (mantissen fløt over og den "klatret" inn i fortegnssifferet).

ZF (nullflagg) - null flagg. Sett til 1 hvis kommandoresultatet er 0.

SF (SIgn flagg) - flagg skilt. Sett til 1 hvis en operasjon på fortegnede tall gir et negativt resultat.

PF (paritetsflagg) - flagg paritet. Lik 1 hvis resultatet av neste kommando inneholder et partall av binære. Vanligvis tatt i betraktning kun for I/O-operasjoner.

AF (ekstra bæreflagg) - ekstra bæreflagg. Retter funksjonene ved å utføre operasjoner på binære desimaltall.

Statens flagg:

DF (retningsflagg) - retningsflagg. Angir retningen for visning av linjer i linjekommandoer: når DF=0, vises linjer "fremover" (fra begynnelse til slutt), når DF=1 - i motsatt retning.

IOPL (inn-/utgangsrettighetsnivå) – I/O-rettighetsnivå. Brukes i beskyttet modus for mikroprosessordrift for å kontrollere tilgang til I/O-kommandoer, avhengig av privilegiet til oppgaven.

NT (nestet oppgave) – oppgave hekkende flagg. Brukes i beskyttet modus for mikroprosessordrift for å registrere det faktum at en oppgave er nestet i en annen.

Systemflagg:

IF (avbruddsflagg) - avbryte flagget. Når IF=0, slutter prosessoren å svare på innkommende avbrudd; når IF=1, fjernes avbruddsblokkeringen.

TF (felleflagg) - spore flagg. Når TF=1, etter å ha utført hver kommando, gjør prosessoren et avbrudd (nummerert 1), som kan brukes når du feilsøker et program for å spore det.

RF (fortsett flagg) – gjenoppta flagget. Brukes ved behandling av avbrudd fra feilsøkingsregistre.

VM (virtuell 8086-modus) – virtuelt 8086-flagg. 1-prosessor fungerer i virtuell 8086-modus. 0-prosessor fungerer i ekte eller beskyttet modus.

AC (Alignment check) – innrettingskontrollflagg. Designet for å tillate justeringskontroll ved tilgang til minne.

      Organisering av minne.

Det fysiske minnet som mikroprosessoren har tilgang til kalles RAM ( eller tilfeldig tilgang minne - RAM). RAM er en kjede av byte som har sin egen unike adresse (nummeret), kalt fysisk. Utvalget av fysiske adresseverdier er fra 0 til 4 GB. Minnehåndteringsmekanismen er utelukkende maskinvare.

Mikroprosessormaskinvaren støtter flere modeller for bruk av RAM:

    segmentert modell. I denne modellen er minne for programmer delt inn i sammenhengende minneområder (segmenter), og selve programmet kan kun få tilgang til dataene som ligger i disse segmentene;

    sidemodell. I dette tilfellet betraktes RAM som et sett med blokker med en fast størrelse på 4 KB. Hovedanvendelsen av denne modellen er relatert til organisasjonen virtuell hukommelse, som lar programmer bruke mer minneplass enn fysisk minne. For en Pentium-mikroprosessor kan størrelsen på mulig virtuelt minne nå 4 TB.

Bruken og implementeringen av disse modellene avhenger av driftsmodusen til mikroprosessoren:

    Ekte adressemodus (virkelig modus). Modusen ligner på driften til i8086-prosessoren. Nødvendig for drift av programmer utviklet for tidlige prosessormodeller.

    Beskyttet modus. Beskyttet modus lar deg multitaske Informasjonsbehandling, minnebeskyttelse ved hjelp av en fire-nivå privilegiemekanisme og dens personsøkerorganisasjon.

    Virtuell 8086-modus. I denne modusen blir det mulig å kjøre flere programmer for i8086. I dette tilfellet kan programmer i ekte modus fungere.

Segmentering er en adresseringsmekanisme som sikrer eksistensen av flere uavhengige adresserom. Et segment er en uavhengig, maskinvarestøttet minneblokk.

Hvert program kan generelt bestå av et hvilket som helst antall segmenter, men det har direkte tilgang til tre hovedsegmenter: kode, data og stack – og fra ett til tre ekstra datasegmenter. Operativsystemet plasserer programsegmenter i RAM på spesifikke fysiske adresser, og plasserer deretter verdiene til disse adressene i de aktuelle registrene. Innenfor et segment aksesserer programmet adresser i forhold til begynnelsen av segmentet lineært, dvs. starter fra adresse 0 og slutter med en adresse som er lik størrelsen på segmentet. Pårørende adresse eller partiskhet, som mikroprosessoren bruker for å få tilgang til data innenfor et segment kalles effektive.

Dannelse av en fysisk adresse i ekte modus

I reell modus er utvalget av endringer i den fysiske adressen fra 0 til 1 MB. Maksimal segmentstørrelse er 64 KB. Når du kontakter en bestemt fysisk adresse RAM bestemmes av adressen til begynnelsen av segmentet og forskyvningen innenfor segmentet. Segmentstartadressen hentes fra det tilsvarende segmentregisteret. I dette tilfellet inneholder segmentregisteret bare de mest signifikante 16 bitene av den fysiske adressen til begynnelsen av segmentet. De manglende lave fire bitene av 20-bits adressen oppnås ved å flytte verdien av segmentregisteret til venstre med 4 biter. Skiftoperasjonen utføres i maskinvare. Den resulterende 20-bits verdien er den virkelige fysiske adressen som tilsvarer begynnelsen av segmentet. Det er fysisk adresse er spesifisert som et "segment:offset"-par, der "segment" er de første 16 bitene av startadressen til minnesegmentet som cellen tilhører, og "offset" er 16-bits adressen til denne cellen, regnet fra begynnelsen av dette minnesegmentet (verdi 16 * segment + offset gir den absolutte adressen til cellen). Hvis for eksempel CS-registeret lagrer verdien 1234h, definerer adresseparet 1234h:507h en absolutt adresse lik 16*1234h+507h =12340h+507h = 12847h. Et slikt par er skrevet som et dobbeltord, og (som for tall) i en "invertert" form: det første ordet inneholder en offset, og det andre - et segment, og hvert av disse ordene presenteres på sin side i en "omvendt" form. For eksempel vil paret 1234h:5678h bli skrevet slik:| 78 | 56| 34 | 12|.

Denne mekanismen for å generere en fysisk adresse gjør det mulig å gjøre programvaren flyttbar, det vil si uavhengig av spesifikke lasteadresser i RAM.

Programmering på maskininstruksjonsnivå er minimumsnivået der programmer kan skrives. Systemet med maskininstruksjoner må være tilstrekkelig til å implementere de nødvendige handlingene ved å gi instruksjoner til maskinvaren.

Hver maskinkommando består av to deler:

  • operasjonell - bestemme "hva du skal gjøre";
  • operand - definerer behandlingsobjekter, "hva skal jeg gjøre med."

Mikroprosessormaskinkommandoen, skrevet i assemblerspråk, er én linje med følgende syntaktiske form:

kommando-/direktivetikett operand(er) ;kommentarer

I dette tilfellet er det nødvendige feltet i linjen en kommando eller et direktiv.

Etiketten, kommandoen/direktivet og operandene (hvis noen) er atskilt med minst ett mellomrom eller tabulatortegn.

Hvis en kommando eller et direktiv må fortsette på neste linje, brukes omvendt skråstrek: \.

Som standard skiller ikke assemblerspråk mellom store og små bokstaver når du skriver kommandoer eller direktiver.

Eksempel på kodelinjer:

Tell db 1 ;Navn, direktiv, en operand
mov eax,0 ;Kommando, to operander
cbw ; Team

Tagger

Merkelapp i assemblerspråk kan inneholde følgende symboler:

  • alle bokstaver i det latinske alfabetet;
  • tall fra 0 til 9;
  • spesialtegn: _, @, $, ?.

Et punktum kan brukes som det første tegnet i en etikett, men noen kompilatorer anbefaler ikke å bruke dette tegnet. Reserverte Assembler-navn (direktiver, operatører, kommandonavn) kan ikke brukes som etiketter.

Det første tegnet i etiketten må være en bokstav eller spesialtegn (men ikke et tall). Maksimal lengde tagger – 31 tegn. Alle etiketter som er skrevet på en linje som ikke inneholder et assembler-direktiv, må slutte med et kolon: .

Lag

Team forteller oversetteren hvilken handling mikroprosessoren skal utføre. I et datasegment definerer en kommando (eller direktiv) et felt, arbeidsområde eller konstant. I et kodesegment spesifiserer en kommando en handling, for eksempel å flytte (mov) eller legge til (legge til).

direktiver

Montøren har en rekke operatører som lar deg kontrollere prosessen med montering og oppføring. Disse operatørene kalles direktiver . De handler bare under prosessen med å sette sammen programmet, og i motsetning til kommandoer genererer de ikke maskinkode.

Operander

Operand – et objekt som en maskinkommando eller programmeringsspråksetning utføres på.
En instruksjon kan ha en eller to operander, eller ingen operander i det hele tatt. Antall operander er implisitt spesifisert av instruksjonskoden.
Eksempler:

  • Ingen operander ret ;Retur
  • En operand inc ecx ;Øk ecx
  • To operander legger til eax,12 ;Legg til 12 til eax

Etiketten, kommandoen (direktivet) og operanden trenger ikke å starte på noen bestemt posisjon på linjen. Det anbefales imidlertid å skrive dem i en spalte for å gjøre programmet lettere å lese.

Operandene kan være

  • identifikatorer;
  • strenger med tegn omsluttet av enkle eller doble anførselstegn;
  • heltall i binære, oktale, desimale eller heksadesimale tallsystemer.
Identifikatorer

Identifikatorer – sekvenser av gyldige tegn som brukes til å betegne programobjekter som operasjonskoder, variabelnavn og etikettnavn.

Regler for registrering av identifikatorer.

  • Identifikatoren kan bestå av ett eller flere tegn.
  • Som symboler kan du bruke bokstaver i det latinske alfabetet, tall og noen spesialtegn: _, ?, $, @.
  • En identifikator kan ikke begynne med et siffertegn.
  • Lengden på identifikatoren kan være opptil 255 tegn.
  • Oversetteren godtar de første 32 tegnene i identifikatoren og ignorerer resten.
Kommentarer

Kommentarer er atskilt fra den kjørbare linjen med et tegn; . I dette tilfellet er alt skrevet etter semikolon og opp til slutten av linjen en kommentar. Å bruke kommentarer i et program forbedrer dets klarhet, spesielt der formålet med et sett med kommandoer er uklart. Kommentaren kan inneholde alle utskrivbare tegn, inkludert mellomrom. En kommentar kan strekke seg over hele linjen eller følge en kommando på samme linje.

Oppbygging av monteringsprogrammet

Et program skrevet på assembler kan bestå av flere deler kalt moduler . Hver modul kan ha ett eller flere data-, stabel- og kodesegmenter definert. Ethvert komplett assemblerprogram må inkludere én hoved- eller hovedmodul som utførelsen starter fra. En modul kan inneholde kodesegmenter, datasegmenter og stabelsegmenter, deklarert ved hjelp av passende direktiver. Før du deklarerer segmenter, må du spesifisere minnemodellen ved å bruke .MODEL-direktivet.

Et eksempel på et "gjør ingenting"-program i assemblerspråk:

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

RET
SLUTT START

Dette programmet inneholder bare én mikroprosessorkommando. Denne kommandoen er RET. Det sikrer at programmet avsluttes på riktig måte. Generelt brukes denne kommandoen til å avslutte en prosedyre.
Resten av programmet gjelder driften av oversetteren.
.686P - Pentium 6 (Pentium II) beskyttet modus kommandoer er tillatt. Dette direktivet velger det støttede settet med monteringsinstruksjoner, som indikerer prosessormodellen. Bokstaven P angitt på slutten av direktivet informerer oversetteren om at prosessoren opererer i beskyttet modus.
.MODEL FLAT, stdcall - flat minne modell. Denne minnemodellen brukes i operasjonssalen Windows-system. stdcall
.DATA er et programsegment som inneholder data.
.CODE er en programblokk som inneholder kode.
START - etikett. I assembler spiller tagger en stor rolle, noe som ikke kan sies om moderne høynivåspråk.
END START - slutten av programmet og en melding til oversetteren om at programkjøringen skal begynne med START-etiketten.
Hver modul må inneholde et END-direktiv for å markere slutten kildekode programmer. Alle linjer som følger END-direktivet ignoreres. Hvis du utelater END-direktivet, genereres en feil.
Etiketten spesifisert etter END-direktivet forteller oversetteren navnet på hovedmodulen som programkjøringen starter fra. Hvis programmet inneholder én modul, kan etiketten etter END-direktivet utelates.




Topp