寄存器使用惯例
继续上一节的问题, 为啥不保存恢复 eax ecx edx ?
C 语言程序就是函数套着函数, 也就是说子过程使用过的通用寄存器也可能是父过程使用过的.
子过程在使用这些寄存器之前应该先保留这些寄存器的值, 然后子过程退出的时候恢复这些寄存器的值.
这是应该这么做, 但是具体怎么做呢, 如果没有任何约定的话, 就是把所有使用的通用寄存器都保存一遍, 然后恢复, 但是这样效率不高, 因为你所使用的的寄存器, 你的父过程未必使用过.
所以这种情况下, 大家要引入一个约定, 称之为寄存器的使用惯例. 就是说寄存器要作为程序的临时存储, 那么调用者与被调用者各有各的职责, 我们把这些通用寄存器分成两类, 一部分让调用者来负责保存和恢复, 另外一部分由被调用者保存和恢复.
- 调用者负责保存和恢复
就是调用者在调用子过程之前, 将这些寄存器内容存储在它的栈帧里面, 子过程返回之后再来恢复
%eax, %edx, %edi
- 被调用者负责保存和恢复
就是说被调用者在使用这些寄存器之前, 将其原有内容存储到它的栈帧内, 返回之前恢复
%ebx, %esi, %edi
%eax 用于保存返回值