指令集與組合語言

在RISC-V的標準呼叫慣例中,進入函式時的堆疊指標sp規定要對齊為16位元組的倍數。下列何者是最適當的理由?

  1. A因為堆疊的容量若不是16位元組的倍數,作業系統就無法啟動
  2. B因為要在sp的低4位元記錄函式的編號
  3. C因為即使將最大16位元組的大型資料放在堆疊上,也能不跨越邊界而有效率地讀寫
查看答案與解析

正確答案:C. 因為即使將最大16位元組的大型資料放在堆疊上,也能不跨越邊界而有效率地讀寫

資料若放在其大小的倍數的位址(對齊),就能不跨越邊界而一次讀寫。只要讓sp永遠保持為16的倍數,即使將8位元組的double或16位元組的long double等放在堆疊上,對齊也能維持。因此函式會以16的倍數來配置框的大小,即使只保存一個暫存器,也是「addi sp, sp, -16」。

  • A. 與作業系統的啟動無關。
  • B. 不會在sp的低位元放入資訊。
  • C. 正確。是為了雙精度與128位元資料的對齊。
練習這個領域 前往領域頁面

指令集與組合語言的其他題目

  1. 上述程式碼是某個函式的開頭(序言,prologue)。下列何者是這個部分所做的事?
  2. 下列何者是在函式中使用框指標(frame pointer,RISC-V中為s0/fp)的優點?
  3. 在RISC-V中撰寫呼叫自己的遞迴函式時,若忘了將ra保存到堆疊,會發生什麼事?
  4. 在小端序(little-endian)的RISC-V中,以「sw」將存放0x12345678的暫存器寫入位址0x100。之後以「lbu」讀取位址0x101的1個位元組,值是多少?
  5. 在RISC-V中,當讀取4個位元組的lw指令的位址不是4的倍數(邊界未對齊)時,下列何者是可能發生的事?