今天是寫組語第五天
寫完了...
過程不算太悲傷或煩躁,但也沒啥成就感或喜悅
就都一點點吧...跟日常的喜與悲一樣...
就蠻漫長的,精神時光屋
有個地方卡了一下,算是有學到一個觀念吧..
就是:
用 beq beqz 這類 branch 跳到某標籤後
如果標籤又用 ret 跳回來
會跳到上個你用 jal 的下一行
或是 ra = 0 就會出錯
ret 和 jal 是一起用的
因為 jal 會存下一行的 ra
beq 就類似 j 純粹跳轉
會用錯可能是覺得beq blt 這種很像高級語言的 if
事實上要搭配 jal 和一個 j 才比較像 if
-------
另一個更基本的觀念是
跳到另一個函數時
如果此函數會call其他函數
要把 ra 存起來
因為函數裡的函數的 jal 會改到 ra
通常函數開頭會這樣
addi sp,sp,-8 把stack pointer 往下
sw ra, 4(sp)
sw t1, 0(sp) 然後把 ra 存起來,那個 4,0 是 offset 要加上 sp 會等於地址
然後結尾就還原 (中間可以用 j 跳到其他標籤,最後的標籤再加這段)
lw ra, 4(sp)
lw t1, 0(sp)
addi sp,sp, 8
如果你的函數裡面沒有 call 其他函數,那就不用加這段,因為沒改到 ra
除非你想保存 t1 的值
-------
雖然很基本
但感覺真的要實際寫過比較有感...
就sp指下去然後慢慢堆起來的感覺...
以前看這些也覺得半知半解也不是特別在意...
最後有用到一點"模運算" 我覺得這對資工系真的蠻常用到的
需要熟練,但這裡就先不講了...