
Tenho interesse em Assembly desde que fiz uma matéria chamada Sistemas Microcontrolados, onde o professor nos deu um overview de como funcionava os registradores, a pilha (stack), e a como trabalhar com eles.
Na universidade sempre ouvimos alguém falar que o assembly é a fronteira final entre o que um humano pode entender e as instruções de maquina, a linguagem em que os drivers eram escritos, e se acaso você quiser algo rápido, deverá recorrer a ela. Lembro de ter me divertido muito, pois parecia que eu estava adentrando a um mundo novo que poucos conheciam, para mim era algo fascinante.
Para testar a veracidade dessas informações recriei dois códigos, um em linguagem C e outro em Assembly com a sintaxe AT&T.
hello.c
#include <stdio.h>
int main(){
printf("Hello World\n");
return 0;
}
Para compilar esse programa em C, use o seguinte comando:
gcc hello.c -o hello_c
Com isso terá gerado um executável com o nome de hello_c.
hello.s
.global _start
.text
_start:
mov $1, %rax # SysCall(sys_write)
mov $1, %rdi #FileDescriptor(stdout)
mov $message, %rsi # Endereco da Mensagem
mov $13, %rdx # Tamanho da Mensagem
syscall # Chamando a Syscall
mov $60, %rax # Syscall (exit)
xor %rdi, %rdi # Retornando 0
syscall # Chamando a Syscall
message:
.ascii "Hello World\n"
Ja para compilar este código em Assembly você terá que digitar:
gcc -c hello.s
Que irá gerar um arquivo de saída hello.o e agora para linkar e virar um executável de vez:
ld hello.o -o hello_s
Os arquivos gerados são esses:
$ ls
hello.c hello_c hello.o hello.s hello_s
Sendo hello_c e hello_s executáveis.
$ ./hello_s
Hello World
$ ./hello_c
Hello World
E se compararmos os seus tamanhos:
$ ls -l
total 28
-rwxrwxr-x 1 michel michel 16696 fev 19 22:45 hello_c
-rwxrwxr-x 1 michel michel 4744 fev 19 23:00 hello_s
| Linguagem | Tamanho |
|---|---|
| hello.c | 16696 bits |
| hello.s | 4744 bits |
Ou seja o arquivo em Assembly é quase 4 vezes menor do que o arquivo compilado em C.
Referências:
[1] – https://pt.wikipedia.org/wiki/Linguagem_de_montagem_x86
[2] – https://www.cs.virginia.edu/~evans/cs216/guides/x86.html
[3] – http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html
[4] – https://montcs.bloomu.edu/Information/LowLevel/Assembly/asm-C.html#trivial
[5] – https://web.archive.org/web/20101010150001/http://code.google.com/p/bugsec/wiki/AssemblyArqComp
[6] – http://programminggroundup.blogspot.com/2007/01/chapter-3-your-first-programs.html
[7] – https://coolerlab.wordpress.com/2012/04/07/um-pouco-de-assembly-com-linguagem-c/