Instructieset en assembly

In de standaard RISC-V-aanroepconventie moet de stackpointer sp bij het betreden van een functie op een veelvoud van 16 bytes zijn uitgelijnd. Wat is de meest passende reden?

  1. AOmdat het OS niet opstart als de stackcapaciteit geen veelvoud van 16 bytes is
  2. BOmdat het functienummer in de onderste 4 bits van sp wordt vastgelegd
  3. COmdat ook grote data tot 16 bytes op de stack efficiënt kunnen worden gelezen en geschreven zonder een grens te overschrijden
Antwoord en toelichting tonen

Antwoord: C. Omdat ook grote data tot 16 bytes op de stack efficiënt kunnen worden gelezen en geschreven zonder een grens te overschrijden

Als data op een adres worden geplaatst dat een veelvoud van hun grootte is (uitlijning), kunnen ze in één keer worden gelezen en geschreven zonder een grens te overschrijden. Als sp altijd een veelvoud van 16 is, blijft de uitlijning behouden ook wanneer bijvoorbeeld een double van 8 bytes of een long double van 16 bytes op de stack wordt geplaatst. Daarom reserveert een functie de framegrootte in veelvouden van 16 en gebruikt „addi sp, sp, -16” zelfs als maar één register wordt opgeslagen.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Instructieset en assembly

  1. De bovenstaande code is het begin (prologue) van een functie. Wat doet dit deel?
  2. Welk voordeel heeft het gebruik van de frame pointer (in RISC-V s0/fp) in een functie?
  3. Wat gebeurt er als men bij het schrijven van een recursieve functie die zichzelf aanroept in RISC-V vergeet ra op de stack op te slaan?
  4. Op een little-endian RISC-V is het register met 0x12345678 met „sw” naar adres 0x100 geschreven. Wat is de waarde als daarna met „lbu” het byte op adres 0x101 wordt gelezen?
  5. Wat kan er gebeuren als het adres van een lw-instructie die 4 bytes leest in RISC-V geen veelvoud van 4 is (niet uitgelijnd)?