函数执行的时候
控制从函数A转移到函数B, 我们需要由两个信息
- 我从哪里来(返回)
- 我到那里去(跳转)
当函数A调用函数B时, 我们只要知道
- 函数A对于的机器指令执行到了哪里(我从哪里来, 返回)
- 函数B第一条机器指令所在的地址(要到哪里去, 跳转)
这两条信息可以让A来执行B, 当函数B执行完毕后跳转回函数A, 这些信息是如何获取的呢?
函数栈帧中最主要的是, 找到下一个执行的地点, 并且返回,
其中三个重要的命令是
call 0x40050
0x40056a
ret
call 0x40050
这条机器指令的意思是, 调用我们在代码中写过的函数, call 后面又一条机器指令地址, 这个地址就是函数B的第一条机器指令, 从这条机器指令后CPU将跳转到函数B
跳转过去了, 如何返回呢?
call 指令处理给出跳转地址之外还有这样的一个作用, 也就是把call 指令的下一条指令的地址, 就是0x40056a push 到函数A的栈帧中
ret
这个机器指令的作用是告诉CPU跳转到函数A保存在栈帧上的返回地址, 这样当函数B执行完毕后就可以跳转到函数A继续执行了.
寄存器是共享资源可以被所有函数使用, 既然可以将函数A的局部变量写入寄存器, 那么当函数A调用函数B的时候, 函数B的局部变量也可以写道寄存器中, 这样的话当函数B执行完毕后i到A时寄存器的值已经被函数B修改过来.
因此一定要先将寄存器中开始的值保存起来, 当寄存器使用完毕后再回复原值就可以了.