Hoofdstuk 2: intsructions: language of the computer Flashcards
Instruction set +
Woordenschat van de computer
- afhankelijk van computer
bv. RISC-V
Doel van computertaal +
- gemakkelijk voor bouwen van hardware en compilers
- maximale performantie en minimale kost
RISC-V
Een assembly language met 32 registers. Er wordt naar deze registers verwezen met hun nummers, van 0 to 31.
- elke lijn kan maar 1 instructie bevatten
- elke rekenkundige instructie heeft steeds exact 3 variabelen
Stored-program concept
Het idee dat instructies en data in het geheugen als nummer kunnen opgeslagen worden en dus makkelijk zijn om te veranderen.
Een programma wordt dus elektronisch opgeslagen in binaire vorm in het geheugen, zodat de instructies kunnen aangepast/uitgevoerd worden door de computer.
Het laat dus bv. toe dat een computer dat financien beheert in een mum van tijd plots een computer wordt dat een auteur een boek helpt schrijven.
Design principle 1: simplicity favors regularity
Regelmaat maakt implementatie eenvoudiger, en eenvoud laat hogere performantie toe voor een lagere prijs.
Dit is van toepassing bij RISC-V waar elke rekenkundige instructie steeds exact 3 variabelen heeft. Dit maakt het eenvoudiger om hiervoor hardware te ontwikkelen.
global pointer
Het register dat gereserveerd is om naar het statische gedeelte te wijzen. (statisch = variabelen buiten procedures.)
2-complement voorstelling
Dit is een manier om getallen voor te stellen in een computer. Het is een conventie om signed binaire nummers voor te stellen. De voorste bit is de sign bit, als deze nul is dan is het nummer positief, als deze 1 is dan is het nummer negatief. Hiermee kunnen getallen van -2^31 tot 2^31-1 voorgesteld worden. Getallen worden negatief gemaakt door alle bits te inverteren en er 1 bij op te tellen.
Heft voordeel van deze voorstelling is dat er maar 1 mogelijkheid is om nul voor te stellen, waar sign en magnitude en one’s complement elk zowel een positieve als negatieve 0 hebben. Ook moet er bij het optellen geen onderscheid gemaakt worden tussen positieve en negatieve getallen. Het nadeel is dat er in two’s complement 1 negatief nummer is dat geen positieve tegenhanger heeft.
Alternatieven zijn de one’s complement en de sign en magnitude.
Figure 2.13
De conventie voor het toewijzen van programma’s en data in het RISC-V geheugen. Vanonder is gereserveerd. Als 2de hebben we het tekst segment = het ‘thuis’ van de RISC-V machine code. Gevolgd door een plaats voor de constanten en statische variabelen. Als voorlaatste hebben we de heap, waarin de dynamische data structuren worden gestockeerd (bv. Linked list). Met tot slot de stack. Merk op dat de stack en de heap naar elkaar toe kunnen groeien, zodat er efficiënt gebruik kan gemaakt worden van het geheugen, aangezien de ene krimpt als de andere groeit.
Addressing modes
De verschillende manieren om te adresseren binnen een instructie om zo operanden te bepalen. De addressing modes voor RISC-V instructies zijn:
- Immediate addressing, waar de operand een constante is binnen de instructie zelf
- Register addressing, waar de operand een register is,
- Base of displacement addressing, waar de operand gealloceerd is op een geheugenlocatie waarvan het adres de som is van een register en een constante in de instructie
- PC-relative addressing, waar het branch adres de som is van de PC en een constante in de instructie
Bit
binary digit. Dit is 1 van de 2 nummers in modulo 2, dus 0 of 1.
Instructies staan als een stel bits in het geheugen.
Byte
unit of digital information that usually consists of 8 bits
Op de dag van vandaag adresseren alle architecturen individuele bytes.
word
A natural unit of access in a computer, usually a group of 32 bits
doubleword
A natural unit of access in a computer usually a group of 64 bits, corresponds to the size of a register in the RISC-V architecture
Data transfer instruction
Een instructie om data uit te wisselen tussen het register en het geheugen: stores en loads! Deze zijn nodig doordat data structuren (bv array) worden bijgehouden in het geheugen.
De data transfer instructie dat data van het geheugen naar een register kopieert wordt load genoemd.
Store kopieert data van een register naar het geheugen.
Front end van een compiler
De functie van de front end van een compiler is het inlezen van een source programma, het checken van syntax en semantics, en het vertalen van het source programma naar een intermediare vorm dat de meeste taal-specifieke operaties van het programma interpreteert. Het is vaak opgedeeld in 4 verschillende functies:
- Scanning: leest alle individuele karakters en creëert een string van tokens
- Parsing: checkt of syntax tokens correct is (output = abstract syntax tree)
- Semantic analysis: checkt of AST semantisch correct is.
- Generatie van intermediaire voorstelling: neemt de symbool tabel en AST en genereert de intermediare representatie dat de output is van de front end.
(sort assembler maar bv met oneindig #registers) (bv. Java bytecode)
–> elke stap = taal onafhankelijk
DLL
= Dynamically Linked Library
Library routines die gelinkt zijn aan een programma tijdens de uitvoering. De library routines worden dus niet gelinkt en geladen totdat het programma uitgevoerd wordt. Het linken gebeurt bij de eerste keer dat het opgeroepen wordt. Het werkt de eerste keer met meerdere indirecties, daarna nog maar met 1 indirectie. De library wordt in memory geladen en tijdens de linking stage wordt enkel het adres van library functie toegevoegd aan de executable file.
Het nadeel is dat er extra ruimte nodig is, maar het voordeel is dat nu hele bibliotheken niet meer gekopieerd moeten worden. Dit was het geval voor de traditionele manier om programma’s te linken voordat het programma gerund wordt. In dit geval maakt namelijk de library routine deel van de exucutable code uit ( → indien nieuwe versie wordt oude nog gebruikt) en het laadt alle routines die voorkomen in de executable, zelfs als ze niet worden uitgevoerd.
Compiler
Een compiler transformeert de HLL naar assembly language, dit is een symbolische versie van wat de computer verstaat. Door in high- level language te kunnen schrijven is de productiveit van programmeurs veel hoger.
Eerst gaat het programma door een front end. Hierbij wordt bijvoorbeeld gekeken of de syntax correct is. (output = abstract syntax tree) en gebeurt hiermee een semantische analyse. Vervolgens wordt er een intermediaire voorstelling gegenereerd. Hierin wordt de code geoptimaliseerd (zowel lokaal als globaal). Uiteindelijk wordt dan de code gegenereerd. Dit is meestal een 1-op-1 mapping met de ISA.
Fields in an instruction of RISC-V
Instruction format bestaat uit een aantal velden. Een veld is een groepje bits en is een segment in de representatie van een instructie.
zie tussenhaakjes voor de soorten velden. (voor R: funct7, rs2, rs1, funct3, rd, opcode, voor I: immediate, rs1, funct3, rd, opcode en voor S: immediate, rs2, rs1, funct 3, immediate, opcode).
Frame pointer
Sommige compilers bevatten een frame pointer. Dit is de waarde die de locatie aanduidt van opgeslagen registers en lokale variabelen van een gegeven procedure. De frame pointer biedt een stabiel basisregister aan binnen een procedure voor lokale geheugen referenties (aangezien de stack pointer tijdens de executie volatiel kan zijn).
Heap
Datastructuur die dynamische data (bv. linked lists) bijhoudt in het RISC-V geheugen. Het geheugen vragen en vrijgeven op de heap gebeurt met behulp van expliciete functies.
malloc(size) vraagt geheugen op de heap en geeft een pointer terug.
mfree() geeft geheugen vrij op de plaats naar waar de pointer wijst.
Immediate operands
Door het gebruik van immediate operands (zoals bv. add immediate) worden de operaties veel sneller en verbruiken ze veel minder energie. Ze nemen namelijk constanten op in de rekenkundige instructie ipv het uit het eerst uit het geheugen te halen met load.
Dit is een voorbeeld van making the common case fast.
Instruction format of RISC-V
Dit is de layout van de instructie dat bestaat uit velden van binaire getallen. Het heeft een vaste grootte, nl. 32 bits. Voor leesbaarheid wordt gebruik gemaakt van hexadecimale getallen.
3 soorten: R → arithmetic, I → immediates, → S voor stores (zie instruction field voor meer detail)
Java Byte Code
Instructie set dat ontworpen is om Java programma’s te interpreteren. Deze instructie set is ontworpen zodat het zeer hard lijkt op de Java language en dus zodat de compiling stap eigenlijk triviaal is. Virtueel is er geen optimalisatie.
Jump - and - link instruction
Een branch instruction dat zowel het adres van de volgende instructie opslaat, als naar het adres van een aftakking gaat: bv. Jal x1, ProcedureAddress (return address van procedureaddress zal x1 zijn). Deze instructie wordt enkel gebruikt voor procedures.
Just - In -Time compiler
Een compiler die vertaalt tijdens het uitvoeren.
Deze compiler wordt o.a. gebruikt in Java zodat draagbaarheid behouden wordt en execution snelheid verbetert. The gecompileerde porties worden opgeslagen voor elke volgende keer dat het programma gerund wordt zodat het elke keer sneller gerund kan worden.
Least significant bit
Het uiterst rechtse bit (we tellen van rechts naar links)