【发布时间】:2015-04-26 08:20:13
【问题描述】:
所以我的课本上有一个问题(计算机系统:程序员的视角问题 3.64):
它给出这样的代码:
typedef struct {
int a;
int *p;
} str1;
typedef struct {
int sum;
int diff;
} str2;
str2 word_sum(str1 s1) {
str2 result;
result.sum = s1.a + *s1.p;
result.diff = s1.a - *s1.p;
return result;
}
int prod(int x, int y) {
str1 s1;
str2 s2;
s1.a = x;
s1.p = &y;
s2 = word_sum(s1);
return s2.sum * s2.diff;
}
然后是 prod 和 word_sum 函数的汇编代码:
1 word_sum:
2 pushl %ebp
3 movl %esp, %ebp
4 pushl %ebx
5 movl 8(%ebp), %eax
6 movl 12(%ebp), %ebx
7 movl 16(%ebp), %edx
8 movl (%edx), %edx
9 movl %ebx, %ecx
10 subl %edx, %ecx
11 movl %ecx, 4(%eax)
12 addl %ebx, %edx
13 movl %edx, (%eax)
14 popl %ebx
15 popl %ebp
1 prod:
2 pushl %ebp
3 movl %esp, %ebp
4 subl $20, %esp
5 leal 12(%ebp), %edx
6 leal -8(%ebp), %ecx
7 movl 8(%ebp), %eax
8 movl %eax, 4(%esp)
9 movl %edx, 8(%esp)
10 movl %ecx, (%esp)
11 call word_sum
12 subl $4, %esp
13 movl -4(%ebp), %eax
14 imull -8(%ebp), %eax
15 leave
16 ret
它在汇编代码第 4 行询问为什么 prod 在堆栈上分配 20 个字节。
我可以看到它将为 str1 和 str2 分别分配 8 个字节,但我不知道第 5 个 4 字节内存分配是什么。
另外,你们对学习 x86 堆栈框架结构和过程调用有什么建议(视频、文章、博客文章)吗?目前在我的计算机体系结构课程中非常迷失。
【问题讨论】:
-
我觉得这段代码做了一点优化。什么是调用约定? cdecl?
-
@CollinDauphinee 它没有说,但我认为它是 cdecl,因为教科书告诉我们 eax、ecx 和 edx 是调用者保存的,这就是 cdecl 所具有的。
-
是的,我知道这段代码在做什么,我只是想找出解释它的最佳方式。这是一个可怕的问题,除非您获得了
word_sum并且没有将其包含在问题中。 -
@CollinDauphinee 是的,我们得到了 word_sum。抱歉,我认为我们不需要它来回答这个问题。我会编辑帖子。