前往
大廳
主題

24/05/08 寫完組語作業了...

Amogus | 2024-05-08 21:36:10 | 巴幣 10 | 人氣 44

今天是寫組語第五天
寫完了...
過程不算太悲傷或煩躁,但也沒啥成就感或喜悅
就都一點點吧...跟日常的喜與悲一樣...
就蠻漫長的,精神時光屋

有個地方卡了一下,算是有學到一個觀念吧..
就是:
用 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指下去然後慢慢堆起來的感覺...
以前看這些也覺得半知半解也不是特別在意...
最後有用到一點"模運算" 我覺得這對資工系真的蠻常用到的
需要熟練,但這裡就先不講了...



創作回應

薯妮亞
完了,計結還給老師了
2024-05-10 00:48:31
薯妮亞
計結組語那章,感覺只要把recursion那個例題搞懂就差不多了
2024-05-10 00:49:39
Amogus
確實
2024-05-10 09:02:08

更多創作