Hvordan fungerer settet med registre og instruksjoner til en CPU?

Har du noen gang lurt på hva som er grunnen til at et program som er samlet for å fungere på x86-prosessorer for PCer ikke fungerer på en ARM prosessor for eksempel? Hva gjør et program kompatibelt med en bestemt prosessorfamilie og ikke andre? Hva er registre og hva er deres funksjon? I denne artikkelen forklarer vi hva registerene og instruksjonene av en CPU er slik at du kan forstå det.

Mange ganger har vi snakket om prosessorer som har et bestemt sett med instruksjoner, eller at et sett med instruksjoner er lagt til en ny prosessor. La oss se hva dette betyr.

Instruksjoner for en CPU

Hva er en instruksjon?

En instruksjon er ikke noe mer enn en handling vi sender for å gjøre i en prosessor. Instruksjonene kan være aritmetiske operasjoner med forskjellige typer data som flytende punkt, heltall, vektor, skalar, logiske operasjoner, databevegelsesoperasjoner, bitbevegelsesoperasjoner (der litt endres posisjon), hoppoperasjoner osv.

De samme instruksjonene er delt inn i andre undertyper, avhengig av hvor dataene ligger. For eksempel tillater noen instruksjoner å operere med dataene som finnes i registrene for øyeblikket, mens vi i andre tilfeller må markere minneadressen der dataene ligger (direkte modus) eller adressen til minneadressen (indirekte modus ).

Hvordan CPU leser instruksjoner i binær kode

Uansett hvilken CPU vårt system bruker, leser alle binærkoden på en bestemt måte som tilsvarer familien. Det de gjør er å ta en viss mengde biter av den binære koden de utfører og tolke deres betydning i henhold til disposisjonen for den. Hver instruksjon er kodet på følgende måte: de første sifrene tilsvarer instruksjonskoden og hvordan den skal utføres, og de siste bitene er selve dataene eller hvor dataene vi vil utføre instruksjonen på.

Settene med registre og instruksjoner fra CPUene kalles ISA (Instruction Set Architecture) og alle under samme ISA bruker den samme kodingen av instruksjonene og derfor den samme binære koden for dem.

Uttalelse satt forhold til monteringsspråk

Sett instruksjoner x86

Alle prosessorfamilier har et felles forsamlingsspråk i det, hvis instruksjoner har en 1: 1-korrelasjon med settet med registre og instruksjoner fra prosessorfamilien. I tabellen over kan du se forholdet mellom de forskjellige instruksjonene for x86-monteringsspråk med instruksjonskoden, som i tabellen er uttrykt i heksadesimal.

Husk at nye instruksjoner kontinuerlig blir lagt til ISAer, noe som fører til veldig nye programmer som uttrykkelig bruker disse nye instruksjonene, bare fungerer på prosessorer som støtter dem. Generelt er instruksjonssett stabile over tid med liten endring, men fra tid til annen introduseres instruksjoner for spesifikke markeder som enten ender som en del av standarden eller senere kastes.

Det er også tilfellet med nye instruksjoner som er mer effektive enn de eksisterende, men der disse instruksjonene ikke blir eliminert fra settet fordi det er en stor mengde programvare som avhenger av dem i markedet.

RISC vs CISC vs Post-RISC

RISC-prosessorer har få instruksjoner, så de må kompensere for mangelen på instruksjoner med mer komplekse, men til gjengjeld får de høyere hastighet når de kjøres på grunn av deres letthet. CISC-prosessorer har derimot mye mer komplekse sett med instruksjoner som krever en mer kompleks konstruksjon av maskinvaren, men utfører i stedet disse instruksjonene på færre sykluser.

Denne forskjellen, selv om den var kontroversiell i sin tid, skyldes ikke lenger det faktum at siden Pentium Pro dukket opp på PC-en, gikk vi til Post-RISC-tiden, der til tross for at programmene bruker et sett med registre og instruksjoner. blir disse konvertert til en mikrokode med enklere instruksjoner i prosessen, slik at CISC-arkitekturer kan oppføre seg som RISC-arkitekturer og oppnå høye klokkehastigheter ved hjelp av komplekse instruksjoner.

Registerene til en CPU

Registrerer instruksjoner for CPU

Register er det nærmeste minnet til en prosessor som eksisterer og derfor den raskeste; Dette er veldig små minner som kan manipuleres direkte av prosessorens kontrollenhet. De brukes til å utføre alle slags vanlige oppgaver og ikke bare for å utføre regneoperasjoner.

De vanligste registrene i en CPU uavhengig av ISA er:

  • Akkumulator type registrerer : brukes til aritmetiske operasjoner. Hver familie har et annet antall poster av akkumulatortypen.
  • Minnetilgangsregistre : inneholder minneadressen til dataene vi vil ha tilgang fra RAM.
  • Data registreres til eller fra minnet : Inneholder data kopiert fra minnet (lest) eller skal skrives til en bestemt minneadresse (skriv).
  • Generelle registre : dette er minneregister uten et spesifikt verktøy, men som tjener til å lagre data som skal påkalles så raskt som mulig.
  • Programteller : indikerer neste instruksjon å utføre; jump instruksjoner endre dem når du ikke vil ha tilgang til neste instruksjon, men heller en annen del av programmet. I hver komplette instruksjonssyklus økes minneadressen med 1 og er assosiert med prosessorens adressebuss.

Noen av CPU-registerene, for eksempel programtellerregisteret, som indikerer hva som er neste minneadresse prosessoren peker på, finnes i alle CPUer og andre typer prosessorer med muligheten til å utføre programmer mens andre poster er unike for hver sett med poster og instruksjoner, noe som gjør 1: 1 korrelasjon mellom forskjellige ISA nesten umulig.

Selv om vi hadde en 1: 1-omformer av instruksjonskoden, ville vi fortsatt ha problemer fordi, selv om to prosessorer kan ha samme tilleggsinstruksjon, kan vi finne ut at måten å bruke registerene og registerene de bruker er forskjellig, og at det finnes til og med registre i en familie og ikke i andre. Et eksempel på disse vanskelighetene ble møtt av begge Microsoft og Qualcomm ved tilpasning Windows 10 til ARM slik at alle x86-applikasjoner vil kjøre problemfritt på en ARM-CPU.

Imidlertid er det løsninger som å bruke programvare for oversettelsesinstruksjoner. Programvaren overfører den binære koden til en mellomliggende kode og overfører den deretter til den binære koden til målprosessoren der vi vil kjøre applikasjonen. Åpenbart er denne prosessen mye tregere, og det anbefales bare å kjøre veldig gammel programvare fra familier til ikke-eksisterende prosessorer på markedet.