Почему number ++ использует EAX, а number-- использует ECX? - PullRequest
2 голосов
/ 01 мая 2011
;disas for number++
mov eax, [number]
add eax,1
mov [number],eax
;disas for number--
mov ecx, [number]
sub ecx,1
mov [number],ecx

Почему number++ использует EAX, в то время как number-- использует ECX?

Какое соглашение используется для отправки регистров?

Ответы [ 4 ]

9 голосов
/ 01 мая 2011

Распределение регистров зависит от компилятора.Обычно это будет зависеть в первую очередь от окружающего кода, а не от выполняемых вами операций.

4 голосов
/ 01 мая 2011

Для этих операций нет соглашения. Большинство регистров общего назначения и могут использоваться для обычных арифметических операций.

Компилятор просто использует регистр, который в этот момент оказывается свободным.

3 голосов
/ 01 мая 2011

Вы пропустили сборку вокруг этих извлечений, которая, вероятно, является самой важной частью , иначе вы не сможете определить, где другие регистры используются или нет (или если соглашения о вызовах сыграли свою роль).

С окружающими элементами немного легче определить, было ли распределение частично произвольным (раскраска графа) или более равномерным линейным сканированием и т. Д. Флаги компилятора также повлияют на это, потому что оба приведенных выше примера могут быть не без использования регистров.

0 голосов
/ 01 мая 2011

См. Все остальные ответы о том, что он зависит от компилятора и кода, правила нет.

unsigned int x;

void one ( void )
{
  x++;
}
void two ( void )
{
 x--;
}

с оптимизацией

one:
    addl    $1, x(%rip)
    ret
two:
    subl    $1, x(%rip)
    ret

тот же компилятор, тот же код, тот жедень, без оптимизации, eax используется для обоих

one:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    x(%rip), %eax
    addl    $1, %eax
    movl    %eax, x(%rip)
    leave
    ret
two:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    x(%rip), %eax
    subl    $1, %eax
    movl    %eax, x(%rip)
    leave
    ret
...