Почему компилятор обращается к аргументам относительно 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

0 ответов

Другие вопросы по тегам