Вопрос о регистрах локальных переменных в ассемблере x86-64 - PullRequest
2 голосов
/ 05 марта 2020

Мне поручено преобразовать код сборки x86-64 обратно в простую C функцию. Функция C, с которой я работаю, принимает 4 аргумента (long a, long b, long c, long d). Как и ожидалось, начало кода ассемблера начинается с

movq   %rdi, -32(%rbp)
movq   %rsi, -40(%rbp)
movq   %rdx, -48(%rbp)
movq   %rcx, -56(%rbp)

Позже в коде эти регистры снова используются, например,

movq   -40(%rbp), %rax
imulq  -48(%rbp), %rax
movq   %rax, %rdx
movq   -32(%rbp), %rax
addq   %rdx, %rax
movq   %rax, -24(%rbp)

Мой вопрос: если приведенный выше код, на третьем line, присваивает значение для (long c) или этот регистр был очищен во время первого фрагмента кода и просто используется в качестве регистра общего назначения в этой ситуации.

1 Ответ

4 голосов
/ 05 марта 2020

Нет, это не присвоение значения c.

Значения параметров были перемещены в стек. В частности, значение в rdx было скопировано в -48(%rbp). Поэтому, когда компилятор хочет изменить значение c, он запишет в -48(%rbp).

В более позднем коде rdx просто используется как пустой регистр.

...