實驗:
利用 compiler tool
( https://gcc.godbolt.org/)翻譯為組語
,
並做說明(留意下註解中的順序)
當呼叫
printCallTree即可將call tree上的函式位置printf出來(或存在ram),
然後再用腳本(offline)將位置對應到map檔中的symbo,
得到call tree
。
這樣的程式可以放在Exception ISR中,
得知fun的呼叫關係,
增加debug的資訊。
p.s 實作時需要參考IC的calling
convertion
C:
void printCallTree(){}
void callee(){ callee2();}
void caller(void){callee();}
assembly:
callStack(): #1 暫存器RA可以反查到 text.callee()
...
callee():
addiu $sp,$sp,-32
sw $31,28($sp) #3, 從這可反推RA放在stack的哪,而RA又可以找到caller()_
sw $fp,24($sp)
move $fp,$sp
jal callee2() #2 從text這往上找到 push ra的指令
nop
nop
move $sp,$fp
lw $31,28($sp)
lw $fp,24($sp)
addiu $sp,$sp,32
j $31
nop
caller():
addiu $sp,$sp,-32
sw $31,28($sp) #5 同理
sw $fp,24($sp)
move $fp,$sp
jal callee() #4 同理
nop
nop
move $sp,$fp
lw $31,28($sp)
lw $fp,24($sp)
addiu $sp,$sp,32
j $31
nop
沒有留言:
張貼留言