Почему компилятор обращается к аргументам относительно ESP в одной функции, а к EBP — в другой?
Вот код C-1:
int max(int x, int y) {
int diff = x - y;
int mask = (diff >> 31) & 1;
return y + mask * diff;
}
и его сборка O1 оптимизирована:
movl 4(%esp), %eax
movl %eax, %ecx
subl 8(%esp), %ecx
movl %ecx, %edx
shrl $31, %edx
imull %ecx, %edx
subl %edx, %eax
А вот C Code-2:
int sum(int x, int y)
{
int sum = x + y;
return sum;
}
и его ASM:
movl 8(%ebp), %edx
movl 12(%ebp), %eax
addl %edx, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
Теперь мой вопрос: в первой проблеме сгенерированный asm используетmovl 4(%esp), %eax
: означает, что значение, смещенное на 4 байта указателя стека от начала координат, копируется в или просто копируется.x
вeax
.
Теперь во втором коде C, ПОЧЕМУ ВМЕСТО использования,ebp
был использован? и почему вместо использования (mov 4ebp,eax
),movl 8(%ebp), %eax
был использован?
Я ожидал, что оба кода ASm будут одинаковыми и будут использоватьesp
начиная со смещения 4