函数调用的现场保护 - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Table of Contents

综述

  • 本篇描述的函数调用指一般的C语言函数调用
  • 函数调用编译成jsr PC,DST的形式,参见编程技巧
  • 编译器在函数体前后加入现场保护/还原代码
    • 在函数体首加入 jsr R5,csv
    • 在函数体末加入 jmp cret

分析

  • jsr PC,DST
    • 将PC[0]入栈
    • 程序转入被调用函数
  • jsr R5,csv
    • R5[0]入栈
    • 当前PC[1]→R5(csv程序要求R5指向返回地址)
    • 程序转入csv
  • csv函数中
    • R2[0]、R3[0]、R4[0]入栈
    • R5形成勾连(参看环境指针)
  • 至此
    • 函数返回地址PC[0]入栈被保护
    • R5[0]、R2[0]、R3[0]、R4[0] 均入栈被保护
    • R5指向R5[0]的栈内地址形成勾连(参看环境指针)
    • 所有必要参量均被保护
  • jmp cret
    • 逆序还原R2[0]、R3[0]、R4[0]
    • 还原栈顶指针SP←R5
    • R5还原勾连(参看环境指针)
    • 函数返回

举例

C语言代码

test()
{
printf("Hello,World!");
}
main()
{
test();
return(0);
}
经过编译和反汇编,形成代码
...
jsr r5,csv
mov $cret+16,(sp)
jsr pc,*$_printf
jmp cret
jsr r5,csv
jsr pc,_test
jmp cret
...

参考

⚠️ **GitHub.com Fallback** ⚠️