Git Product home page Git Product logo

livro-assembly-x86's Introduction

description
Explicação do porque aprender Assembly é útil

Introdução

{% hint style="info" %} Se você está lendo isto no repositório do GitHub, recomendo que leia na plataforma do GitBook clicando aqui. {% endhint %}

Sempre recebi muitas perguntas do tipo "como aprender Assembly?". Já faz um tempo que tenho em mente a ideia de produzir um conteúdo que sirva de introdução neste mundo.
Porém a ideia aqui não é servir apenas para ensinar a fazer um "Hello World" e te deixar sem entender coisa alguma do que está fazendo.
Vamos abordar parte por parte dos conceitos da linguagem Assembly até entendê-la completamente, e para isso, vamos inclusive ver um pouco de código de máquina da arquitetura x86.

Por que aprender Assembly?

Se você quer aprender Assembly achando que vai conseguir fazer programas mais rápidos diretamente em Assembly, saiba que está enganado. Os algoritmos de otimização dos compiladores de hoje em dia tem uma eficiência impressionante a ponto de superar as habilidades humanas. Ou seja, é muito mais eficiente escrever um código em C, por exemplo, do que diretamente em Assembly. Claro que ainda é possível fazer código mais eficiente diretamente em Assembly, porém apenas em casos específicos e se você tiver bastante experiência. Ou seja é mais interessante usar Assembly em conjunto com C do que fazer todo o software em Assembly.
Aprender Assembly nos dias atuais tem sim utilidade e irei listar algumas:

  1. Engenharia Reversa (de softwares) Entender como um software funciona na prática só é de fato possível se você souber Assembly. Usar decompiler até funciona em parte, mas não pense que isso tem grandes utilidades o tempo todo.
  2. Exploração de binários Para quem quer fazer testes de segurança em binários, Assembly é indispensável.
  3. Otimização de código Sim, como eu já disse é mais eficiente não escrever o código diretamente em Assembly. Porém saber Assembly e usar esse conhecimento para estudar o código de saída de um compilador de uma determinada linguagem (GCC por exemplo) vai te fazer aprender muita coisa sobre o código resultante. Esse conhecimento vai te ajudar e muito a fazer códigos mais eficientes nesta linguagem. Isto é claro, é especialmente útil em linguagens que te permitem prever o código de saída. (volto a repetir C como exemplo)
  4. Otimização de código² Também dá para fazer otimizações de código para processadores específicos manualmente. Podemos ver vários exemplos desta façanha no famigerado ffmpeg, veja aqui.
  5. Tarefas de "baixo nível" Algumas instruções específicas de determinados processadores são basicamente impossíveis de serem utilizadas em uma linguagem de alto nível. Uma tarefa básica em Assembly, como chamar uma interrupção de software, é impossível de ser feita em uma linguagem de alto nível como C.
  6. C & Assembly Termino falando que há uma incrível vantagem de se saber Assembly quando se programa em C. Não só pelo inline Assembly mas também pela previsibilidade do código, que eu já mencionei. (você vai entender o que é isso se continuar lendo o livro)

Como podemos ver o conhecimento da linguagem Assembly nos dias atuais é mais útil do que a utilização dela em si.

O que é Assembly?

Caso ainda não saiba, cada arquitetura de computador tem sua própria linguagem ASM (Assembly). A que nós estudaremos aqui é da arquitetura x86.
Já escrevi um artigo no Medium explicando de fato o que é a linguagem Assembly e o porque de cada arquitetura ter um ASM diferente.
Para não repetir o conteúdo vou apenas deixar o link do artigo:

É muito importante a leitura deste artigo mesmo que você acredite já saber o que é Assembly. É um texto curto, não tem porque evitá-lo. E como eu disse no início do artigo:

Saber o que é Assembly e entender o que é Assembly são duas coisas diferentes.

{% hint style="info" %} Apesar de eu estar utilizando letra maiúscula para escrever a palavra "Assembly", ela na verdade não é um substantivo próprio mas sim a palavra "montagem" em inglês.
Estou fazendo isso meramente por uma estilização pessoal. {% endhint %}

O que é assembler?

O assembler é o software encarregado de converter o código em Assembly para o código de máquina. Muito antigamente, nos primórdios da computação, uma pessoa manualmente convertia os códigos em Assembly para código de máquina. Depois inventaram uma máquina para automatizar esta tarefa, sendo chamada de "assembler". Somente nos dias atuais que o "assembler" é um software de computador.
Geralmente o processo de converter Assembly para código de máquina é chamado de "montar", ou seja, o assembler "monta" o código.

{% hint style="warning" %} É muito comum as pessoas se confundirem e dizerem "linguagem assembler", o que está errado. Cuidado para não se confundir também. {% endhint %}

O autor

Meu nome é Luiz Felipe. Pronto, agora você sabe tudo sobre mim.

Licença

Este conteúdo está sendo compartilhado sobre os termos da licença CC BY-SA 3.0 e é totalmente de minha autoria.
Esta licença permite que você compartilhe o conteúdo, mesmo que para fins lucrativos, desde que seja compartilhado sob os termos da mesma licença e sem adicionar novas restrições. Como também é necessário que me dê os créditos pelo trabalho original.

Quando for me dar os créditos, basta citar meu nome e deixar o link para o meu Facebook e/ou GitHub.
Outra opção é que deixe um link para este material original além de citar meu nome.

Para mais detalhes da licença, pode consultar no link abaixo:

livro-assembly-x86's People

Contributors

silva97 avatar iaurg avatar

Stargazers

Amir avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.