Assembly e C: qual é a diferença?
Assembly e C permitem escrever programas, mas mostram o computador em níveis diferentes. Não é uma competição: cada linguagem facilita determinados tipos de trabalho.

Uma operação em C
Em C, você pode escrever uma expressão como total = 5 + 3;. A linguagem oferece variáveis, tipos de dados e estruturas para organizar tarefas sem escolher, a cada linha, um registrador físico.
Um compilador transforma o programa em instruções para uma arquitetura. Ele pode otimizar a expressão e guardar diretamente o valor 8, em vez de emitir uma soma. Por isso, uma linha de C não corresponde sempre a uma única instrução de máquina.
O mesmo raciocínio em Assembly
mov rax, 5 ; guarda 5 add rax, 3 ; calcula 5 + 3
Aqui escolhemos explicitamente o registrador RAX e descrevemos a soma. É um trecho didático: não inclui a entrada de um programa nem uma maneira de encerrá-lo. O resultado esperado, pelo significado das instruções, é 8 em RAX.
Portabilidade não é automática
Um programa em C pode ser recompilado para arquiteturas diferentes quando seu código e suas dependências são compatíveis. Isso não significa que todo programa C funciona em qualquer máquina sem ajustes.
Assembly expõe os registradores e as instruções da arquitetura. Um trecho x86-64 normalmente precisa ser reescrito para ARM. Até na mesma arquitetura, chamadas ao sistema podem mudar entre Linux e Windows.
Por que estudar os dois?
C ajuda a construir programas com abstrações; Assembly ajuda a enxergar o trabalho feito em um nível mais próximo do processador. Esse entendimento é útil para ler código compilado, estudar sistemas e compreender limites da representação de dados.
Você não precisa aprender C antes de começar aqui. Primeiro, entenda o que é Assembly e depois acompanhe as primeiras instruções.