指令集與組合語言

上述程式碼是某個函式的開頭(序言,prologue)。下列何者是這個部分所做的事?

addi sp, sp, -16
sw   ra, 12(sp)
sw   s0, 8(sp)
  1. A在堆疊上配置區域,並保存返回位址(ra)與被呼叫端保存的s0
  2. B從堆疊讀入函式的引數ra、s0
  3. C為了從函式返回,而釋放堆疊
查看答案與解析

正確答案:A. 在堆疊上配置區域,並保存返回位址(ra)與被呼叫端保存的s0

第1行將sp減16以配置堆疊框,第2行將返回位址ra、第3行將被呼叫端保存的s0寫入框中。這個函式會呼叫其他函式,所以必須保存ra;又因為使用s0,所以必須保護其原本的值。在函式最後的結尾(epilogue),會以「lw s0, 8(sp)」「lw ra, 12(sp)」「addi sp, sp, 16」「ret」的相反順序還原。

  • A. 正確。在最後的部分(結尾)以相反的順序還原。
  • B. sw是寫入(儲存),ra與s0都不是引數。
  • C. 因為是減少sp,所以是配置。
練習這個領域 前往領域頁面

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

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