Brian Palha Teixeira
1 Arquitetura e Organização de Computadores Linguagem de Montagem e Linguagem de Máquina Givanaldo Rocha de Souza
2 Conceitos básicos Linguagem/código de máquina Instruções que o processador é capaz de executar. Essas instruções, chamadas de código de máquina, são representadas por sequências de bits, normalmente limitadas pelo número de bits do registrador principal (8, 16, 32, 64 ou 128) da CPU.
3 Conceitos básicos Linguagem de montagem ou assembly Notação legível por humanos para o código de máquina que uma arquitetura de computador específica utiliza.
4 Conceitos básicos Tradutor Programas que convertem um programa usuário escrito em alguma linguagem (fonte) para uma outra linguagem (alvo). Montador/Assembler Um tradutor onde a linguagem fonte é a linguagem de montagem e a linguagem alvo é a linguagem de máquina.
5 Conceitos básicos (resumo)
7 Arquitetura Arquitetura de computador: própria linguagem de máquina e linguagem de montagem. Funções de alto nível diferente para cada arquitetura.
8 Elementos de uma instrução Internamente, cada instrução é representada como uma sequência de bits dividida em campos, correspondentes aos elementos de uma instrução.
9 Elementos de uma instrução Cada instrução deve conter toda a informação necessária para que a CPU possa executá-la, ou seja: Código da operação: especifica a operação a ser efetuada. Referência ao operando-fonte: os dados envolvidos na operação devem estar referenciados na instrução. Referência ao operando-destino: deve-se fornecer informações que possibilite o armazenamento do resultado gerado pela instrução. Código da operação Referência ao operando-fonte Referência ao operando-destino
10 Representação de uma instrução Dificuldade do programador lidar com representações binárias de instruções de máquina. Uso de uma representação simbólica: Os códigos de operação são representados por abreviações, chamadas mnemônicos. ADD (adição) SUB (subtração) MPY (multiplicação) Os operandos também são representados de maneira simbólica. ADD AX, BX
11 Programação em Assembly Por que não C ou outra linguagem de alto nível? C é mais simples, mais próxima da linguagem natural (inglês). C é portável, ou seja, um mesmo programa pode rodar em sistemas operacionais diferentes, usando processadores PowerPC ou Intel, por exemplo.
12 Programação em Assembly Por que programar em Assembly? O código em Assembly pode ser mais rápido e menor do que o código gerado por compiladores. Assembly permite o acesso direto a recursos do hardware, o que pode ser difícil em linguagens de alto nível. Programar em Assembly permite que se ganhe um conhecimento profundo de como os computadores funcionam.
13 Programação em Assembly Conclusão Saber programar em Assembly é muito útil mesmo que nunca se programe diretamente nele.
14 O Assembly do Primeiro processador da Intel de 32 bits com recursos modernos: Modo protegido de memória (nas versões antigas, como o 8086 havia o modo real, onde cada programa poderia bagunçar livremente a memória de algum outro). Todos os sistemas operacionais modernos operam rodando sobre o modo protegido. Multitarefa.
15 O Assembly do Novos chips da Intel mantêm compatibilidade: Pentium, Core2Duo, Atom etc. Existem diversas ferramentas que facilitam o desenvolvimento desse tipo de código. NASM (Netwide Assembler) TASM (Turbo Assembler) MASM (Macro Assembler)
16 Registradores do 80386
17 Registradores pré AX = AH AL 16 bits 8 bits 8 bits Também vale para BX, CX e DX
18 Registradores do Registradores de propósito geral uso típico EAX: Registrador acumulador, usado para endereçar E/S, aritmética etc. EBX: Registrador base, usado como ponteiro para acesso à memória e interrupções. ECX: Registrador contador, usado como contador em laços e interrupções. EDX: Registrador de dados, usado para endereçar E/S, aritmética e interrupções.
19 Registradores do Registradores de endereço EIP: Ponteiro de índice, guarda um índice indicando a próxima instrução a ser executada. EBP: Endereço da base da pilha. ESP: Endereço do topo da pilha. EDI: Índice do destino na operação de cópia de strings. ESI: Índice da fonte na operação de cópia de strings.
20 Registradores do Registrador EFLAG Cada um de seus 32 bits controla ou exibe algum estado final ou intermediário de uma operação. Exemplos: Zero flag (6): indica se o resultado de uma operação foi zero. Direction flag (10): usado no processamento de strings, indica quando o processamento deve ser feito do início para fim ou vice-versa. Overflow flag (11): usado por operações aritméticas que podem gerar estouro de pilha (overflow).
21 Registradores do Registrador EFLAG
22 Palavra - word Apesar do ser de 32 bits, o tamanho da sua palavra é 16 bits.
23 Tipos de operandos Registrador: o operando refere-se diretamente ao conteúdo de um registrador da CPU. Memória: refere-se a um dado em memória. Imediato: valores fixos expressos diretamente na instrução. Implicado: valor não mostrado diretamente. Ex: operação de incremento.
24 Instruções básicas mov dest, src copia em dest o conteúdo de src. mov eax, 3; grava 3 no registrador eax mov ebx, eax; grava o conteúdo de eax em ebx add adiciona inteiros. add eax, 4; eax = eax + 4 add ebx, eax; ebx = ebx + eax sub : mesmo formato de add inc : inc eax; eax++ dec : dec eax; eax--
25 Programa básico (MASM) Comentários Inclusão de funções externas Área de dados Área de instruções
26 Prática de laboratório Acessar o site kipirvine.com/asm e clicar no link Getting started with MASM and Visual Studio Seguir o tutorial para executar o primeiro programa em Assembly. Para mais detalhes sobre a programação em Assembly utilizando o MASM, procurar pelo livro de Kip Irvine, Assembly Language for x86 Processors (6th edition). Para mais detalhes sobre a programação em Assembly utilizando o NASM, procurar pelo livro de Paul Carter, PC Assembly Language.
27 Exercícios Faça um programa para carregar dados em EAX e EBX e subtraí-los, deixando o resultado em EAX. Faça um programa para carregar dados em EAX e EBX e somálos, deixando o resultado em EBX. Faça um programa para carregar dados quaisquer nos quatro registradores de uso geral e exiba o conteúdo deles na tela. Faça um programa para retornar se um número é par ou ímpar. Em um primeiro momento, armazene esse número direto em AX. Em um próximo passo, entre com esse número pelo teclado.