Você está na página 1de 11

PRIMEIRO PROGRAMA EM ASSEMBLY

PEDRO BOTELHO - ENGENHARIA DE COMPUTAÇÃO

Engenharia de Computação - UFC


Monitoria de Arquitetura de Computadores
ASSEMLBER NASM
• Assembly → Instruções do Processador
• Baixo nível de abstração
• Controle de Hardware
• Equivalência de quase 1 para 1 com Código de Máquina Numérico
• Assembler → Converter código Assembly em Opcodes
• Por que o nome “Assembly”?
• Deriva de “Assembler” → “Um programa que monta outro programa
que consiste em diversas partes em um único programa.”
• O Assembler NASM → Netwide Assembler
• Suporta x86 e x86-64
• Windoes e Linux
• Sintaxe Descomplicada e Simplificada

Pedro Botelho
Engenharia de Computação - UFC
INSTRUÇÕES
• Operações Executadas pela CPU
• Instrução → “Algo que a CPU saiba realizar”
• Ex: Movimentar um dados na memória Exemplo: Instruções x86
• Instruções Manipulam:
• Unidade Lógico-Aritmética MOV EAX, 1
• Unidade de Controle MOV EBX, 2
• Interrupções ADD EAX, EBX
• Coprocessadores
• Cada Arquitetura tem um Conjunto de Instruções (ISA)
• Dois tipos de Designs:
• Conjunto Complexo de Instruções (CISC)
• Design Original
• Instruções levam vários ciclos de clock
• Exemplos: x86, x86-64, MCS-51
• Conjunto Reduzido de Instruções (RISC)
• Redesign do CISC
• Instruções levam apenas um ciclo de clock
• Exemplos: ARM, AVR, PIC
• Maioria das famílias de microcontroladores
• Cenário Atual → CISC incorporando RISC
Pedro Botelho
Engenharia de Computação - UFC
INSTRUÇÕES EM ASSEMBLY

• Ideias Centrais:
• Mnemônicos ao invés de Opcodes → Facilitar a programação
• 0xB803000000 → MOV EAX, 3
• 0x41 → INC ECX
• Baixo Nível de Abstração → Visão próxima do hardware
• Mova o valor do acumulador para o endereço 50 da memória
• Assembly → MOV [0x50], EAX
• Para comparação → Alto Nível de Abstração
• Visão distante do hardware
• Visão abstraída da memória
• C → posicao_memoria = valor;
• Formato de uma instrução mnemônica:
• Mnemônico simbolizando a instrução
• Operando(s)
• Dois
• Um
• Nenhum
• Como funciona?
• Assembly → MOV destino, origem
• C → destino = origem;
Pedro Botelho
Engenharia de Computação - UFC
INSTRUÇÕES BÁSICAS

• Texto Mnemônico →Técnicas e estratégias usadas lembrar de algo


• Nomes memorizáveis
• Possível descobrir sua função pelo nome
• Exemplos de Instruções x86:
• MOV → Move
• Instrução de Movimentação → MOV destino, origem
• Em C → destino = origem;
• ADD → Add
• Instrução de Adição → ADD destino, origem
• Em C → destino = destino + origem;
• SUB → Subtract
• Instrução de Subtração → SUB destino, origem
• Em C → destino = destino - origem;
• RET → Return
• Instrução de Retorno → RET
• Em C → return valor_de_retorno
• Retorna de uma Função
• Presume-se que o valor de retorno está em EAX

Pedro Botelho
Engenharia de Computação - UFC
EQUIVALÊNCIAS BÁSICAS

• Vamos verificar as equivalências entre C e Assembly

Pedro Botelho
Engenharia de Computação - UFC
EQUIVALÊNCIAS BÁSICAS
• Valores na memória:
• Alto nível de abstração → int num1 = 3;
• Baixo nível de abstração → num1 DD 3
• Reserve 4 bytes de memória
• A esse espaço reservado atribua o valor 3
• Soma:
• Alto nível de abstração → res = num1 + num2;
• Baixo nível de abstração → ADD EAX, EBX
• Observe que uma operação em alto nível pode ser convertida em
várias instruções em baixo nível
• Instruções em Assembly x86 tem limite de operandos
• Logo programas em Assembly são mais complexos
• Função principal:
• Alto nível de abstração → int main(){ … }
• Baixo nível de abstração → main: ...
• Retorno da função principal:
• Alto nível de abstração → return 0;
• Baixo nível de abstração → RET
Pedro Botelho
Engenharia de Computação - UFC
SEÇÕES DO CÓDIGO

• Memória Real é endereçada como memória virtual


• Memória virtual é dividida em espaços de
endereçamento
• Cada espaço de endereçamento é
dividido em partes chamadas de
segmentos
• Um programa em Assembly é
dividido em três seções:
• SECTION .data
• Dados inicializados
• SECTION .bss
• Dados não inicializados
• Conteúdo deve ser preenchido
• SECTION .text
• Onde fica o código
• Começa com a declaração da função main
• Mostra ao kernel onde começa o programa

Pedro Botelho
Engenharia de Computação - UFC
SEÇÃO DE TEXTO

• Retorno da função principal


• Instrução RET → Retorna da função com o valor de EAX
• Retorna 0 para quem chamou a função main
• Termina o programa sem erros

Pedro Botelho
Engenharia de Computação - UFC
SEÇÃO DE DADOS INICIALIZADOS
• Define um espaço na memória a uma variável
• Valor Pré-estabelecido
• Para armazenar valores na memória principal é preciso:
• Etiqueta
• Tamanho do dado
• Valor a ser armazenado
• Para definir um valor na memória:
• Pseudo-Instrução DX → Define X
• Onde X é o tamanho do dado
• Ex: Define Word → DW

Pedro Botelho
Engenharia de Computação - UFC
CONCLUSÃO

• Por que usar registradores como intermediários?


• ADD [num1], [num2] → Operação Inválida
• Memória RAM só tem dois estados exclusivos
• Leitura ou Escrita
• Registrador → Armazenamento temporário para trocar de
estado
• Solução → MOV EAX, [num1], ADD EAX, [num2]
• Ferramentas Necessárias
• NASM
• IDE SASM
• GCC ou MinGW-64
• GCC-Multilib
• Conhecer as características gerais da arquitetura
• Saber fundamentos de programação
• Entender o funcionamento da pilha

Pedro Botelho
Engenharia de Computação - UFC

Você também pode gostar