Assembly

[with GIFs]

Hi!

  • Computer Engineer
  • Programming
  • Electronics
  • Math <3 <3
  • Physics
  • Lego
  • Meetups
  • Animals
  • Coffee
  • GIFs

#HumanisingScience #EuRuKo @hannelita

Por que Assembly?

  • Web Dev muitas vezes utiliza tempo no alto nível
  • E o nível mais baixo?
  • O que vem abaixo de C?
  • Escovar bits
  • É legal!
  • Curiosidade

Por que Assembly?

  • Desafios de lógica
  • Poder sobre o hardware
  • É possível ver mais afundo a ligação entre hardware e software
  • Queria aprender de forma prazerosa (aprendi de forma traumática)

O que os computadores entendem?

111000011000101010101010110000001111000011100001110000011111100000

Precisamos de uma forma mais eficaz de nos comunicarmos com as máquinas

Linguagem mais concisa

Assembly

Depois algum mecanismo transforma essa linguagem em 1 e 0

Assembler

O desafio

Construir uma linguagem que represente o fluxo de dados num hardware

Pergunta: A estrutura de todas as CPUs são iguais?

Existem algumas diferenças estruturais

Logo, existem variações no Assembly

E no Assembler

É como se fossem dialetos

Os primórdios

Motorola 6800

1975

De volta a imagem

Como forneço um dado para a CPU?

Registradores

Insira seus binários aqui

Acumulador A

A

É possível escrever e ler

Qual o tamanho desses registradores?

Variam com a arquitetura

LDAA #0h

ADDA #1h

A == #1h

Quantos registradores eu tenho?

Depende do processador :)

No 6800, temos um registrador similar ao A. (chutem o nome)

A

B

Faça um programa que

  • Carregue #0h no A
  • Some #1h no A
  • Carregue #1h no B
  • Some A e B

Faça um programa que

  • LDAA #0h
  • ADDA #1h
  • LDAB #1h
  • ABA

Perguntas

  • Qual o valor inicial de A e B?
  • Quando realizo o ADDA, pra onde vai o resultado?
  • Como o programa sabe qual a próxima instrução a ser executada?
  • Posso manipular livremente o conteúdo de todos os registradores?
  • O que é esse #?
  • Posso manipular apenas hexadecimais?
  • Como faz pra números sinalizados?
  • E se a resposta fosse maior que 8 bits? 

Qual o valor inicial de A e B?

Não sabemos! Por isso precisa zerar. ADDA sem zerar não possui resultado determinado.

  • Quando realizo o ADDA, pra onde vai o resultado?

Para A. Os resultados de operações costumam ir para A.

Quer dizer que A é mutável?

Sim.

Então perco o valor inicial de A após a operação?

Sim.

Vish.

Sim.

  • Como o programa sabe qual a próxima instrução a ser executada?

Existe (para quase todos os Assembly) um registrador especial que aponta para a próxima instrução, chamado Program Counter (PC). No início dos programas, ele aponta para zero/qualquer valor inicial estabelecido. A primeira instrução começa lá.

Então as instruções estão em memória? 

Sim

  • Posso manipular livremente o conteúdo de todos os registradores?

Nem todos. Há alguns que só vão aceitar outros endereços de memória como parâmetros. Há também os que não suportam nenhum tipo de operação, a não ser transferir ender

Então eu posso passar um endereço para A? 

Sim.

  • O que é esse #?

# faz menção ao que chamamos de *Modo de endereçamento*. # pede para o número 0h (0 hexadecimal) ser carregado em A.

E se eu tirar o #? Dá pau?

Não sintaticamente. Mas se tirar o #, ele vai carregar o que estiver na posição 0h de memória

  • Ainda sobre esse #

Ah! E sem o # temos outro modo de endereçamento?

Sim! Chama-se endereçamento por offset ou deslocamento. Com o #, temos o chamado 'endereçamento imediato'

  • Posso manipular apenas hexadecimais?

Não. Você pode passar decimais, binários. Mas o hexadecimal é o mais comum.

  • Como faz pra números sinalizados?

Geralmente o bit da esquerda ('bit mais significativo) representa o sinal. Por exemplo:

10000001 pode ser 129 ou -1

Legal, quem determina isso?

Você e o contexto do programa.

  • E se a resposta fosse maior que 8 bits? 

( ͡° ͜ʖ ͡°)

Sobre as duas últimas perguntas, sinal e overflow

Existe um registrador que guarda informações relacionadas

Flag status

cada Assembly tem o seu

Flag status

  • Carry, Parity, Zero, Sign, Overflow
  • Cada bit desse registrador é uma flag
  • Se é negativo, olhar bit de sinal
  • Se deu overflow, olhar carry bit e overflow bit

ᕕ( ᐛ )ᕗ

Como carregar e manipular números maiores que 8 bits?

Alternativas

  • Compre um novo processador
  • 16 bits = 8 bits + 8 bits - carregue da memória (endereçamento por offset)

Exemplo no quadro

Outras discussões

Microprocessador vs Microcontrolador

Little Endian vs Big Endian

Sobre os conjuntos de instruções

CISC vs RISC

Divisão, exponenciação, números de 64 bits

Interrupções

Subrotinas

Referências e Créditos

  • The Art of Assembly Language - https://www.google.com.br/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=the%20art%20of%20assembly%20language
  • 6800 Datasheet https://www.google.com.br/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&sqi=2&ved=0ahUKEwjJ4o-I9Z_JAhUPoJAKHddnCR4QFggbMAA&url=http%3A%2F%2Fwww.alldatasheet.com%2Fdatasheet-pdf%2Fpdf%2F82499%2FMOTOROLA%2F6800.html&usg=AFQjCNHlHGHqAku94dRheH4D54TJGThB5Q&sig2=8Wjc2cj5qgpsXDnNl-pZsQ&bvm=bv.108194040,d.Y2I
  • 8080 Datasheet - https://www.google.com.br/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwik28uU9Z_JAhWMJZAKHUwjBEUQFggbMAA&url=http%3A%2F%2Fwww.classiccmp.org%2Fdunfield%2Fr%2F8080.pdf&usg=AFQjCNGGh1mD44t46DDmwf9HPU97tOPBXg&sig2=MlHb7oVwf1D5ekDQtMDrcg&bvm=bv.108194040,d.Y2I
  • GIFs by @lafp

Thank you :)

Questions?

 

hannelita@gmail.com

@hannelita