Introdução ao Assembly

Documentos relacionados
Programando em Assembly

A arquitectura IA32. A arquitectura de um processador é caracterizada pelo conjunto de atributos que são visíveis ao programador.

Estrutura do tema ISA do IA-32

Fluxo de Execução em Assembly

Estruturas de controlo do C if-else statement

Linguagem de Montagem Assembly

Assembly do IA-32 em ambiente Linux

A linguagem ASSEMBLY

Ordem de Bytes: Big Endian e Little Endian

Linguagem de Montagem e Assembly. André Luiz da Costa Carvalho

Arquitetura e Organização de Computadores

Interrupções, Exceções e Chamadas ao SO

Sistemas de Computação

Computadores e Programação (MAB-353) Primeira Prova -Prof. Paulo Aguiar (DCC/UFRJ) 19/05/ pontos

Sistemas de Computação para Controle e Automação CIC132. Assembly. Assembly. Notas. Décima quarta aula: Introdução a programação Assembly

Unidade Central de Processamento 2. Registradores

Prof. Adilson Gonzaga

Representação de Dados (inteiros não negativos)

Instruções. Maicon A. Sartin

PARTE II - CONJUNTO DE INSTRUÇÕES ARQUITETURA DE COMPUTADORES ANTONIO RAMOS DE CARVALHO JÚNIOR

Arquitetura e Organização de Computadores

Conjunto de Instruções (ISA) I

Aula 4 Conjunto de Instruções do Microprocessador 8085 Grupo Aritmético

William Stallings Arquitetura e Organização de Computadores 8 a Edição

Introdução aos Sistemas Computacionais 2008/09

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

Programação ao nível da máquina. Operações lógicas e aritméticas

Arquitetura de Computadores. Conjunto de Instruções

7. PROGRAMANDO O MICROCONTROLADOR. Microcontroladores - Prof: Demantova

Microprocessadores I ELE Aula 7 Conjunto de Instruções do Microprocessador 8085 Desvios

Organização e Arquitetura de Computadores I

Arquitetura de Computadores. Prof. João Bosco Jr.

Ministério da Educação UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ. Aula 2. Cibele Lemos Freire Viginoski

Programação de Microprocessadores. Programação de Microprocessadores SEL-433 APLICAÇÕES DE MICROPROCESSADORES I

Arquitectura de Computadores 2007/2008 2º Semestre 1º Teste (A) - 30/04/2008. Folha de Respostas

ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES I

Prova de Arquitectura de Computadores (21010) Data: 18 de Junho de 2010

Programação de Computadores IV. Introdução a Linguagens de Programação Simone Martins SLIDES CEDIDOS POR BRUNO MARQUES 1

T1: T2: T3: T4: T5: T6: T7: T: P: TEÓRICA

Neander - características

As 5 partes fundamentais. Linguagem de Programação Pinagem Características Elétricas Ambiente de Desenvolvimento Integrado - IDE

Microcontrolador Assembly UTFPR / DAELN Microcontroladores 1 Prof. Gabriel Kovalhuk

MÓDULO. Conjunto de Instruções do 8086/88 Aritméticas, lógicas, deslocamento e rotação M 02

William Stallings Arquitetura e Organização de Computadores 8 a Edição

Introdução ao PIC. Guilherme Luiz Moritz 1. 6 de novembro de DAELT - Universidade Tecnológica Federal do Paraná

Linguagens de Programação Classificação

CPU. CPU Unidade Central de Processamento. Função: leitura, escrita e processamento de dados

CONJUNTO DE INSTRUÇÕES

Conjunto de Instruções (ISA) II

Nível do Conjunto de Instruções Prof. Edson Pedro Ferlin

CONJUNTO DE INSTRUÇÕES DE UM PROCESSADOR (UCP)

7. A pilha e subrotinas

Sistemas de Microprocessadores I Lista de exercícios (questões de provas de semestre anteriores)

Arquitectura e Organização de Computadores

Grupo I (5 valores) CD AB

Sistemas Processadores e Periféricos Aula 2 - Revisão

Arquitetura e Organização de Computadores

Microprocessadores. Arquitectura Geral de Microprocessador

Prova de Arquitectura de Computadores (21010) Data: 12 de Fevereiro de 2010

Arquitetura e Organização de Computadores

Testando o Teorema de De Morgan

Organização de computadores. Aula 05

Nível da Arquitetura do Conjunto das Instruções

MATA49 Programação de Software Básico

Transcrição:

Introdução ao Assembly Movimentação de Dados Operações Aritméticas e Lógicas Noemi Rodriguez Ana Lúcia de Moura http://www.inf.puc-rio.br/~inf1018

Representação de Programas O compilador gera o código de um programa conforme o conjunto de instruções da máquina alvo as regras estabelecidas pela linguagem de programação (C) as convenções seguidas pelo sistema operacional

Visão do Programador Assembly CPU registradores A L U endereços dados Memória código dados instruções FLAGS RIP pilha (stack) RIP: endereço da próxima instrução Registradores: valores inteiros, endereços FLAGS: status da última operação overflow? zero? resultado < 0?

Linguagem de Montagem Instruções executam operações simples operações aritméticas/lógicas transferência de dados controle do fluxo de execução (desvios, chamadas de função)

Linguagem de Montagem Instruções executam operações simples operações aritméticas/lógicas transferência de dados controle do fluxo de execução (desvios, chamadas de função) Tipos de dados básicos valores inteiros (1,2,4,8 bytes) endereços de memória valores em ponto flutuante

Programa em assembly dados globais código labels.data nums:.int 10, -21, -30, 45.text.globl main main: movl $0, %ebx /* i */ movq $nums, %r12 /* p */ L1: cmpl $4, %ebx /* if (i == 4) */ je L2 /* goto L2 */ movl (%r12), %eax /* eax = *p */ addl $1, %ebx /* i++ */ addq $4, %r12 /* p++ */ jmp L1 L2: ret int nums[] = {10, -21, -30, 45}; int main() { int i, *p; for (i = 0, p = nums; i!= 4; i++, p++) printf("%d\n", *p); return 0; }

Registradores Armazenam valores inteiros e endereços (ponteiros) podem ser acessados como valores de 64, 32, 16 e 8 bits %rbp e %rsp são usados como ponteiros para a pilha

Movimentação de Dados mov fonte, destino Constante Registrador Reg Mem Reg Mem Memória Memória Reg Mem

Movimentação de Dados mov[b w l q] fonte, destino o sufixo especifica o tamanho dos operandos movl movq movl movq movl movl movb $0x4050,%eax $nums,%r12 %ebx,%ecx %r12,%r13 %edx,(%rbx) (%r12),%eax (%r12),%al Constante Registrador Memória Memória Reg Mem Reg Mem Reg Mem

Constantes e Registradores Constantes (imediatos) são escritas com um $ seguido por valor inteiro em notação C Registradores são especificados pelo nome

Constantes e Registradores Constantes (imediatos) são escritas com um $ seguido por valor inteiro em notação C Registradores são especificados pelo nome movl $1024, %eax movabsq $ 1, %rax /* para constantes de 64 bits */ movl $0xFF, %ebx movb $0, %al movl %ebx, %ecx movq %r12, %r13

Valores em Memória: modo indireto O endereço de memória está em um registrador o nome do registrador é escrito entre parênteses

Valores em Memória: modo indireto O endereço de memória está em um registrador o nome do registrador é escrito entre parênteses %rbx 0x7fff526a897c

Valores em Memória: modo indireto O endereço de memória está em um registrador o nome do registrador é escrito entre parênteses %rbx 0x7fff526a897c movl $1, (%rbx)

Valores em Memória: modo indireto O endereço de memória está em um registrador o nome do registrador é escrito entre parênteses %rbx 0x7fff526a897c memória movl $1, (%rbx) 0x7fff526a897c 1

Valores em Memória: modo indireto O endereço de memória está em um registrador o nome do registrador é escrito entre parênteses %rbx 0x7fff526a897c memória movl $1, (%rbx) 0x7fff526a897c 1 movl (%rbx), %eax

Valores em Memória: modo indireto O endereço de memória está em um registrador o nome do registrador é escrito entre parênteses %rbx 0x7fff526a897c memória movl $1, (%rbx) 0x7fff526a897c 1 movl (%rbx), %eax %eax 1

Valores em Memória: base-deslocamento Um registrador tem um endereço de memória ao endereço é somado um deslocamento

Valores em Memória: base-deslocamento Um registrador tem um endereço de memória ao endereço é somado um deslocamento %rbx 0x7fff526a8970

Valores em Memória: base-deslocamento Um registrador tem um endereço de memória ao endereço é somado um deslocamento %rbx 0x7fff526a8970 movl $1, 4(%rbx)

Valores em Memória: base-deslocamento Um registrador tem um endereço de memória ao endereço é somado um deslocamento %rbx 0x7fff526a8970 memória movl $1, 4(%rbx) 0x7fff526a8974 1

Valores em Memória: base-deslocamento Um registrador tem um endereço de memória ao endereço é somado um deslocamento %rbx 0x7fff526a8970 memória movl $1, 4(%rbx) 0x7fff526a8974 1 movl 4(%rbx), %eax

Valores em Memória: base-deslocamento Um registrador tem um endereço de memória ao endereço é somado um deslocamento %rbx 0x7fff526a8970 memória movl $1, 4(%rbx) 0x7fff526a8974 1 movl 4(%rbx), %eax %eax 1

Valores em Memória: modo absoluto O endereço de memória é especificado por uma constante ou rótulo (label) não existe o conceito de variável!

Valores em Memória: modo absoluto O endereço de memória é especificado por uma constante ou rótulo (label) não existe o conceito de variável!.data x:.int 10 memória 0x7fff526a897c 10

Valores em Memória: modo absoluto O endereço de memória é especificado por uma constante ou rótulo (label) não existe o conceito de variável!.data x:.int 10 memória 0x7fff526a897c 10 movl x, %eax

Valores em Memória: modo absoluto O endereço de memória é especificado por uma constante ou rótulo (label) não existe o conceito de variável!.data x:.int 10 memória 0x7fff526a897c 10 movl x, %eax %eax 10

Valores em Memória: modo absoluto O endereço de memória é especificado por uma constante ou rótulo (label) não existe o conceito de variável!.data x:.int 10 memória 0x7fff526a897c 10 movl x, %eax %eax 10 $x é uma constante (é o endereço associado a x)

Valores em Memória: modo absoluto O endereço de memória é especificado por uma constante ou rótulo (label) não existe o conceito de variável!.data x:.int 10 memória 0x7fff526a897c 10 movl x, %eax %eax 10 $x é uma constante (endereço associado a x) movq $x, %rbx

Valores em Memória: modo absoluto O endereço de memória é especificado por uma constante ou rótulo (label) não existe o conceito de variável!.data x:.int 10 memória 0x7fff526a897c 10 movl x, %eax %eax 10 $x é uma constante (endereço associado a x) movq $x, %rbx %rbx 0x7fff526a897c

Valores em memória: movimentação Movimento de dados sempre CPU memória Nunca dois operandos em memória!!!

Valores em memória: movimentação Movimento de dados sempre CPU memória Nunca dois operandos em memória!!! movl (%rcx), (%rax) movl 8(%rbx), (%rcx) movl x, (%rax) movl 4(%rcx), x

Movimentação com Extensão Extensão com sinal (movs) ou com zeros (movz) movs[bw][bl][bq][wl][wq][lq] movz[bw][bl][bq][wl][wq] não existe movzlq!

Movimentação com Extensão Extensão com sinal (movs) ou com zeros (movz) movs[bw][bl][bq][wl][wq][lq] movz[bw][bl][bq][wl][wq] não existe movzlq! movsbl (%r12), %eax movzbl %al, %ebx movslq %ebx,%rcx

Movimentação com Extensão Extensão com sinal (movs) ou com zeros (movz) movs[bw][bl][bq][wl][wq][lq] movz[bw][bl][bq][wl][wq] não existe movzlq! movsbl (%r12), %eax movzbl %al, %ebx movslq %ebx,%rcx Instruções que escrevem um valor em registrador de 32 bits zeram a parte alta do registrador de 64 bits correspondente...

Operações Aritméticas: um operando inc <dest> dec <dest> registrador ou memória neg <dest>

Operações Aritméticas: um operando inc <dest> dec <dest> registrador ou memória neg <dest> incl %eax /* %eax = %eax + 1 */ incl (%rdx) /* (%rdx) = (%rdx) + 1 */ decl %eax /* %eax = %eax 1 */ negl %ebx /* %ebx = -%ebx */

Operações Aritméticas: dois operandos add <s>,<d> sub <s>,<d> imul <s>,<d> d = d [ + - * ] s nunca memória com memória!

Operações Aritméticas: dois operandos add <s>,<d> sub <s>,<d> imul <s>,<d> d = d [ + - * ] s nunca memória com memória! addl %ebx, %eax /* %eax = %eax + %ebx */ addq $4, %rbx /* %rbx = %rbx + 4 */ addl 4(%r12), %eax /* %eax = %eax + 4(%r12) */ subl %ebx, %eax /* %eax = %eax - %ebx */ imull %ebx, %eax /* %eax = %eax * %ebx */

Operações Lógicas (bit a bit) and <s>,<d> or <s>,<d> xor <s>,<d> d = d [ & ^ ] s nunca memória com memória!

Operações Lógicas (bit a bit) and <s>,<d> or <s>,<d> xor <s>,<d> d = d [ & ^ ] s nunca memória com memória! andl $0x7FFFFFFF,%eax /* %eax = %eax & 0x7FFFFFFF */ andl %ebx,%eax /* %eax = %eax & %ebx */ orl (%rcx),%eax /* %eax = %eax (%rcx) */ xorl %eax,%ebx /* %ebx = %ebx ^ %eax */

Deslocamento (shift) shl <i>,<d> shr<i>,<d> sar <i>,<d> d = d << i d = d >> i (lógico) d = d >> i (aritmético)

Deslocamento (shift) shl <i>,<d> shr<i>,<d> sar <i>,<d> d = d << i d = d >> i (lógico) d = d >> i (aritmético) shll $2,%eax /* %eax = %eax << 2 */ shrl $16,%eax /* %eax = %eax >> 16 (lógico) */ sarl $3,%ebx /* %ebx = %ebx >> 3 (aritmético) */