Além de aprender montagem, acredito que aprender como uma linguagem de baixo nível como C é compilada é altamente valioso. Então, minha resposta é sim, mas, novamente, provavelmente sou tendenciosa porque gosto de programação de baixo nível.
Por exemplo, apenas entendendo como instruções simples são compiladas. A seguinte função,
int func(int val)
{
int num = val * 5;
return num;
}
... torna-se (pelo menos um pouco interessante):
movl %edi, -20(%rbp)
movl -20(%rbp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
Esse código pega o argumento da pilha (val, o parâmetro para func), move-o para a esquerda 2 lugares (multiplique por 2 ^ 2 ou 4) e depois adiciona o valor original ao resultado. O resultado final é uma multiplicação por 5. Um exemplo como esse ilustra uma série de coisas a serem observadas, como otimizações do compilador. Em vez de chamar uma instrução para multiplicar diretamente por 5, ela muda dois lugares para multiplicar por 4 e adiciona o valor original. Encontrei exemplos como esse para melhorar muito minha compreensão das coisas em um nível inferior.
Gere a saída do assembler do gcc com a -S
opção No entanto, esteja ciente de que os resultados variam de acordo com o compilador e o nível de otimização.
De qualquer forma, eu não acho que ser um programador de linguagem assembly é o mesmo que entender assembly . Novamente, sinto que programar em uma linguagem como C e saber como isso é inserido no código de máquina é uma prática valiosa.