看CSAPP p151-152产生的疑问

 

http://www.2cto.com/os/201408/323797.html

(节选)

 

偷偷懒我就不写寄存器前面的百分号了O(∩_∩)O)

eax 这个寄存器属于调用者保存寄存器,通常用来存储一些函数的返回值

edx ecx这两个也是属于调用者保存寄存器,并且 属于通用寄存器,可以随意保存数据,没有 什么特定的 限制。

ebx edi esi这三个寄存器属于被调用者保存寄存器。通常来说edi 和 esi可能会保存一些被调用函数的参数。

这里要说明一下一个概念,就是我很疑惑的,什么叫做调用者保存寄存器,什么叫做被调用者保存寄存器。

 

寄存器按照规则被分类了,左面的三个寄存器是调用者负责保存,右边三个寄存器是被调用者负责保存。也就是说,在过程调用的时候,如果被调用者程序会覆盖左边三个寄存器的内容,那么,如果这三个寄存器内容在过程调用结束之后还要用到没调用过程之前的那个数值的话,就要有人在过程调用发生之前保存这个寄存器里面的数值,但是由谁来保存呢?只能由调用者去保存,也就是说,被调用者是不会管你这里面有什么重要的数据的,他拿过来就用,但是调用者如果需要这里面的数据,就要自己提前保存。说的再直白一点,就是寄存器是任何程序都可以随便用的,但是里面数据的保存工作就是有责任人的。左边三个寄存器的责任人是调用者,右边三个寄存器的责任人是被调用者。

 

(.....)

 

1 #include
2 #include
3 #define TYPE_MIN INT_MIN
4 typedef int type_i;
5 typedef struct return_t
6 {
7 int left;
8 int right;
9 type_i sum;
10 } return_type;
11 return_type find_max_crossing_subarray(type_i *A,int low,int mid,int high)
12 {
13 type_i left_sum=TYPE_MIN;
14 type_i sum=0;
15 int i;
16 int max_left;
17 for(i=mid;i>=low;i--)
18 {
19 sum+=A[i];
20 if(sum>left_sum)
21 {
22 left_sum=sum;
23 max_left=i;
24 }
25 }
26 type_i right_sum=TYPE_MIN;
27 sum=0;
28 int max_right;
29 for(i=mid+1;i<=high;i++)
30 {