From 05d55669798ee16abc97e32afa3b49d688e4c627 Mon Sep 17 00:00:00 2001 From: Blau Araujo Date: Mon, 30 Jun 2025 09:33:06 -0300 Subject: [PATCH] =?UTF-8?q?inclus=C3=A3o=20dos=20links=20dos=20v=C3=ADdeos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- curso/README.org | 5 +- curso/aula-00.org | 118 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 118 insertions(+), 5 deletions(-) diff --git a/curso/README.org b/curso/README.org index 8957f5c..1dd54dc 100644 --- a/curso/README.org +++ b/curso/README.org @@ -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 diff --git a/curso/aula-00.org b/curso/aula-00.org index 53431e9..113dc45 100644 --- a/curso/aula-00.org +++ b/curso/aula-00.org @@ -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