inclusão dos links dos vídeos

This commit is contained in:
Blau Araujo 2025-06-30 09:33:06 -03:00
parent 8e0a426b32
commit 05d5566979
2 changed files with 118 additions and 5 deletions

View file

@ -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

View file

@ -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