inclusão dos links dos vídeos
This commit is contained in:
parent
8e0a426b32
commit
05d5566979
2 changed files with 118 additions and 5 deletions
|
@ -6,7 +6,10 @@
|
|||
|
||||
* 0 -- Introdução à linguagem Assembly (NASM)
|
||||
|
||||
[[./aula-00.org][Texto]] | [[#][Vídeo]]
|
||||
- [[./aula-00.org][Texto]]
|
||||
- Vídeos:
|
||||
- [[https://youtu.be/NsFUbSoz12c][Sobre o curso]]
|
||||
- [[https://youtu.be/LUuNAMezDOM][O que é Assembly]]
|
||||
|
||||
- O que é Assembly
|
||||
- Linguagem dependente da arquitetura
|
||||
|
|
|
@ -4,6 +4,11 @@
|
|||
|
||||
#+options: toc:3
|
||||
|
||||
*Vídeos relacionados:*
|
||||
|
||||
- [[https://youtu.be/NsFUbSoz12c][Sobre o curso]]
|
||||
- [[https://youtu.be/LUuNAMezDOM][O que é Assembly]]
|
||||
|
||||
* Objetivos
|
||||
|
||||
- Apresentar as características e os elementos básicos da linguagem Assembly.
|
||||
|
@ -12,6 +17,110 @@
|
|||
- Aprender as instruções e diretivas essenciais para começar a programar.
|
||||
- Criar executar um primeiro programa em Assembly.
|
||||
|
||||
* Máquina de Turing
|
||||
|
||||
No começo do século 20, surge uma questão no campo da matemática: até onde
|
||||
seria possível solucionar problemas seguindo estritamente um conjunto de
|
||||
regras fixas estabelecidas em um /algoritmo/?
|
||||
|
||||
#+begin_quote
|
||||
*Nota:* em matemática, /algoritmos/ são sequências finitas de ações executáveis
|
||||
que visam obter soluções para determinados tipos de problema.
|
||||
#+end_quote
|
||||
|
||||
Nos anos 1930, o matemático Alan Turing estava trabalhando em um problema de
|
||||
lógica formal (campo que estuda a estrutura de enunciados e suas regras). Como
|
||||
parte do que estava tentando demonstrar, ele precisava encontrar uma forma
|
||||
geral para descrever como algoritmos poderiam ser implementados e executados
|
||||
mecanicamente.
|
||||
|
||||
A partir disso, ele formulou o conceito matemático de uma máquina abstrata que
|
||||
manipularia automaticamente os símbolos em uma fita de acordo com uma tabela
|
||||
de regras: a sua /a-machine/ (de /"automatic machine"/), mais tarde chamada de
|
||||
/Máquina de Turing/ por seu orientador de doutorado -- termo que utilizamos
|
||||
até hoje.
|
||||
|
||||
Então, a Máquina de Turing é um modelo matemático que descreve um dispositivo
|
||||
muito simples que seria capaz de expressar computações arbitrárias e, com
|
||||
isso, explorar as propriedades e as limitações da computação mecânica.
|
||||
|
||||
#+begin_quote
|
||||
*Nota:* /modelos matemáticos computacionais/ são modelos que descrevem como a
|
||||
saída de uma função matemática é computada a partir de uma dada entrada.
|
||||
#+end_quote
|
||||
|
||||
Turing descreveu a imagem física de sua máquina como consistindo de...
|
||||
|
||||
- Uma fita dividida em células contendo símbolos ou espaços vazios;
|
||||
- Um cabeçote para ler e escrever símbolos na fita;
|
||||
- Um registrador de estados, para armazenar o estado corrente de um conjunto
|
||||
finito de estados possíveis;
|
||||
- Uma tabela de instruções que, dado o estado atual e o que estiver sendo
|
||||
lido na fita, diz à máquina o que fazer na sequência.
|
||||
|
||||
Por exemplo:
|
||||
|
||||
#+begin_example
|
||||
Estado atual: q1
|
||||
|
||||
Fita:
|
||||
┌───┬───┬───┬───┬───┬───┬───┐
|
||||
│ ␣ │ 1 │ 1 │ 0 │ ␣ │ ␣ │ ␣ │
|
||||
...└───┴───┴───┴───┴───┴───┴───┘...
|
||||
↑
|
||||
Cabeçote
|
||||
|
||||
Regra:
|
||||
Se (q1, 0) -> escreva 1, mova para a direita, mude estado para q2
|
||||
#+end_example
|
||||
|
||||
*Ilustração moderna:* [[https://www.youtube.com/watch?v=E3keLeMwfHY][vídeo de Mike Davey]]
|
||||
|
||||
Esse modelo simples, apesar de abstrato, revelou-se poderoso o suficiente para
|
||||
representar qualquer cálculo que possa ser feito por um algoritmo. Contudo,
|
||||
a computação sequencial das células de uma fita é lenta demais para aplicações
|
||||
práticas modernas. Mesmo assim, a máquina que Turing descreveu tornou-se uma
|
||||
das principais inspirações para a construção das /unidades de processamento/,
|
||||
utilizadas nos computadores até os nossos dias.
|
||||
|
||||
** Uma longa fita de bits
|
||||
|
||||
Na computação moderna, os nossos programas ainda podem ser vistos como uma
|
||||
fita contendo uma longa sequência de bits (valores binários =0= e =1=). Mas,
|
||||
diferente da máquina de Turing:
|
||||
|
||||
- Os bits são armazenados na memória principal do computador, onde podem ser
|
||||
acessados de forma aleatória e quase instantânea;
|
||||
- Em vez de símbolos individuais por célula e uma tabela de estados, os bits
|
||||
são interpretados em blocos de tamanho fixo, expressando as instruções
|
||||
que a CPU deve executar e os dados envolvidos nessas operações;
|
||||
- A tabela de estados agora está incorporada nos processadores na forma de
|
||||
um conjunto fixo de instruções específico de cada CPU, conhecido como ISA
|
||||
(/Instruction Set Architecture/).
|
||||
|
||||
Portanto, /escrever um programa/ significa, em essência, representar, nessa
|
||||
longa fita de bits, os códigos relativos aos dados e instruções que uma
|
||||
máquina em particular será capaz de interpretar e executar. Isso é o que
|
||||
chamamos de /código de máquina/ (ou, popularmente, /linguagem de máquina/) e,
|
||||
em vários momentos da história da computação, os programas foram escritos
|
||||
desta forma.
|
||||
|
||||
Obviamente, escrever diretamente o código de máquina é um processo demorado,
|
||||
tedioso e propenso a erros. Por isso, já nos anos 1950, começaram a ser
|
||||
criados programas dedicados à tradução de representações simbólicas de
|
||||
instruções para as representações binárias do código de máquina. Na prática,
|
||||
o que esses programas fazem é utilizar as representações simbólicas como um
|
||||
"manual de instruções" para montar o código de máquina correspondente -- daí
|
||||
serem chamados de /montadores/ (ou /assemblers/, em inglês).
|
||||
|
||||
Vale observar que, inicialmente, essas representações simbólicas não eram
|
||||
escritas em arquivos de texto como fazemos hoje. Em geral, os códigos das
|
||||
instruções e dados eram registrados fisicamente, em fitas ou cartões
|
||||
perfurados, que depois eram lidos por máquinas. Assim, uma /linguagem de
|
||||
montagem/ (/assembly language/) já existia, mas ainda se passava por uma longa
|
||||
fase onde o processo de escrita de programas era manual e bastante sujeito
|
||||
a erros mecânicos e operacionais.
|
||||
|
||||
* O que é Assembly
|
||||
|
||||
Assembly é uma linguagem de programação que oferece formas de representar, em
|
||||
|
@ -162,7 +271,7 @@ quantos bytes quisermos, em qualquer endereço, desde que tenhamos permissão
|
|||
do sistema.
|
||||
#+end_quote
|
||||
|
||||
** Por que aprender Assembly?
|
||||
* Por que aprender Assembly?
|
||||
|
||||
*** Entendimento do funcionamento de computadores
|
||||
|
||||
|
@ -738,7 +847,7 @@ imul destino, origem (resultado em destino)
|
|||
imul destino, origem, imediato (resultado em destino)
|
||||
#+end_example
|
||||
|
||||
- Multiplica =origem= pelo valor de =imediato= e armazena o resultado em =origem=.
|
||||
- Multiplica =origem= pelo valor de =imediato= e armazena o resultado em =destino=.
|
||||
- Se o resultado exceder a capacidade de =destino=, apenas os bytes mais
|
||||
baixos serão armazenados (não há extensão de registradores).
|
||||
- Afeta as flags =CF= e =OF= no caso de estouro da capacidade de =destino=.
|
||||
|
@ -1249,19 +1358,20 @@ instalados no seu sistema:
|
|||
|
||||
- Um editor de código da sua preferência (Vim, Emacs, Geany, etc)
|
||||
- =git=
|
||||
- =nasm=
|
||||
- =nasm= e =ndisasm=
|
||||
- =gcc=
|
||||
- =as=
|
||||
- =ld=
|
||||
- =gdb=
|
||||
- =readelf=
|
||||
- =objdump=
|
||||
- =objcopy=
|
||||
- =nm=
|
||||
- =ldd=
|
||||
- =hexedit=
|
||||
- =xxd= (geralmente instalado com o editor Vim)
|
||||
|
||||
No Debian, a maioria deles é instalada com os comandos:
|
||||
No Debian e derivados, a maioria deles é instalada com os comandos:
|
||||
|
||||
#+begin_example
|
||||
sudo apt update
|
||||
|
|
Loading…
Add table
Reference in a new issue