記得還是職場菜鳥時, 老鳥工程師就常常告誡我們寫function盡量不要操過四個參數, 

一直到最近在trace code時發現一個需要12個參數的function, 就順便 objdump -hD 一下,

才發覺當年老鳥告誡的箇中原因!!!!!!!

 

以下右邊是get_options這個function body. 左邊是caller.

10649969_871962606155042_6312035918578779335_n.jpg  

一般而言, 如果前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...

以此類推......

 

 

arrow
arrow
    全站熱搜

    Orion 發表在 痞客邦 留言(0) 人氣()