“Hello World” em C e Assembly

Resultado de imagem para assembly

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

LinguagemTamanho
hello.c16696 bits
hello.s4744 bits
Tabela 1 – Comparação de tamanho entre os arquivo.

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/