指令集與組合語言
上述程式碼是某個函式的開頭(序言,prologue)。下列何者是這個部分所做的事?
addi sp, sp, -16
sw ra, 12(sp)
sw s0, 8(sp)
- A在堆疊上配置區域,並保存返回位址(ra)與被呼叫端保存的s0
- B從堆疊讀入函式的引數ra、s0
- 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,所以是配置。