Почему дизассемблированный код не использует регистр DIL вместо регистра AL?

Код С:

void charTypes(char a)
{
    return ;
}

void intType(int a)
{
    return ;
}

Сборка:

0000000000000000 <charTypes>:
   0:   f3 0f 1e fa             endbr64 
   4:   55                      push   rbp
   5:   48 89 e5                mov    rbp,rsp
   8:   89 f8                   mov    eax,edi
   a:   88 45 fc                mov    BYTE PTR [rbp-0x4],al
   d:   90                      nop
   e:   5d                      pop    rbp
   f:   c3                      ret    

0000000000000010 <intType>:
  10:   f3 0f 1e fa             endbr64 
  14:   55                      push   rbp
  15:   48 89 e5                mov    rbp,rsp
  18:   89 7d fc                mov    DWORD PTR [rbp-0x4],edi
  1b:   90                      nop
  1c:   5d                      pop    rbp
  1d:   c3                      ret  

В случае параметра char, зачем нам нужно назначать edi для eax? Что мешает этому?

DWORD PTR [rbp-0x4],dil

person InQusitive    schedule 26.04.2020    source источник
comment
Зачем нам нужно назначать edi для eax? Мы этого не делаем, но вы сказали компилятору не оптимизировать, и он этого не сделал. Это всего лишь некоторые детали внутреннего устройства компилятора и того, как он представляет 8-битные вещи внутри. И поскольку вы скомпилировали без оптимизации, эти внутренние компоненты в конечном итоге производят несколько фактически потраченных впустую ассемблерных инструкций. Как я уже сказал, отвечая на ваш предыдущий вопрос, неоптимизированный код обычно неинтересен для просмотра. Подобная хрень - одна из причин этого.   -  person Peter Cordes    schedule 26.04.2020
comment
@PeterCordes: Какой уровень оптимизации будет лучшим для новичка в дизассемблировании? Я не хочу пропустить обучение реальной эксплуатации.   -  person InQusitive    schedule 26.04.2020
comment
Я бы рекомендовал как минимум -Og или -O1 -fno-inline-functions, а чаще всего -O2 -fno-tree-vectorize -fno-unroll-loops. Не существует способа избежать оптимизации констант и прочего, поэтому вам нужно писать функции, которые принимают аргументы и возвращают результат, или изменяют массив, или что-то еще, что нельзя просто оптимизировать до return 1234. Как удалить шум из вывода сборки GCC/clang? есть несколько предложений и ссылка на выступление Мэтта Годболта. Использование godbolt.org для сопоставления исходных строк с asm очень помогает.   -  person Peter Cordes    schedule 26.04.2020
comment
@PeterCordes: с помощью этих оптимизаций я обнаружил, что преамбула функции отсутствует. Так действительно ли оптимизированный код может выполняться компьютером?   -  person InQusitive    schedule 27.04.2020
comment
Да, -fomit-frame-pointer включен на большинстве уровней оптимизации. Те инструкции в каждой функции, которые устанавливают RBP в качестве указателя кадра, а затем разрывают кадр стека, не являются специальными или необходимыми, RBP — это просто обычный регистр. Здесь нет никакой магии. x86_64: указатель фрейма стека почти бесполезен?. Если вы скомпилируете целую программу и выполните пошаговое выполнение ассемблера с помощью отладчика (например, gdb layout reg), вы увидите инструкции, которые действительно выполняются.   -  person Peter Cordes    schedule 27.04.2020