Что изначально находится в %edi
в строке 13?
rdi
- это первый регистр передачи параметров для 64-битного ABI AMD / Linux,edi
используется в этом коде, поскольку ваша функция принимает 32-битный параметр int
.
Почему код ссылается на -20(%rbp)
?
Сохраняет переданный параметр в стек;по-видимому, вы компилируете с низкой или без оптимизации, поэтому каждая переменная получает реальный адрес памяти.Если вы включите оптимизацию, вы, вероятно, увидите, что эти операции исчезают.
А что именно делает строка 16?
Строка 16 - это массивоперация индексирования:
movl a(,%rax,4), %eax
Синтаксис AT & T для адресации памяти выглядит немного странно.Он разбивается следующим образом:
переопределение сегмента: смещение со знаком (основание, индекс, масштаб)
В вашем случае адрес массива используется в качестве смещенияполе, у вас нет базового регистра или переопределения сегмента, масштаб 4
и используемый регистр индекса rax
.Это сводится к чему-то вроде этого C-подобного псевдокода:
eax = *(int *)((char *)a + (rax * 4))
Какой смысл переключаться за 32-битные регистры и 64-битные регистры (длянапример, в строке 15)?
Я не вижу ничего подобного в строке 15, но причина этого в том, что ваша функция использует много int
- начиная с int
это 32-битный тип, компилятор использует 32-битные регистры.Там, где это не имеет значения или компилятор использует временные регистры, он выбирает собственный 64-битный размер.