Instruksjonssett

Et instruksjonssett, instruksjonssett, instruksjonssett eller ISA er en spesifikasjon som beskriver instruksjonene som en sentral prosesseringsenhet kan forstå og utføre, eller settet med instruksjoner for alle kommandoene implementert av en bestemt utforming av en CPU. Begrepet beskriver aspekter ved prosessoren som generelt er synlig for en programmerer, inkludert innfødte datatyper, instruksjoner, registre , minnearkitektur og avbrudd , blant andre aspekter.

Det er hovedsakelig tre typer: CISC ( Complex Instruction Set Computer ), RISC ( Reduced Instruction Set Computer ) og SISC ( Simple Instruction Set Computing ).

Instruksjonssettarkitektur (ISA) brukes noen ganger for å skille dette settet med funksjoner fra mikroarkitektur , som er elementene og teknikkene som brukes for å implementere instruksjonssettet . Blant disse elementene er mikroinstruksjoner og hurtigbuffersystemer .

Prosessorer med forskjellig intern design kan dele et sett med instruksjoner; for eksempel implementerer Intel Pentium og AMD Athlon nesten identiske versjoner av x86 -instruksjonssettet , selv om de har forskjellige oppsett.

Maskinspråk

Maskinspråk er bygget fra diskrete tilstander eller instruksjoner. I prosesseringsarkitekturen kan en gitt instruksjon meget godt spesifisere:

Mer komplekse operasjoner bygges fra disse, som (i en Von Neumann-maskin) utføres sekvensielt, eller i henhold til flytkontroll.

Mange eller få av de tilgjengelige operasjonene inkludert i de fleste sett er:

Noen datamaskiner inkluderer "komplekse" instruksjoner. Slike instruksjoner kan ta opp mange instruksjoner på andre datamaskiner. Disse er preget av instruksjoner som krever flere trinn, for eksempel kontroll av flere funksjonelle enheter.

Noen eksempler er:

En kompleks instruksjonstype som har blitt spesielt populær nylig er SIMD ( Single Instruction, Multiple Data ), en operasjon som utfører samme aritmetiske operasjon på flere datastykker samtidig. SIMD har muligheten til å manipulere store vektorer og matriser på minimal tid. SIMD-instruksjoner tillater enkel parallellisering av algoritmer som vanligvis er involvert i lyd-, bilde- og videobehandling. Ulike implementeringer av SIMD har blitt brakt på markedet under handelsnavn som MMX, 3DNow! og AltiVec.

Å designe instruksjonssystemer er svært komplekst. I begynnelsen var det to typer systemer, en måte å klassifisere dem på er etter arkitektonisk kompleksitet. Den første typen var CISC ( Complex Instruction Set Computer ) som hadde mange forskjellige instruksjoner. På 1970 -tallet gjorde IBM undersøkelser der de fant ut at mange instruksjoner i systemet kunne elimineres. Resultatet var den andre typen, Reduced Instruction Set Computer (RISC ), en arkitektur som bruker et mindre sett med instruksjoner. Et enklere instruksjonssett kan tilby potensial for høyere hastigheter, redusert prosessorstørrelse og lavere strømforbruk. Imidlertid kan et mer komplekst sett optimere vanlige operasjoner, forbedre minne/buffereffektivitet eller forenkle programmering.

Implementering av instruksjonssett

Ethvert sett med instruksjoner kan implementeres på forskjellige måter. Alle måter å implementere et sett med instruksjoner gir den samme programmeringsmodellen, og alle kan kjøre de samme binære kjørbare filene . De ulike måtene å implementere et instruksjonssett på gir ulike avveininger mellom kostnad, ytelse, strømforbruk, størrelse og så videre.

Ved utforming av mikroarkitekturer brukte ingeniører "hardt-tilkoblede" elektroniske kretsblokker (ofte designet separat) for eksempel multipleksere , tellere, registre, ALUer og så videre. En eller annen type registeroverføringsspråk brukes ofte for å beskrive kodingen og sekvenseringen av hver ISA-instruksjon ved å bruke denne fysiske mikroarkitekturen.

Det er også noen nyere CPU-design som kompilerer instruksjonssettet til en skrivbar RAM eller FLASH inne i CPUen (for eksempel Recursiv-prosessoren og Imsys Cjip), eller FPGA (rekonfigurerbar databehandling). Western Digital MCP-1600 er et gammelt eksempel, som bruker en dedikert ROM, atskilt fra mikrokoden.

ISA kan også emuleres i programvare av en tolk. Naturligvis, på grunn av tolkningen av "overhead", er det tregere enn å kjøre programmer direkte på den emulerte maskinvaren. I dag er det praktisk for leverandører av nye ISA-er eller mikroarkitekturer å gjøre emulatorer av programvaren tilgjengelig for programvareutviklere før maskinvareimplementeringen er klar.

Implementeringsdetaljer har sterk innflytelse på de bestemte instruksjonene som er valgt for instruksjonssettet. For eksempel tillater mange implementeringer av pipeline-instruksjonen bare én last eller lagring per instruksjon, noe som fører til load-store (RISC)-arkitekturen. For et annet eksempel førte noen måter å implementere "pipline"-instruksjonen til en forsinkelsesluke.

Etterspørselen etter høyhastighets digital signalbehandling har presset i motsatt retning, og tvinger instruksjonsimplementering på spesielle måter. For å utføre digitale filtre er for eksempel ganske utilstrekkelig, MAC-instruksjonen i en typisk digital signalprosessor (DSP) må implementeres ved å bruke en Harvard-arkitektur som kan hente én instruksjon og to dataord samtidig, og krever en enkelt syklus.

Design

Kodetetthet

På eldre datamaskiner var programminne dyrt, så det var ofte sentralt å minimere størrelsen på et program for å sikre at det passer i begrenset minne. Dermed var den kombinerte størrelsen på alle instruksjoner som trengs for å utføre en bestemt oppgave, kodetetthet, en viktig egenskap ved ethvert instruksjonssystem. Datamaskiner med høy kodetetthet hadde også ofte komplekse instruksjoner for prosedyreinndata, parameteriserte returer, looper, etc. Imidlertid kombinerer "CISC-instruksjoner" ganske enkelt en grunnleggende ALU-operasjon, for eksempel "legg til", med tilgang til en eller flere operander i minnet (ved å bruke adressemoduser som direkte, indirekte, indeks). Enkelte arkitekturer kan tillate to eller tre operander (inkludert resultatet) direkte i minnet eller kan tillate funksjoner som automatisk pekerøkning.

RISC, var de første implementerte i dybden i perioden med rask vekst av delsystemminner, koden reduseres for å forenkle applikasjonskretsen og derved prøve å øke ytelsen gjennom høyere klokkefrekvenser og bruk av flere registre. RISC-instruksjoner utfører vanligvis bare én operasjon, for eksempel et "legg til" av registre eller en "last" av en minneplassering i et register, og bruker også typisk en fast instruksjonslengde, mens et typisk CISC-instruksjonssett har mange instruksjoner. denne faste lengden. Fixed-length-setninger er mindre tungvinte å håndtere enn variabel-bredde-setninger, av flere grunner (for eksempel: ikke å måtte sjekke om en setning spenner over begge sider av en hurtigbufferlinje, eller den virtuelle minnegrensen på siden ), og dermed noe lettere å optimalisere for hastighet. Men fordi RISC-datamaskiner vanligvis krever mer og mer for å implementere instruksjonene som utfører en gitt oppgave, gjør de mindre optimal bruk av båndbredde og hurtigbufferminne.

Minimal Instruction Set Computers (MISC) er en form for stablet maskin, der det er få separate instruksjoner (16-64), slik at flere instruksjoner kan passe inn i et enkelt maskinord. Disse typene kjerner krever ofte lite silisium å implementere, slik at de lett kan realiseres i en FPGA eller i en flerkjerneform. Kodetetthet er lik RISC; den økte instruksjonstettheten oppveies ved å kreve flere av de primitive instruksjonene for å utføre en oppgave.

Operandnummer

Instruksjonssettet kan klassifiseres etter det maksimale antallet operander som er spesifisert i instruksjonene (i eksemplene som følger refererer a, b og c til minneceller, mens reg1 og så videre refererer til maskinregistre).

0-operand, også kalt stabelmaskin: alle aritmetiske operasjoner utføres på toppen av en eller to stabelposisjoner, push og pop er instruksjonene som brukes for å få tilgang til minnet: push a, push b, add, pop c.

1-operand (én-adressemaskiner), også kalt akkumulatormaskiner, inkludert i de fleste tidlige datamaskiner og mange små mikrokontrollere: de fleste instruksjonene spesifiserer en eksplisitt operand til høyre (et register, en minneplassering eller en konstant) og en operand til til venstre: last a, legg til b, lagre c.

2-opererende, de fleste CISC- og RISC-maskiner faller inn i denne kategorien:
CISC – last a, reg1, legg til reg1, b; lagre reg1, c
RISC – laster som krever eksplisitt minne, instruksjonene vil være: last a,reg1; last b,reg2; legg til reg1,reg2; lagre reg2,c

3-operand, tillater bedre gjenbruk av data: CISC - enten en enkelt instruksjon: legg til a, b, c eller mer generelt: flytt a,reg1; legg til reg1,b,c da de fleste maskiner er begrenset til to minneoperander. RISC - På grunn av det store antallet biter som kreves for å kode de tre registrene, er denne ordningen vanligvis ikke tilgjengelig på RISC-prosessorer med små 16-biters instruksjoner: last a,reg1; last b,reg2; legg til reg1+reg2->reg3; lagre reg3,c.

Flere operander, noen CISC-maskiner tillater en rekke adresseringsmoduser som tillater mer enn 3 operander (registre eller minnetilgang), for eksempel VAX "POLY", polynomevalueringsinstruksjonen.

Ønskelige egenskaper

Egenskapene som et sett med instruksjoner er ment å ha er fire, hovedsakelig:

Det kan bekreftes at for at et sett med instruksjoner skal være komplett, er det bare fire instruksjoner som trengs:

RISC-arkitekturer er basert på denne ideen, men med dette settet kan ikke effektiviteten til instruksjonssettet oppnås, så i praksis er settet vanligvis bredere for å oppnå bedre ytelse, både i bruk av ressurser og i tidsforbruk.

Instruksjonstyper og eksempler

Dataoverføring

De kopierer data fra en kilde til en destinasjon, uten å endre kilden og vanligvis uten å påvirke flaggene eller tilstandsindikatorene. De kan overføre ord, brøkdeler av ord (byte, et halvt ord), eller hele blokker med n byte eller ord.

Disse operasjonene kan være:

Hyppigste mnemonikk

Aritmetiske instruksjoner

De utføres av ALU og endrer vanligvis flaggene eller tilstandsindikatorene.

Hyppigste mnemonikk

De kan ha instruksjoner for å håndtere BCD-tall og inkludere flyttalloperasjoner, som identifiseres med en 'f' foran mnemonisk navn, for eksempel: fabsolute

Sammenligningsinstruksjoner

De går vanligvis foran en betinget grenutsagn og endrer flaggene . Tro ikke at instruksjonene for betinget hopp er avhengig av dette repertoaret, siden det eneste det betingede hoppet gjør er å konsultere flaggene og hoppe hvis det går foran, men det er ikke avhengig av noen sammenligningsinstruksjon. (faktisk kan enhver aritmetisk operasjon utført før et betinget hopp få den til å "hoppe").

Hyppigste mnemonikk

Logiske instruksjoner

De utfører "bitvise" boolske operasjoner mellom to operander. Som aritmetikk endrer også flagg .

Hyppigste mnemonikk

Rullinstruksjoner

De kan være aritmetiske eller logiske og kan inkludere rotasjoner eller ikke. De kan være fra venstre til høyre.

Hyppigste mnemonikk

Bitinstruksjoner

De tester en bit av operanden og verdien reflekteres i nullflagget. De kan sette litt til 0 eller utfylle den.

Hyppigste mnemonikk

Kontrollinstruksjoner

De tillater å endre den normale sekvensen for utførelse av et program, det kan gjøres ved relativ eller absolutt betinget hopp.

De er klassifisert i fire grupper:

  1. ubetinget hopp
  2. betinget hopp
  3. ringe til subrutiner
  4. håndtering av avbrudd
Hopp

De kan være betingede eller ubetingede, de er vanligvis spesifisert som hopp eller gren , og i tilfelle av betingede kalles de vanligvis jcond eller bcond , der cond er en eller flere bokstaver som indikerer betingelsen som må være oppfylt for at hoppet skal skje .

Betingelsesløs

Hopp uten å sjekke noen forhold.

Hyppigste mnemonikk: hopp eller gren . Betinget

Hopp hvis betingelsen er sann.

Hyppigste mnemonikk: jcond eller bcond . Subrutineanrop

Påkaller utførelse av tidligere definerte funksjoner.

Hyppigste mnemonikk: ring ( ring) og retur (retur). Avbruddsbehandling

De brukes til å kalle avbruddsrutiner og dette kan gjøres i maskinvare eller programvare. Den trenger en setning som ligner på å gå tilbake for å gå tilbake til forrige kontekst, men tilbakestille maskinens tilstand, for ikke å påvirke applikasjonen som ble avbrutt ( iret ).

Instruksjoner for inn- og utdata

De er overføringsinstruksjoner bortsett fra at opprinnelsen/destinasjonen til nevnte flyt er en port til en inngangs- og utgangsenhet. Disse instruksjonene kan gis av to alternativer:

  1. I/O "tilordnet" i minnet : periferiutstyret har tildelt adresser fra MP så ingen spesielle instruksjoner er nødvendig, og operasjonene utføres med de som allerede er sett, for eksempel: last inn , lagre og flytt .
  2. Uavhengig I/O : De trenger spesielle instruksjoner for å fortelle prosessoren at vi refererer til I/O-adressekartet, siden dette kartet og minnekartet er usammenhengende.
Hyppigste mnemonikk
  • input eller read : lar deg lese informasjon fra en port og overføre den til hovedminnet.
  • output or write : Lar informasjon skrives til en port på en enhet.
  • test i/o : Les kontrollinformasjon fra en perifer enhet.
  • kontroll i/o : sender kontrollinformasjon til en perifer enhet.

Kontroll og diverse instruksjoner

Hyppigste mnemonikk:

  • stopp : Stopper programkjøringen til et avbrudd starter et annet program.
  • wait : den brukes til å stoppe kjøringen av et program til en bestemt hendelse som ikke er en avbrudd oppstår (en annen tilstand utenfor det første programmet).
  • nop : utfører ingen operasjon, den brukes til å fylle hull i et program eller ventetid.
  • aktivere : Aktiver avbrudd.
  • deaktiver : deaktiver avbrudd.
  • test og sett : det brukes til implementering av gjensidig utelukkelse, det vil si at en prosessor ikke kan få tilgang til en viss ressurs som brukes av en annen prosessor i samme øyeblikk.

De brukes som semaforer, det vil si at en heltallsvariabel er deklarert som vil ha verdien 0 hvis ressursen er ledig og 1 hvis den brukes, slik at hvis en prosessor sjekker og semaforen er 1, må den vente til den endres til 0 (1 = rødt trafikklys og 0 = grønt trafikklys).

Se også

Referanser