Monteringsspråkkommandoer for arbeid med glass. Programmering: Monteringsspråk. Grunnleggende språk for montering. Kort om strukturen i språket

Programmering på nivå med maskininstruksjoner er minimumsnivået der programmering er mulig. Systemet med maskininstruksjoner må være tilstrekkelig til å implementere de nødvendige handlingene ved å gi instruksjoner til maskinvaren.

Hver maskininstruksjon består av to deler:

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

Maskininstruksjonen til mikroprosessoren, skrevet på assemblerspråk, er en enkelt linje med følgende syntaktiske form:

merke kommando/direktiv operand(er) ;kommentarer

I dette tilfellet er et obligatorisk felt på en linje 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 i kommandoer eller direktiver.

Eksempel på kodelinjer:

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

Tagger

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

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

En prikk kan brukes som det første tegnet på en etikett, men noen kompilatorer fraråder dette tegnet. Reserverte assembly-språknavn (direktiver, operatører, kommandonavn) kan ikke brukes som etiketter.

Det første tegnet i etiketten må være en bokstav eller spesialtegn (ikke et tall). Maksimal lengde etiketter - 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 definerer en instruksjon en handling, for eksempel et trekk (mov) eller et tillegg (legg til).

direktiver

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

operander

Operand – et objekt som en maskinkommando eller en programmeringsspråkoperatør 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 i strengen. Det anbefales imidlertid å skrive dem i en kolonne for større lesbarhet av programmet.

Operander kan være

  • identifikatorer;
  • strenger med tegn omsluttet av enkle eller doble anførselstegn;
  • heltall i binær, oktal, desimal eller heksadesimal.
Identifikatorer

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

Regler for å skrive identifikatorer.

  • Identifikatoren kan være ett eller flere tegn.
  • Som tegn kan du bruke bokstaver i det latinske alfabetet, tall og noen spesialtegn: _, ?, $, @.
  • En identifikator kan ikke starte med et siffertegn.
  • ID-en kan være på 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 som er skrevet etter semikolontegnet og opp til slutten av linjen en kommentar. Bruken av kommentarer i et program forbedrer dets klarhet, spesielt der formålet med et sett med instruksjoner er uklart. Kommentaren kan inneholde alle utskrivbare tegn, inkludert mellomrom. Kommentaren kan strekke seg over hele linjen eller følge kommandoen på samme linje.

Oppbygging av monteringsprogrammet

Et program skrevet på assembler kan bestå av flere deler, kalt moduler . Hver modul kan definere ett eller flere data-, stabel- og kodesegmenter. Ethvert komplett assembly-språkprogram må inkludere én hoved- eller hovedmodul hvorfra kjøringen starter. En modul kan inneholde kode, data og stabelsegmenter deklarert med de aktuelle direktivene. 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 kun én mikroprosessorinstruksjon. Denne kommandoen er RET. Det sikrer riktig avslutning av programmet. Generelt brukes denne kommandoen til å avslutte en prosedyre.
Resten av programmet er relatert til driften av oversetteren.
.686P - Pentium 6 (Pentium II) beskyttet modus kommandoer er tillatt. Dette direktivet velger det støttede assembler-instruksjonssettet ved å spesifisere prosessormodellen. Bokstaven P på slutten av direktivet forteller oversetteren at prosessoren kjører i beskyttet modus.
.MODEL FLAT, stdcall er en flat minnemodell. Denne minnemodellen brukes i operasjonssalen Windows-system. stdcall
.DATA er et programsegment som inneholder data.
.CODE er en programblokk som inneholder kode.
START er en etikett. I assembler spiller etiketter 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 programmet må startes fra etiketten START.
Hver modul må inneholde et END-direktiv som markerer slutten kildekode programmer. Alle linjer som følger END-direktivet ignoreres. Å utelate END-direktivet genererer en feil.
Etiketten etter END-direktivet forteller kompilatoren navnet på hovedmodulen som programkjøringen starter fra. Hvis programmet inneholder én modul, kan etiketten etter END-direktivet utelates.

NATIONAL UNIVERSITY OF UZBEKISTAN OPPKAPT ETTER MIRZO ULUGBEK

FAKULTETET FOR DATATEKNOLOGI

Om emnet: Semantisk parsing av en EXE-fil.

Fullført:

Tasjkent 2003.

Forord.

Monteringsspråk og instruksjonsstruktur.

EXE-filstruktur (semantisk parsing).

Strukturen til en COM-fil.

Hvordan viruset virker og sprer seg.

Demonter.

Programmer.

Forord

Yrket som programmerer er fantastisk og unikt. I vår tid kan vitenskap og liv ikke forestilles uten den nyeste teknologien. Alt som er knyttet til menneskelig aktivitet kan ikke klare seg uten informatikk. Og dette bidrar til dens høye utvikling og perfeksjon. Selv om utviklingen av personlige datamaskiner begynte for ikke så lenge siden, men i løpet av denne tiden ble det tatt kolossale skritt i programvareprodukter, og i lang tid vil disse produktene bli mye brukt. Feltet for datarelatert kunnskap har eksplodert, det samme har den relaterte teknologien. Hvis vi ikke tar hensyn til den kommersielle siden, kan vi si at det ikke er fremmede i dette området av ​profesjonell aktivitet. Mange er engasjert i utviklingen av programmer, ikke for profitt eller inntekt, men av egen fri vilje, av lidenskap. Dette skal selvfølgelig ikke påvirke kvaliteten på programmet, og i denne bransjen er det så å si konkurranse og etterspørsel etter kvalitetsprestasjoner, for stabilt arbeid og oppfyllelse av alle vår tids krav. Her er det også verdt å merke seg utseendet til mikroprosessorer på 60-tallet, som kom til å erstatte et stort antall sett med lamper. Det er noen varianter av mikroprosessorer som er veldig forskjellige fra hverandre. Disse mikroprosessorene skiller seg fra hverandre når det gjelder bitkapasitet og innebygde systemkommandoer. De vanligste er: Intel, IBM, Celeron, AMD, etc. Alle disse prosessorene er relatert til den avanserte arkitekturen til Intel-prosessorer. Utbredelsen av mikrodatamaskiner har forårsaket en nytenkning av holdninger til forsamlingsspråk av to hovedgrunner. For det første krever programmer skrevet i assemblerspråk betydelig mindre minne og kjøretid. For det andre gir kunnskap om assembly-språket og den resulterende maskinkoden en forståelse av maskinarkitekturen, noe som knapt gis når man arbeider i et høynivåspråk. Selv om de fleste programvareingeniører utvikler på høynivåspråk som Pascal, C eller Delphi, som er lettere å skrive programmer, er den kraftigste og mest effektive programvare helt eller delvis skrevet på samlespråk. Språk på høyt nivå ble designet for å unngå spesielle tekniske funksjoner spesifikke datamaskiner. Og monteringsspråket er på sin side designet for de spesifikke spesifikasjonene til prosessoren. Derfor, for å skrive et assembly-språkprogram for en bestemt datamaskin, må man kjenne arkitekturen. I dag er utsikten over hovedsiden programvareprodukt er en EXE-fil. Med tanke på positive sider dette kan forfatteren av programmet være sikker på dets ukrenkelighet. Men ofte er dette langt fra tilfelle. Det er også en demonter. Ved hjelp av en demonter kan du finne ut avbrudd og programkoder. Det vil ikke være vanskelig for en person som er godt bevandret i assembler å gjenskape hele programmet etter sin smak. Det er kanskje her det mest uløselige problemet kommer fra - viruset. Hvorfor skriver folk et virus? Noen stiller dette spørsmålet med overraskelse, noen med sinne, men likevel er det fortsatt folk som er interessert i denne oppgaven, ikke ut fra synspunktet om å forårsake skade, men som en interesse for systemprogrammering. Skriv virus på ulike årsaker. Noen liker systemanrop, andre forbedrer kunnskapen sin i assembler. Jeg skal prøve å forklare alt dette i min semesteroppgave. Den sier også ikke bare om strukturen til EXE-filen, men også om assemblerspråket.

^ Forsamlingsspråk.

Det er interessant å følge, fra tidspunktet for utseendet til de første datamaskinene og slutter med i dag, transformasjonen av ideer om monteringsspråk blant programmerere.

En gang i tiden var assembler et språk uten å vite hvilket det var umulig å få en datamaskin til å gjøre noe nyttig. Gradvis endret situasjonen seg. Mer praktiske kommunikasjonsmidler med en datamaskin dukket opp. Men, i motsetning til andre språk, døde ikke assembler, dessuten kunne han ikke gjøre dette i prinsippet. Hvorfor? På jakt etter et svar vil vi prøve å forstå hva forsamlingsspråk er generelt.

Kort sagt er monteringsspråk en symbolsk representasjon av maskinspråk. Alle prosesser i maskinen på det laveste maskinvarenivået drives kun av kommandoer (instruksjoner) fra maskinspråket. Fra dette er det klart at, til tross for det vanlige navnet, er monteringsspråket for hver type datamaskin forskjellig. Dette gjelder også utseende programmer skrevet i assembler, og ideene som dette språket er en refleksjon av.

Det er umulig å virkelig løse maskinvarerelaterte problemer (eller til og med maskinvarerelaterte, for eksempel å forbedre hastigheten til et program), uten kunnskap om assembler.

En programmerer eller en hvilken som helst annen bruker kan bruke alle verktøy på høyt nivå, opp til programmer for å bygge virtuelle verdener, og kanskje ikke engang mistenke at datamaskinen faktisk utfører ikke kommandoene til språket programmet er skrevet på, men deres transformert representasjon i form av en kjedelig og kjedelig sekvens av kommandoer av et helt annet språk - maskinspråk. La oss nå forestille oss at en slik bruker har et ikke-standard problem eller bare noe gikk galt. For eksempel må programmet hans fungere med en uvanlig enhet eller utføre andre handlinger som krever kunnskap om prinsippene for maskinvare. Uansett hvor smart en programmerer er, uansett hvor godt språket han skrev det fantastiske programmet på, kan han ikke klare seg uten kunnskap om assembler. Og det er ingen tilfeldighet at nesten alle kompilatorer av høynivåspråk inneholder midler for å koble modulene deres med moduler i assembler eller støtter tilgang til assembler-programmeringsnivået.

Datavognenes tid er selvfølgelig allerede passert. Som det sies, du kan ikke omfavne det enorme. Men det er noe til felles, et slags grunnlag som enhver seriøs datautdanning er bygget på. Dette er kunnskap om prinsippene for datamaskindrift, dens arkitektur og monteringsspråk som en refleksjon og legemliggjøring av denne kunnskapen.

En typisk moderne datamaskin (i486- eller Pentium-basert) består av følgende komponenter (Figur 1).

Ris. 1. Datamaskin og periferiutstyr

Ris. 2. Blokkdiagram av en personlig datamaskin

Fra figuren (Figur 1) kan man se at datamaskinen er bygd opp av flere fysiske enheter, som hver er koblet til én enhet, kalt systemenheten. Logisk sett er det klart at det spiller rollen som en eller annen koordinerende enhet. La oss ta en titt på innsiden systemblokk(ingen grunn til å prøve å komme inn i skjermen - det er ikke noe interessant der, foruten det er farlig): vi åpner saken og ser noen tavler, blokker, tilkoblingsledninger. For å forstå deres funksjonelle formål, la oss se på blokkskjemaet til en typisk datamaskin (fig. 2). Den utgir seg ikke for absolutt nøyaktighet og tar kun sikte på å vise hensikten, sammenkoblingen og den typiske sammensetningen av elementene i en moderne personlig datamaskin.

La oss diskutere diagrammet i fig. 2 i en noe ukonvensjonell stil.
Det er menneskets natur, å møte noe nytt, å lete etter noen assosiasjoner som kan hjelpe ham til å kjenne det ukjente. Hvilke assosiasjoner vekker datamaskinen? For meg er for eksempel datamaskinen ofte forbundet med personen selv. Hvorfor?

En person som skapte en datamaskin et sted i dypet av seg selv, trodde at han skapte noe som ligner på seg selv. Datamaskinen har organer for oppfatning av informasjon fra omverdenen - dette er et tastatur, en mus, magnetiske diskstasjoner. På fig. 2 er disse organene plassert til høyre for systembussene. Datamaskinen har organer som "fordøyer" den mottatte informasjonen - disse er prosessor og arbeidsminne. Og til slutt har datamaskinen taleorganer som gir ut resultatene av behandlingen. Dette er også noen av enhetene til høyre.

Moderne datamaskiner selvfølgelig langt fra menneskelig. De kan sammenlignes med vesener som samhandler med omverdenen på nivå med et stort, men begrenset sett med ubetingede reflekser.
Dette settet med reflekser danner et system med maskininstruksjoner. Uansett hvor høyt nivå du kommuniserer med en datamaskin, kommer alt til slutt ned til en kjedelig og monoton sekvens av maskininstruksjoner.
Hver maskinkommando er en slags stimulans for eksitasjon av denne eller den ubetingede refleksen. Reaksjonen på denne stimulansen er alltid entydig og er "hardwired" i blokken av mikrokommandoer i form av et mikroprogram. Dette mikroprogrammet implementerer handlinger for implementering av en maskinkommando, men allerede på nivået av signaler gitt til visse logikk datamaskin, og kontrollerer derved de forskjellige undersystemene til datamaskinen. Dette er det såkalte prinsippet for mikroprogramkontroll.

For å fortsette analogien med en person, legger vi merke til: for at en datamaskin skal spise ordentlig, er det oppfunnet mange operativsystemer, kompilatorer for hundrevis av programmeringsspråk osv. Men alle er faktisk bare en rett som mat (programmer) leveres etter visse regler mage (datamaskin). Bare magen til en datamaskin elsker diett, monoton mat - gi den strukturert informasjon, i form av strengt organiserte sekvenser av nuller og enere, hvis kombinasjoner utgjør maskinspråket.

Dermed, utad, som en polyglot, forstår datamaskinen bare ett språk - språket til maskininstruksjoner. Selvfølgelig, for å kommunisere og jobbe med en datamaskin, er det ikke nødvendig å kunne dette språket, men nesten enhver profesjonell programmerer møter før eller siden behovet for å lære det. Heldigvis trenger ikke programmereren å prøve å finne ut betydningen av ulike kombinasjoner av binære tall, siden så tidlig som på 50-tallet begynte programmerere å bruke den symbolske analogen til maskinspråk for programmering, som ble kalt monteringsspråk. Dette språket gjenspeiler nøyaktig alle funksjonene til maskinspråket. Det er derfor, i motsetning til høynivåspråk, er assembly-språket forskjellig for hver type datamaskin.

Fra det foregående kan vi konkludere med at siden monteringsspråket for datamaskinen er "native", kan det mest effektive programmet bare skrives i det (forutsatt at det er skrevet av en kvalifisert programmerer). Det er et lite "men" her: dette er en veldig arbeidskrevende prosess som krever mye oppmerksomhet og praktisk erfaring. Derfor, i virkeligheten, assembler skriver hovedsakelig programmer som skal gi effektivt arbeid med maskinvare. Noen ganger skrives kritiske deler av programmet i form av utførelsestid eller minneforbruk i assembler. Deretter lages de i form av subrutiner og kombinert med kode på et høynivåspråk.

Det er fornuftig å begynne å lære monteringsspråket til en hvilken som helst datamaskin først etter å ha funnet ut hvilken del av datamaskinen som er synlig og tilgjengelig for programmering på dette språket. Dette er den såkalte dataprogrammodellen, en del av denne er mikroprosessorprogrammodellen, som inneholder 32 registre som er mer eller mindre tilgjengelige for bruk av programmereren.

Disse registrene kan deles inn i to store grupper:

^16 tilpassede registre;

16 systemregistre.

Monteringsspråkprogrammer bruker registre veldig mye. De fleste registre har et bestemt funksjonelt formål.

Som navnet tilsier kalles brukerregistre fordi programmereren kan bruke dem når han skriver programmene sine. Disse registrene inkluderer (fig. 3):

Åtte 32-biters registre som kan brukes av programmerere til å lagre data og adresser (også kalt registre for generelle formål (RON)):

seks segmentregistre: cs, ds, ss, es, fs, gs;

status- og kontrollregistre:

Flagg registrerer eflag/flagg;

eip/ip kommandopekerregister.

Ris. 3. Brukerregistre for i486 og Pentium mikroprosessorer

Hvorfor vises mange av disse registrene med en skråstrek? Nei, dette er ikke forskjellige registre - de er deler av ett stort 32-bits register. De kan brukes i programmet som separate objekter. Dette ble gjort for å sikre funksjonaliteten til programmer skrevet for de yngre 16-bits mikroprosessormodellene fra Intel, fra og med i8086. Mikroprosessorene i486 og Pentium har stort sett 32-bits registre. Antallet deres, med unntak av segmentregistre, er det samme som i8086, men dimensjonen er større, noe som gjenspeiles i betegnelsene deres - de har
prefiks e (Utvidet).

^ Registre for generelle formål
Alle registre i denne gruppen gir tilgang til deres "nedre" deler (se fig. 3). Når du ser på denne figuren, legg merke til at bare de nedre 16 og 8 bits delene av disse registerene kan brukes til selvadressering. De øvre 16 bitene i disse registerene er ikke tilgjengelige som uavhengige objekter. Dette gjøres, som vi bemerket ovenfor, for kompatibilitet med de yngre 16-bits mikroprosessormodellene fra Intel.

La oss liste opp registrene som tilhører gruppen av generelle registre. Siden disse registrene er fysisk plassert i mikroprosessoren inne i den aritmetiske logiske enheten (ALU), kalles de også ALU-registre:

eax/ax/ah/al (Akkumulatorregister) - akkumulator.
Brukes til å lagre mellomdata. I noen kommandoer kreves bruk av dette registeret;

ebx/bx/bh/bl (Basisregister) - basisregister.
Brukes til å lagre basisadressen til et objekt i minnet;

ecx/cx/ch/cl (Telleregister) - telleregister.
Den brukes i kommandoer som utfører noen repeterende handlinger. Bruken er ofte implisitt og skjult i algoritmen til den tilsvarende kommandoen.
For eksempel, sløyfeorganisasjonskommandoen, i tillegg til å overføre kontrollen til en kommando som befinner seg på en bestemt adresse, analyserer og reduserer verdien av ecx/cx-registeret med én;

edx/dx/dh/dl (Dataregister) - dataregister.
Akkurat som eax/ax/ah/al-registeret, lagrer det mellomliggende data. Noen kommandoer krever bruk; for noen kommandoer skjer dette implisitt.

Følgende to registre brukes til å støtte de såkalte kjedeoperasjonene, det vil si operasjoner som sekvensielt behandler kjeder av elementer, som hver kan være 32, 16 eller 8 biter lange:

esi/si (Kildeindeksregister) - kildeindeks.
Dette registeret i kjedeoperasjoner inneholder den gjeldende adressen til elementet i kildekjeden;

edi/di (Destination Index register) - indeks for mottakeren (mottakeren).
Dette registeret i kjedeoperasjoner inneholder gjeldende adresse i destinasjonskjeden.

I arkitekturen til mikroprosessoren på maskinvare- og programvarenivå støttes en slik datastruktur som en stack. For å jobbe med stabelen i mier det spesielle kommandoer, og i mer det spesielle registre for dette:

esp/sp (Stack Pointer register) - stack pointer register.
Inneholder en peker til toppen av stabelen i gjeldende stabelsegment.

ebp/bp (Base Pointer register) - stable frame base pointer register.
Designet for å organisere tilfeldig tilgang til data inne i stabelen.

En stack er et programområde for midlertidig lagring av vilkårlige data. Data kan selvfølgelig også lagres i datasegmentet, men i dette tilfellet, for hver midlertidig lagrede data, må det opprettes en egen navngitt minnecelle, som øker størrelsen på programmet og antall navn som brukes. Det praktiske med stabelen er at området gjenbrukes, og lagring av data på stabelen og henting av dem derfra gjøres ved hjelp av effektive push- og pop-kommandoer uten å spesifisere noen navn.
Stakken brukes tradisjonelt for eksempel til å lagre innholdet i registrene som brukes av programmet før det kalles opp en subrutine, som igjen vil bruke prosessorregistrene "til sine egne formål." Det originale innholdet i registrene lekkes fra stabelen ved retur fra subrutinen. En annen vanlig teknikk er å sende parametrene den krever til en subrutine via stabelen. Subrutinen, som vet i hvilken rekkefølge parametrene er plassert på stabelen, kan ta dem derfra og bruke dem i utførelsen. Særpreget trekk stabelen er en slags samplingsrekkefølge av dataene i den: til enhver tid er bare det øverste elementet tilgjengelig på stabelen, dvs. det siste elementet lastet inn på stabelen. Ved å sprette det øverste elementet fra stabelen blir det neste elementet tilgjengelig. Elementene i stabelen er plassert i minneområdet som er tildelt for stabelen, fra bunnen av stabelen (dvs. fra dens maksimale adresse) til etterfølgende avtagende adresser. Adressen til det øverste tilgjengelige elementet er lagret i stabelpekerregisteret SP. Som alle andre områder av programminnet, må stabelen inkluderes i et eller annet segment eller danne et eget segment. I begge tilfeller plasseres segmentadressen til det segmentet i segmentstabelregisteret SS. Således beskriver et par registre SS:SP adressen til en tilgjengelig stabelcelle: SS lagrer segmentadressen til stabelen, og SP lagrer forskyvningen av de siste dataene som er lagret på stabelen (fig. 4, a). La oss ta hensyn til det faktum at i starttilstanden peker stabelpekeren SP til en celle som ligger under bunnen av stabelen og ikke er inkludert i den.

Fig 4. Stabelorganisering: a - starttilstand, b - etter lasting av ett element (i dette eksemplet innholdet i AX-registeret), c - etter lasting av det andre elementet (innhold i DS-registeret), d - etter lossing av ett element, e - etter å ha losset to elementer og gå tilbake til den opprinnelige tilstanden.

Lasting på stabelen utføres av en spesiell push stack-kommando. Denne instruksjonen reduserer først innholdet i stabelpekeren med 2, og plasserer deretter operanden på adressen i SP. Hvis vi for eksempel ønsker å midlertidig lagre innholdet i AX-registeret på stabelen, bør vi utføre kommandoen

Stabelen går over til tilstanden vist i fig. 1.10, f. Det kan sees at stabelpekeren flyttes opp med to byte (mot lavere adresser) og operanden spesifisert i push-kommandoen skrives til denne adressen. Følgende kommando for å laste inn på stabelen, for eksempel,

vil flytte stabelen til tilstanden vist i fig. 1,10, c. Stabelen vil nå inneholde to elementer, med bare det øverste som er tilgjengelig, pekt på av stabelpekeren SP. Hvis vi etter en tid trenger å gjenopprette det opprinnelige innholdet i registrene som er lagret på stabelen, må vi utføre pop-kommandoene (pop) fra stabelen:

pop DS
pop AX

Hvor stor skal stabelen være? Det avhenger av hvor intensivt det brukes i programmet. Hvis du for eksempel planlegger å lagre en matrise på 10 000 byte på stabelen, må stabelen ha minst den størrelsen. Det bør huskes at i noen tilfeller blir stabelen automatisk brukt av systemet, spesielt når du utfører avbruddskommandoen int 21h. Med denne kommandoen skyver prosessoren først returadressen inn på stabelen, og deretter skyver DOS innholdet i registrene og annen informasjon relatert til det avbrutt programmet dit. Derfor, selv om programmet ikke bruker stabelen i det hele tatt, må den fortsatt være til stede i programmet og ha en størrelse på minst flere titalls ord. I vårt første eksempel la vi 128 ord på stabelen, noe som definitivt er nok.

^ Samlingsprogramstruktur

Et assembly-språkprogram er en samling av minneblokker kalt minnesegmenter. Et program kan bestå av ett eller flere av disse blokksegmentene. Hvert segment inneholder en samling språksetninger, som hver opptar en egen linje med programkode.

Monteringserklæringer er av fire typer:

kommandoer eller instruksjoner som er symbolske motstykker til maskininstruksjoner. Under oversettelsesprosessen konverteres monteringsinstruksjoner til de tilsvarende kommandoene til;

makrokommandoer - setninger av programteksten som er utformet på en bestemt måte og erstattes av andre setninger under oversettelse;

direktiver som forteller assembler-kompilatoren å utføre en handling. Direktiver har ingen motparter i maskinrepresentasjon;

kommentarlinjer som inneholder tegn, inkludert bokstaver i det russiske alfabetet. Kommentarer ignoreres av oversetteren.

^ Forsamlingsspråksyntaks

Setningene som utgjør et program kan være en syntaktisk konstruksjon som tilsvarer en kommando, makro, direktiv eller kommentar. For at assembler-oversetteren skal gjenkjenne dem, må de være dannet i henhold til visse syntaktiske regler. For å gjøre dette er det best å bruke en formell beskrivelse av syntaksen til språket, som grammatikkreglene. De vanligste måtene å beskrive et programmeringsspråk på på denne måten er syntaksdiagrammer og utvidede Backus-Naur-former. Til praktisk bruk syntaksdiagrammer er mer praktiske. For eksempel kan syntaksen til assembly-språksetninger beskrives ved å bruke syntaksdiagrammene vist i de følgende figurene.

Ris. 5. Assembler setningsformat

Ris. 6. Formatdirektiver

Ris. 7. Format på kommandoer og makroer

På disse tegningene:

etikettnavn - en identifikator hvis verdi er adressen til den første byten i programkildekodesetningen den angir;

navn – en identifikator som skiller dette direktivet fra andre direktiver med samme navn. Som et resultat av behandlingen av et bestemt direktiv utført av montøren, kan visse egenskaper tildeles dette navnet;

operasjonskode (COP) og direktiv er mnemoniske betegnelser for den tilsvarende maskininstruksjonen, makroinstruksjonen eller oversetterdirektivet;

operander - deler av kommando-, makro- eller assembler-direktivene, som angir objekter som operasjoner utføres på. Assembler-operander er beskrevet av uttrykk med numeriske og tekstkonstanter, variable etiketter og identifikatorer ved bruk av operasjonstegn og noen reserverte ord.

^ Hvordan bruker jeg syntaksdiagrammer? Det er veldig enkelt: alt du trenger å gjøre er å finne og deretter følge banen fra diagrammets inngang (venstre) til utgangen (høyre). Hvis en slik bane finnes, er setningen eller konstruksjonen syntaktisk korrekt. Hvis det ikke er en slik bane, vil ikke kompilatoren godta denne konstruksjonen. Når du arbeider med syntaksdiagrammer, vær oppmerksom på retningen til omkjøringen angitt av pilene, siden blant banene kan det være de som kan følges fra høyre til venstre. Faktisk reflekterer syntaktiske diagrammer logikken til oversetteren når de analyserer inndatasetningene til programmet.

Tillatte tegn når du skriver teksten til programmer er:

Alle latinske bokstaver: A-Z, a-z. I dette tilfellet anses store og små bokstaver som likeverdige;

Tall fra 0 til 9;

Tegn?, @, $, _, &;

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

Assembler-setninger er dannet fra leksemer, som er syntaktisk uatskillelige sekvenser av gyldige språksymboler som gir mening for oversetteren.

Tokenene er:

identifikatorer er sekvenser av gyldige tegn som brukes til å angi programobjekter som opkoder, variabelnavn og etikettnavn. Regelen for å skrive identifikatorer er som følger: en identifikator kan bestå av ett eller flere tegn. Som tegn kan du bruke bokstaver i det latinske alfabetet, tall og noen spesialtegn - _, ?, $, @. En identifikator kan ikke starte med et siffertegn. Lengden på identifikatoren kan være opptil 255 tegn, selv om oversetteren bare godtar de første 32 tegnene og ignorerer resten. Du kan justere lengden på mulige identifikatorer ved å bruke alternativet kommandolinje mv. I tillegg er det mulig å fortelle oversetteren å skille mellom store og små bokstaver eller ignorere forskjellen deres (noe som gjøres som standard).

^ Samle språkkommandoer.

Assembler-kommandoer åpner for muligheten til å overføre kravene deres til datamaskinen, mekanismen for overføring av kontroll i programmet (løkker og hopp) for logiske sammenligninger og programorganisering. Imidlertid er programmeringsoppgaver sjelden så enkle. De fleste programmer inneholder en serie løkker der flere instruksjoner gjentas inntil et visst krav er nådd, og ulike kontroller for å bestemme hvilke av de flere handlingene som skal utføres. Noen kommandoer kan overføre kontroll ved å endre den normale sekvensen av trinn ved å direkte modifisere offsetverdien i kommandopekeren. Som nevnt tidligere er det forskjellige kommandoer for forskjellige prosessorer, men vi vil vurdere en rekke noen kommandoer for prosessorene 80186, 80286 og 80386.

For å beskrive tilstanden til flaggene etter å ha utført en bestemt kommando, vil vi bruke et utvalg fra tabellen som gjenspeiler strukturen til eflags flaggregister:

Den nederste raden i denne tabellen viser verdiene til flaggene etter at kommandoen er utført. I dette tilfellet brukes følgende notasjoner:

1 - etter at kommandoen er utført, settes flagget (lik 1);

0 - etter at kommandoen er utført, tilbakestilles flagget (lik 0);

r - verdien av flagget avhenger av resultatet av kommandoen;

Etter å ha utført kommandoen, er flagget udefinert;

mellomrom - etter å ha utført kommandoen, endres ikke flagget;

Følgende notasjon brukes til å representere operander i syntaksdiagrammer:

r8, r16, r32 - operand i et av registrene for størrelsesbyte, ord eller dobbeltord;

m8, m16, m32, m48 - operand i minnestørrelse av byte, ord, dobbeltord eller 48 biter;

i8, i16, i32 - umiddelbar operand av størrelse byte, ord eller dobbeltord;

a8, a16, a32 - relativ adresse (offset) i kodesegmentet.

Kommandoer (i alfabetisk rekkefølge):

*Disse kommandoene er beskrevet i detalj.

LEGG TIL
(Addisjon)

Addisjon

^ Kommandooversikt:

legg til destinasjon, kilde

Formål: tillegg av to kilde- og måloperander av byte-, ord- eller doble orddimensjoner.

Arbeidsalgoritme:

legg til kilde- og destinasjonsoperander;

skriv resultatet av tillegg til mottakeren;

sette flagg.

Status for flagg etter kommandoutførelse:

Applikasjon:
Add-kommandoen brukes til å legge til to heltallsoperander. Resultatet av tillegget plasseres på adressen til den første operanden. Hvis resultatet av tillegget går utover grensene til destinasjonsoperanden (et overløp oppstår), bør denne situasjonen tas i betraktning ved å analysere cf-flagget og deretter eventuelt bruke adc-kommandoen. La oss for eksempel legge til verdiene i register ax og minneområde ch. Når du legger til, bør du ta hensyn til muligheten for overløp.

Registrer pluss register eller minne:

|000000dw|modregr/rm|

Registrer AX (AL) pluss umiddelbar verdi:

|0000010w|--data--|data hvis w=1|

Register eller minne pluss umiddelbar verdi:

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

ANROP
(ANROP)

Kalle en prosedyre eller oppgave

^ Kommandooversikt:

Hensikt:

overføring av kontroll til en nær eller fjern prosedyre med lagring av adressen til returpunktet på stabelen;

oppgavebytte.

Arbeidsalgoritme:
bestemt av operandtypen:

Etiketten er nær - innholdet av eip / ip-kommandopekeren skyves på stabelen og en ny adresseverdi som tilsvarer etiketten lastes inn i samme register;

Far label - innholdet i eip/ip og cs kommandopekeren skyves på stabelen. Deretter lastes de nye adresseverdiene som tilsvarer det fjerneste merket inn i de samme registrene;

R16, 32 eller m16, 32 - definer et register eller en minnecelle som inneholder forskyvninger i det gjeldende instruksjonssegmentet, hvor kontroll overføres. Når kontrollen overføres, skyves innholdet i eip/ip-kommandopekeren på stabelen;

Minnepeker - definerer en minneplassering som inneholder en 4 eller 6 byte peker til prosedyren som kalles. Strukturen til en slik peker er 2+2 eller 2+4 byte. Tolkningen av en slik peker avhenger av driftsmodusen til mikroprosessoren:

^ Status for flagg etter kommandoutførelse (unntatt oppgavebryter):

kommandoutførelse påvirker ikke flagg

Når en oppgave byttes, endres verdiene til flaggene i henhold til informasjonen om eflags-registeret i TSS-statussegmentet til oppgaven det byttes til.
Applikasjon:
Anropskommandoen lar deg organisere en fleksibel og multivariat overføring av kontroll til en subrutine mens du opprettholder adressen til returpunktet.

Objektkode (fire formater):

Direkte adressering i et segment:

|11101000|disp-lav|dyp-høy|

Indirekte adressering i et segment:

|11111111|mod010r/m|

Indirekte adressering mellom segmenter:

|11111111|mod011r/m|

Direkte adressering mellom segmenter:

|10011010|offset-low|offset-high|seg-low|seg-high|

CMP
(sammenlign operander)

Operand sammenligning

^ Kommandooversikt:

cmp operand1, operand2

Formål: sammenligning av to operander.

Arbeidsalgoritme:

utføre subtraksjon (operand1-operand2);

avhengig av resultatet, sett flagg, ikke endre operand1 og operand2 (det vil si, ikke lagre resultatet).

Applikasjon:
Denne kommandoen brukes til å sammenligne to operander ved subtraksjon, mens operandene ikke endres. Flagg settes som et resultat av kommandoutførelse. cmp-instruksjonen brukes med de betingede hoppinstruksjonene og setbyte-byte-verdi-instruksjonen setcc.

Objektkode (tre formater):

Registrert eller registrert minne:

|001110dw|modreg/m|

Umiddelbar verdi med register AX (AL):

|0011110w|--data--|data hvis w=1|

Umiddelbar verdi med register eller minne:

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

DES
(Dekrementer operand med 1)

Operand reduseres med én

^ Kommandooversikt:

des operand

Formål: redusere verdien av operanden i minnet eller registeret med 1.

Arbeidsalgoritme:
instruksjonen trekker 1 fra operanden. Status for flagg etter kommandoutførelse:

Applikasjon:
Dec-kommandoen brukes til å redusere verdien av en byte, ord, dobbeltord i minnet eller register med én. Merk at kommandoen ikke påvirker cf-flagget.

Registrer: |01001reg|

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

DIV
(DIVide usignert)

Divisjon usignert

Kommandoskjema:

div skillevegg

Formål: å utføre en divisjonsoperasjon på to binære usignerte verdier.

^ Arbeidsalgoritme:
Kommandoen krever to operander - dividenden og divisoren. Utbyttet spesifiseres implisitt og størrelsen avhenger av størrelsen på divisoren, som er spesifisert i kommandoen:

hvis divisor er i byte, må utbyttet være plassert i register ax. Etter operasjonen plasseres kvotienten i al og resten i ah;

hvis divisor er et ord, så må utbyttet ligge i registerparet dx:ax, med den lave delen av utbyttet i ax. Etter operasjonen plasseres kvotienten i ax og resten i dx;

hvis divisor er et dobbeltord, så må utbyttet ligge i registerparet edx:eax, med den lave delen av utbyttet i eax. Etter operasjonen legges kvotienten i eax og resten i edx.

^ Status for flagg etter utførelse av kommando:

Applikasjon:
Kommandoen utfører en heltallsdeling av operandene, og returnerer resultatet av divisjonen som en kvotient og resten av divisjonen. Når du utfører en delingsoperasjon, kan det oppstå et unntak: 0 - divisjonsfeil. Denne situasjonen oppstår i ett av to tilfeller: divisoren er 0, eller kvotienten er for stor til å passe inn i eax/ax/al-registeret.

Objektkode:

|1111011w|mod110r/m|

INT
(Avbryte)

Ringer en avbruddsservicerutine

^ Kommandooversikt:

int interrupt_number

Formål: kall opp avbruddsservicerutinen med avbruddsnummeret spesifisert av instruksjonsoperanden.

^ Arbeidsalgoritme:

skyv eflags/flaggregisteret og returadressen på stabelen. Ved skriving av returadressen skrives først innholdet i cs segmentregisteret, deretter innholdet i eip/ip kommandopekeren;

tilbakestill if og tf flaggene til null;

overføre kontrollen til avbruddsbehandleren med det angitte nummeret. Kontrolloverføringsmekanismen avhenger av driftsmodusen til mikroprosessoren.

^ Status for flagg etter utførelse av kommando:

Applikasjon:
Som du kan se fra syntaksen, er det to former for denne kommandoen:

int 3 - har sin egen individuelle opcode 0cch og opptar en byte. Denne omstendigheten gjør det veldig praktisk å bruke i ulike programvaredebuggere for å angi bruddpunkter ved å erstatte den første byten i en instruksjon. Mikroprosessoren, som møter en kommando med opcode 0cch i rekkefølgen av kommandoer, kaller avbruddsbehandleren med vektornummer 3, som tjener til å kommunisere med programvarefeilsøkeren.

Den andre formen av instruksjonen er to byte lang, har en opkode på 0cdh, og lar deg starte et anrop til en avbruddstjenesterutine med et vektornummer i området 0-255. Funksjoner ved overføring av kontroll, som nevnt, avhenger av driftsmodusen til mikroprosessoren.

Objektkode (to formater):

Registrer: |01000reg|

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

JCC
JCXZ/JECXZ
(Hopp hvis tilstand)

(Hopp hvis CX=null/hopp hvis ECX=null)

Hopp hvis betingelsen er oppfylt

Hopp hvis CX/ECX er null

^ Kommandooversikt:

jcc-etikett
jcxz etikett
jecxz etikett

Formål: overgang innenfor gjeldende segment av kommandoer, avhengig av en viss tilstand.

^ Kommandoalgoritme (bortsett fra jcxz/jecxz):
Kontrollerer statusen til flaggene avhengig av op-koden (den gjenspeiler tilstanden som kontrolleres):

hvis betingelsen under test er sann, gå til cellen indikert av operanden;

hvis tilstanden som kontrolleres er usann, send deretter kontrollen til neste kommando.

jcxz/jecxz kommandoalgoritme:
Kontroller betingelsen om at innholdet i ecx/cx-registeret er lik null:

hvis den sjekkede tilstanden

Generell informasjon om forsamlingsspråk

Det symbolske assemblyspråket gjør det mulig å i stor grad eliminere manglene ved maskinspråkprogrammering.

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

Symbolske navn som introduseres ved programmering på assemblerspråk, gjenspeiler som regel programmets semantikk, og forkortelsen av kommandoer - deres hovedfunksjon. For eksempel: PARAM - parameter, TABELL - tabell, MASK - maske, ADD - addisjon, SUB - subtraksjon, etc. n. Slike navn huskes lett av programmereren.

For programmering i assemblerspråk er det nødvendig å ha komplekse verktøy enn for programmering på maskinspråk: du trenger datasystemer basert på mikrodatamaskiner eller PC-er med et sett periferiutstyr(alfanumerisk tastatur, tegnvisning, diskettstasjon og skriver), 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 tilsvarende mikroprosessoren, siden de tildeler et spesifikt symbolsk navn til hver mikroprosessorinstruksjon.

Monteringsspråk gir en betydelig økning i produktiviteten til programmerere sammenlignet med maskinspråk og beholder samtidig muligheten til å bruke alle de programvaretilgjengelige maskinvareressursene til mikroprosessoren. Dette gjør dyktige programmerere i stand til å skrive programmer som kjører i mer enn en kort tid og opptar mindre minne enn programmer skrevet på et høyt nivå språk.

I denne forbindelse er nesten alle I / O-enhetskontrollprogrammer (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:

mnemonisk (symbolsk navn) for hver kommando av maskinspråket til mikroprosessoren;

standardformat for linjer i et program beskrevet i assembler;

format for å spesifisere ulike måter adresserings- og kommandoalternativer;

format for å spesifisere tegnkonstanter og konstanter av heltallstype i forskjellige tallsystemer;

pseudo-kommandoer som kontrollerer prosessen med montering (oversettelse) av programmet.

På assemblerspråk skrives programmet linje for linje, det vil si at det tildeles en linje for hver instruksjon.

For mikrodatamaskiner bygget på basis av de vanligste typene mikroprosessorer kan det være flere varianter av assemblerspråk, men man har vanligvis én praktisk fordeling - dette er det såkalte standard assemblyspråket

Programmering på nivå med maskininstruksjoner er minimumsnivået der programmering er mulig. Systemet med maskininstruksjoner må være tilstrekkelig til å implementere de nødvendige handlingene ved å gi instruksjoner til maskinvaren.

Hver maskininstruksjon består av to deler:

drift - bestemme "hva du skal gjøre";

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

Maskininstruksjonen til mikroprosessoren, skrevet på assemblerspråk, er en enkelt linje med følgende syntaktiske form:

merke kommando/direktiv operand(er) ;kommentarer

I dette tilfellet er et obligatorisk felt på en linje 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 i kommandoer eller direktiver.

Direkte adressering: Den effektive adressen bestemmes direkte av maskininstruksjonsoffsetfeltet, som kan være 8, 16 eller 32 biter i størrelse.

mov eax, sum; eax = sum

Samleren erstatter sum med den tilsvarende adressen lagret i datasegmentet (som standard adressert av register ds) og plasserer verdien som er lagret på adressesum i register eax.

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

Indirekte grunnleggende (register) adressering;

Indirekte grunnleggende (register) adressering med offset;

· indirekte indeksadressering;

· indirekte baseindeksadressering.

Indirekte grunnleggende (register) adressering. Med denne adresseringen kan den effektive adressen til operanden være i alle de generelle registrene, bortsett fra sp / esp og bp / ebp (disse er spesifikke registre for å jobbe med et stabelsegment). Syntaktisk i en instruksjon uttrykkes denne adresseringsmodusen ved å omslutte registernavnet i hakeparenteser.

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

Emne 2.5 Grunnleggende om prosessorprogrammering

Ettersom lengden på programmet øker, blir det vanskeligere å huske kodene for ulike operasjoner. Mnemonikk gir litt hjelp i denne forbindelse.

Det symbolske instruksjonskodingsspråket kalles montør.

forsamlingsspråk er et språk der hver setning tilsvarer nøyaktig én maskininstruksjon.

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 inkludere bibliotekprogrammer og generere sekvenser av symbolske instruksjoner ved å spesifisere spesifikke parametere i mikroinstruksjoner. Dette programmet vanligvis plassert i ROM eller lagt inn i RAM fra et eksternt medium.

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. Assemblyspråkprogrammereren har tilgang til alle objekter og kommandoer som finnes på målmaskinen.

En forståelse av det grunnleggende om programmering i maskinorienterte språk er nyttig for:



Bedre forståelse av PC-arkitektur og bedre 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 disse programmene inn i DEBUG-programfeilsøkeren og dekompilere visningen deres i assemblerspråk );

Sammenstilling av programmer for å løse de mest kritiske oppgavene (et program kompilert i et maskinorientert språk er vanligvis mer effektivt - kortere og raskere med 30-60 prosent enn programmer oppnådd som et resultat av oversettelse fra høynivåspråk)

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

Et assembly-språkprogram kan bare kjøres på datamaskiner fra samme familie, 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. Skille:

Binære tall som slutter med bokstaven B;

Desimaltall som slutter på D;

Heksadesimale tall som slutter med bokstaven N.

RAM, registre, datarepresentasjon

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 assemblerspråkprogram bruker egenskapene til en bestemt maskin (mer presist, MP) mer rasjonelt enn et program på et høynivåspråk (som er enklere for en programmerer enn assembler). Vi vil vurdere de grunnleggende prinsippene for programmering i maskinorienterte språk ved å bruke monteringsspråket for MP KR580VM80 som et eksempel. For programmering i språket brukes en generell teknikk. Spesifikke teknikker for opptak av programmer er relatert til arkitekturen og kommandosystemfunksjonene til mål-MP.

Programvaremodell mikroprosessorsystem basert på MP KR580VM80

Programmodellen til MPS i samsvar med figur 1

MP-porter minne

S Z AC P C

Bilde 1

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

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

B, C, D, E, H, L– 8-bits registre for generelle formål (RON). Indre minne MP. Designet for å lagre den behandlede informasjonen, samt resultatene av operasjonen. Ved behandling av 16-bits ord fra registrene dannes parene BC, DE, HL, og dobbeltregisteret kalles første bokstav - B, D, H. I registerparet er det første registeret det høyeste. H, L-registrene, som brukes både for å lagre data og for å lagre 16-bits adresser til RAM-celler, har en spesiell egenskap.

FL– flaggregister (funksjonsregister) Et 8-bits register som lagrer fem funksjoner av resultatet ved å utføre aritmetiske og logiske operasjoner i MP. 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, settes til 1 hvis antall enheter i bitene til resultatet er partall.

AC-biten er en ekstra bære, designet for å lagre bæreverdien fra den nedre tetrad av resultatet.

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

S (tegn)-biten settes til 1 hvis resultatet er negativt og til 0 hvis resultatet er positivt.

SP-- stabelpekeren, et 16-bits register, er utformet for å lagre adressen til minnestedet der den siste byten som ble skrevet inn i stabelen ble skrevet.

RS– programteller (programteller), 16-bits register, designet for å lagre adressen til neste kjørbare instruksjon. Innholdet i programtelleren økes automatisk med 1 umiddelbart etter at neste instruksjonsbyte er hentet.

I det opprinnelige minneområdet til adressen er 0000H - 07FF plassert kontrollprogram og demoprogrammer. Dette er ROM-området.

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

0В00 - 0ВВ0 - adresseområde for dataregistrering. (RAM).

0BB0 er startadressen til stabelen. (RAM).

Stack er et spesielt organisert område med RAM designet for midlertidig lagring av data eller adresser. Det siste tallet som er skjøvet inn på stabelen, er det første tallet som hoppes av stabelen. Stabelpekeren lagrer adressen til det siste stabelstedet hvor informasjon er lagret. Når en subrutine kalles opp, lagres returadressen til hovedprogrammet automatisk på stabelen. Som regel, i begynnelsen av hver subrutine, lagres innholdet i alle registre som er involvert i dens utførelse på stabelen, og på slutten av subrutinen blir de gjenopprettet fra stabelen.

Assembly Language Data Format og Kommandostruktur

Minne MP KR580VM80 er en rekke 8-bits ord kalt bytes. Hver byte har sin egen 16-bits adresse som bestemmer dens posisjon i sekvensen av minneceller. MP kan adressere 65536 byte 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.

Kommandoen er preget av formatet, dvs. 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. Multi-byte-instruksjoner må plasseres i nærliggende PL-er. Formatet på kommandoen avhenger av spesifikasjonene til operasjonen som utføres.

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

Den definerer formatet til kommandoen og handlingene som må utføres av MP på dataene under utførelsen, og metoden for adressering, og kan også inneholde informasjon om plasseringen av dataene.

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

Single-byte kommandoformat i henhold til figur 2

Figur 4

I monteringsspråkinstruksjoner har opkoden en forkortet form for å skrive engelske ord - en mnemonisk notasjon. Mnemonics (fra det greske mnemonic - kunsten å huske) gjør det lettere å huske kommandoer i henhold til 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 i de interne registrene til MP (den mest praktiske og raskt alternativ). De kan være plassert i systemminnet (det vanligste alternativet). Til slutt kan de være 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 er det følgende adresseringsmetoder:

Umiddelbar;

Registrere;

indirekte;

Stable.

Umiddelbar adressering forutsetter at operanden (input) er i minnet umiddelbart etter instruksjonskoden. Operaanden er vanligvis en konstant som må sendes et sted, legges til noe osv. data er inneholdt i andre eller andre og tredje byte av kommandoen, med lav databyte i andre kommandobyte, og høy databyte 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 MP-registeret. Brukes i enkeltbyte-kommandoer

Indirekte (implisitt) adressering forutsetter at det interne registeret til MP ikke er operanden i seg selv, men dens adresse i minnet.

Stable adressering forutsetter at kommandoen ikke inneholder en adresse. Adressering til minneceller etter 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, som elementære aritmetiske og logiske operasjoner, dataoverføring, sammenligning av to verdier osv. Antallet kommandoer til MP KR580VM80 er 78 (inkludert modifikasjoner 244).

Det er følgende grupper av kommandoer:

Data overføring;

Aritmetikk;

Hjernetrim;

Hoppkommandoer;

Kommandoer for input-output, kontroll og arbeid med stabelen.


Symboler og forkortelser som brukes til å beskrive kommandoer og skrive programmer

Symbol Reduksjon
ADDR 16 bit adresse
DATA 8-bits data
DATA 16 16 bit data
HAVN 8-biters I/O-adresse (I/O-enheter)
BYTE 2 Andre kommandobyte
BYTE 3 Tredje kommandobyte
R, Rl, R2 Ett av registrene: A, B, C, D, E, H, L
RP Ett av registerparene: B - setter et flypar; D - setter et par DE; H - spesifiserer et par HL
RH Første register av paret
RL Andre register av paret
Λ Boolsk multiplikasjon
V Boolsk tillegg
Modulo to tillegg
M Minnecelle hvis adresse spesifiserer innholdet i HL-registerparet, dvs. M = (HL)

Introduksjon.

Språket som det originale programmet er skrevet på kalles input språk, og språket det er oversatt til for utførelse av prosessoren - helg Språk. Prosessen med å konvertere et inndataspråk til et 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 oversettelser: sammenstilling og tolkning.

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

tolkninger hver linje med kildeprogramtekst blir analysert (tolket) og kommandoen som er spesifisert i den, utføres umiddelbart. Implementeringen av denne metoden ligger hos tolkeprogram. Tolking tar lang tid. For å øke effektiviteten, i stedet for å behandle hver linje, konverterer tolken foreløpig alle kommando 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 (

) mnemonic 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 de symbolske navnene som assembleren oversetter til binære koder;

hver setning samsvarer én maskinkommando(kode), det vil si at det er en en-til-en-korrespondanse mellom maskininstruksjoner og operatører i et assemblerprogram;

● språk gir tilgang til alle objekter og lag. Språk på høyt nivå har ikke denne muligheten. For eksempel lar assemblerspråk deg sjekke en flaggregisterbit og et høynivåspråk (for eksempel

) har ikke denne muligheten. Merk at språk for systemprogrammering (for eksempel C) ofte har en mellomposisjon. Når det gjelder tilgjengelighet, er de nærmere assemblerspråk, men de 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 språk på høyt nivå, tar det mye tid å skrive og feilsøke et assembly-språkprogram. Til tross for dette har forsamlingsspråk blitt bred bruk på grunn av følgende forhold:

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

● noen prosedyrer krever full tilgang til maskinvare, noe som vanligvis ikke er mulig i et språk på høyt nivå. Denne saken inkluderer avbrudds- og avbruddsbehandlere i operativsystemer, samt enhetskontrollere i innebygde systemer som opererer i sanntid.

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. En etikett er et symbolsk navn, eller identifikator, adresser hukommelse. Det er nødvendig for å kunne:

● foreta en betinget eller ubetinget overgang til kommandoen;

● få tilgang til stedet der dataene er lagret.

Slike uttalelser er merket. For å angi et navn, brukes (store) bokstaver i det engelske alfabetet og tall. Navnet må begynne med en bokstav og slutte med kolon. Kolonetiketten kan skrives på en egen linje, og opkoden kan skrives på neste linje i kolonne 2, noe som forenkler arbeidet til kompilatoren. Fraværet av et kolon gjør det umulig å skille mellom en etikett og en opkode hvis de er på separate linjer.

I noen versjoner av assembly-språket plasseres kolon bare etter instruksjonsetiketter, ikke etter dataetiketter, og etikettlengden kan begrenses til 6 eller 8 tegn.

Etikettfeltet skal ikke inneholde de samme navnene, siden etiketten er knyttet til adressene til kommandoer. Hvis det under programkjøring ikke er nødvendig å kalle en kommando eller data fra minnet, forblir etikettfeltet tomt.

Transaksjonskodefelt.

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

mnemonic valgt for å laste register fra minnet

), og for å lagre innholdet i registeret i minnet - mnemonikken

). På assemblerspråk

du kan bruke samme navn for begge operasjonene

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

Registermnemonikk avhenger også av assemblerversjonen (tabell 5.2.1).

Operand felt.

Her ligger Tilleggsinformasjon nødvendig for å utføre operasjonen. I feltet operander for hoppinstruksjoner angis adressen der du ønsker å hoppe, samt adresser og registre som er operander for maskininstruksen. Som et eksempel, her er operandene som kan brukes for 8-bits prosessorer

● numeriske data,

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

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

kan ikke tas opp). Hvis det første sifferet i det heksadesimale tallet 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 10V - registeradresse

i binært system);

● identifikatorer,

for registrerte flypar,

De første bokstavene B

H; for et par akkumulator og funksjonsregister -

; for programtelleren -

; for stabelpeker -

● etiketter som indikerer adresser til operander eller neste instruksjoner i betinget

(når 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 bygget ved å koble dataene diskutert ovenfor ved å bruke aritmetiske og logiske operatorer. Merk at måten dataplass reserveres på avhenger av språkversjonen. Montering språkutviklere for

Definer ord), og senere introdusert Alternativt alternativ.

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

I språkversjon

brukt

definere en konstant).

Prosessorer behandler operander av forskjellig lengde. For å definere det, har assemblerutviklere tatt 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 opcode: suffiks

For type

; suffiks ".B" for type

for operander av forskjellig lengde, brukes forskjellige opkoder, for eksempel for å laste en byte, et halvord (

) og ord i 64-bits register bruker opkoder

hhv.

Kommentarfelt.

Dette feltet gir forklaringer om handlingene til programmet. Kommentarer påvirker ikke driften av programmet og er beregnet på en person. 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 tegn og brukes til å forklare og dokumentere programmer. Startkarakteren til en kommentar kan være:

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

Utropstegn(!) på språk for

Hver separat linje som er reservert for en kommentar, innledes med et starttegn.

Pseudo-kommandoer (direktiver).

På assemblerspråk kan to hovedtyper av kommandoer skilles:

grunnleggende instruksjoner som tilsvarer maskinkoden til prosessoren. Disse kommandoene utfører all behandlingen som tilbys av programmet;

pseudo-kommandoer eller direktiver, designet for å tjene prosessen med å oversette programmet til språket for kodekombinasjoner. Som et eksempel, i Tabell. 5.2.2 viser noen pseudo-kommandoer fra as-assembler

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 ønsket rekkefølge av 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. En slik utgang har sine ulemper: hver gang du må utføre en spesiell prosedyrekallinstruksjon og en returinstruksjon, som med en kort og ofte brukt sekvens kan redusere hastigheten til programmet betraktelig.

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

En makro, eller makroinstruksjon, 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.

En makro har følgende struktur:

Liste over uttrykk; makrodefinisjon

Det er tre deler til makrodefinisjonsstrukturen ovenfor:

● topptekst

makro som inneholder navnet

Pseudo-kommando

og et sett med parametere;

● prikkete kropp makro;

● team

eksamen

makrodefinisjoner.

Et makroparametersett inneholder en liste over alle parametere gitt i operandfeltet for den valgte instruksjonsgruppen. Hvis disse parameterne er gitt tidligere i programmet, kan de utelates i makrodefinisjonsoverskriften.

For remontering av den valgte gruppen av instruksjoner brukes en samtale som består av navnet

makro og parameterliste med andre verdier.

Når assembleren møter en makrodefinisjon under kompilering, lagrer den den i makrodefinisjonstabellen. Med 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(makro call), og dens erstatning av kroppen til makroen - makro ekspansjon.

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

Makroutvidelse skjer under monteringsprosessen, ikke under programkjøring. Måter å manipulere strenger av tegn er tildelt makroverktøy.

Monteringsprosessen er utført i to omganger:

● Ved den første passeringen beholdes alle makrodefinisjoner og makroanrop utvides. I dette tilfellet blir kildeprogrammet lest og konvertert til et program der alle makrodefinisjoner er fjernet, og hvert makrokall erstattes av en makrokropp;

● Den andre passeringen behandler det mottatte programmet uten makroer.

Makroer med parametere.

For å jobbe med repeterende 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 viser to lignende sekvenser av kommandoer, som er forskjellige ved at den første av dem bytter P og

Og den andre

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

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

) fra program nr. 1. I et makroanrop

program 2 er merket: P,

Den første faktiske parameteren,

Den andre faktiske parameteren.

Program 1

Program 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Utvidede muligheter.

Vurder noen avanserte funksjoner i språket

Hvis en makro som inneholder en betinget greninstruksjon og en etikett å hoppe til kalles to eller flere ganger, vil etiketten dupliseres (etikettdupliseringsproblem), noe som vil forårsake en feil. Derfor tildeles hvert anrop (av programmereren) en egen etikett som en parameter. På språket

etiketten er erklært lokal (

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

lar deg definere makroer inne i andre makroer. Denne avanserte funksjonen er veldig nyttig når den kombineres med betinget programkobling. Ta i betraktning

IF WORDSIZE GT 16 M2 MAKRO

Makro M2 kan defineres i begge deler av setningen

Definisjonen avhenger imidlertid av om programmet settes sammen på en 16-bits eller 32-bits prosessor. 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 uendelig 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 makroer i assembler.

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

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 felles tabell der det, sammen med makronavn, er alle maskinkommandoer og direktiver.

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

nytt bordelement med navnet på makroen, antall parametere og en peker til en annen makrodefinisjonstabell der makrokroppen 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 sløyfen er markert spesiell karakter.

Intern representasjon av en makro

fra eksemplet 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.

Makroanropsutvidelse.

Hver gang en makrodefinisjon påtreffes under montering, lagres den i makrotabellen. Når en makro kalles, suspenderer assembleren midlertidig lesing av inngangsdata fra inndataenheten og begynner å lese den lagrede makrokroppen. De formelle parameterne som er hentet ut fra makrokroppen, erstattes av de faktiske parameterne og leveres av samtalen. Et ampersand & foran parameterne lar assembleren gjenkjenne dem.

Selv om det finnes mange versjoner av assembler, har monteringsprosesser fellestrekk og ligner på mange måter. Arbeidet til en to-pass montør vurderes nedenfor.

To pass assembler.

Programmet består av en rekke operatører. Derfor ser det ut til at følgende handlingssekvens kan brukes under montering:

● oversette det til maskinspråk;

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

● gjenta prosedyrene ovenfor til hele programmet er sendt.

Denne tilnærmingen er imidlertid ikke effektiv. Et eksempel er det såkalte problemet ledende lenke. Hvis den første setningen er et hopp til P-setningen helt på slutten av programmet, kan ikke assembleren oversette den. Han må først bestemme adressen til operatøren P, og for dette er det nødvendig å lese hele programmet. Hver fullstendig lesing av det originale programmet kalles passasje. La oss vise hvordan vi kan løse foroverreferanseproblemet ved å bruke to passeringer:

på første pass 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 den andre passeringen gjennom det originale programmet krever ekstra I/O-tid;

● ved første pass, konvertere programmer inn i en mellomform og lagre den i en tabell, og den andre passeringen utføres ikke i henhold til det opprinnelige programmet, men i henhold til tabellen. Denne monteringsmetoden sparer tid, siden ingen I/O-operasjoner utføres på den andre passasjen.

Første pass.

Hensikten med første pass- bygg et symbolbord. Som nevnt ovenfor, er et annet mål med den første passeringen å lagre alle makrodefinisjoner og utvide samtalene etter hvert som de vises. Derfor skjer både karakterdefinisjon og makroutvidelse i samme pass. Symbolet kan være enten merkelapp, eller betydning, som er tildelt et spesifikt navn ved å bruke -you-direktivet:

;Verdi - bufferstørrelse

Ved å gi betydning til de symbolske navnene i instruksjonsetikettfeltet, setter assembleren i hovedsak adressene som hver instruksjon vil ha under programkjøring. For å gjøre dette, sparer 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 kommando behandlet med lengden på den kommandoen. Som et eksempel, i Tabell. 5.2.3 viser et fragment av programmet som indikerer lengden på kommandoer og tellerverdier. Tabeller genereres under den første passeringen symbolnavn, direktiver Og operasjonskoder, og om nødvendig bokstavelig bord. En bokstavelig er en konstant som samleren automatisk reserverer minne for. Vi bemerker med en gang at moderne prosessorer inneholder instruksjoner med direkte adresser, så samlerne deres støtter ikke bokstaver.

Symboltabell

inneholder ett element for hvert navn (tabell 5.2.4). Hvert element i symboltabellen 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;

● minneremapping-biter (som indikerer om verdien av 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.

Tabell over direktiver.

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

Driftskodetabell.

For hver op-kode har tabellen separate kolonner: op-kodebetegnelse, operand 1, operand 2, heksadesimal verdi av op-koden, instruksjonslengde og instruksjonstype (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.

Hensikten med det andre passet- lage et objektprogram og skrive ut, om nødvendig, en monteringsprotokoll; ut informasjon som trengs av 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 etter hverandre. Den opprinnelige operatoren og utdataene avledet fra den i heksadesimal gjenstand koden kan skrives ut eller bufres for senere utskrift. Etter tilbakestilling av kommandoadressetelleren, kalles kommandoen neste uttalelse.

Det originale programmet kan inneholde feil, for eksempel:

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

● Op-koden er representert med et ugyldig navn (på grunn av en skrivefeil), ikke utstyrt med 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 en setning med en feil blir funnet, viser assembleren en feilmelding på skjermen og prøver å fortsette monteringsprosessen.

Artikler dedikert til forsamlingsspråket.




Topp