разборка простого кода на C на LLVM GCC 4.2 - PullRequest
2 голосов
/ 24 ноября 2011

когда я разобрал следующую простую программу на C:

int main ()
{
 int a = 'a';
return 0;
}

Я получил это:

Dump of assembler code for function main:
0x0000000100000f20 <main+0>:    push   rbp
0x0000000100000f21 <main+1>:    mov    rbp,rsp
0x0000000100000f24 <main+4>:    mov    BYTE PTR [rbp-0x9],0x61
0x0000000100000f28 <main+8>:    mov    DWORD PTR [rbp-0x8],0x0
0x0000000100000f2f <main+15>:   mov    eax,DWORD PTR [rbp-0x8]
0x0000000100000f32 <main+18>:   mov    DWORD PTR [rbp-0x4],eax
0x0000000100000f35 <main+21>:   mov    eax,DWORD PTR [rbp-0x4]
0x0000000100000f38 <main+24>:   pop    rbp
0x0000000100000f39 <main+25>:   ret    
End of assembler dump.
  1. почему не установлен rsp (sub rep 0xa)
  2. почему существует присваивание 0 -> [rbp-0x8] -> eax -> [rbp-0x4] -> eax

1 Ответ

2 голосов
/ 24 ноября 2011

почему не установлен rsp (sub rep 0xa)

Поскольку из этой функции нет никакого вызова (это конечная функция), нет необходимости настраивать стек.

почему существует присваивание 0 -> [rbp-0x8] -> eax -> [rbp-0x4] -> eax

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...