記得還是職場菜鳥時, 老鳥工程師就常常告誡我們寫function盡量不要操過四個參數,
一直到最近在trace code時發現一個需要12個參數的function, 就順便 objdump -hD 一下,
才發覺當年老鳥告誡的箇中原因!!!!!!!
以下右邊是get_options這個function body. 左邊是caller.
一般而言, 如果前4個參數, 就用register a0~a3去傳遞就好
(ex: 0x801029a0~0x801029b0),
超出四個的其他參數, 在呼叫前就要依序放到frame stack內.
例如: 0x80102954就是把4-th 放到caller 的 sp+16. 以此類推.
最後jump 0x80105698到<get_options>
addiu sp, sp -72 表示這個function消耗72 bytes stack.
sw ra, 64(sp) 表示把ra備份到frame sp+64
sw s8, 60(sp) 表示把s8(上一層的sp)備份到目前sp+60
move s8, sp 表示把這層的sp放到s8
接下來就有趣了......
sw a0, 72(s8) 就是把caller的0-th 參數放到上一層frame stack的最頂端
sw a1, 76(s8) 則是把1-th 參數放到上一層frame stack + 4
以此類推..........
結論:
1. 如果是non leaf subrountine, 它的 stack 消耗量除了跟local variable有關之外, 還跟callee的參數多寡有關!!!!!
2. 參數傳遞實際放的位址, 以caller frame stack 最高處
0-th 放到 sp+0
1-th 放到 sp+4...
以此類推......