Так у меня есть проблема с моего учебника (Computer Systems: программист Перспектива Проблемы 3,64):x86 Распределение Procedure Call Памяти
Это дает примерно такой код:
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;
}
, а затем коду сборки для в прод & 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
И спрашивает, почему прод выделяет 20 байт в стеке в сборочной линии кода 4.
Я вижу, что он будет выделять по 8 байт для str1 и str2, но я не знаю, что будет 5-м распределением памяти по 4 байта.
Кроме того, были ли у вас ребята какие-либо рекомендации (видео, статьи, сообщения в блоге) об обучении структуре кадра кадра x86 и процедурных вызовах? На данный момент я очень потерял курс «Компьютерная архитектура».
Я думаю, что этот код немного оптимизирован. Что такое конвенция? Cdecl? –
@CollinDauphinee это не говорит, но я полагаю, что это cdecl, потому что учебник сказал нам, что eax, ecx и edx являются вызывающими, и это то, что имеет cdecl. –
Да, я знаю, что делает этот код, я просто пытаюсь найти лучший способ объяснить это. Это ужасная проблема, если вы не получили слово «word_sum» и не включили его в вопрос. –