Fluxo de Execução em Assembly

Documentos relacionados
Estruturas de controlo do C if-else statement

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

Programando em Assembly

Operadores lógicos (bit a bit)

Introdução a Engenharia Reversa

Laboratório de Sistemas Processadores e Periféricos Lista de comandos de Assembly

Introdução ao Assembly

Linguagem de Montagem Assembly

Assembly do IA-32 em ambiente Linux

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

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

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

Sistemas de Computação

Introdução. Programando em Assembly. Primeiro Exemplo (2) Primeiro Exemplo (1) Linguagem Assembly do 8086/8088

A linguagem ASSEMBLY

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

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

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

Assembly IA32 Procedimentos

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

Testando o Teorema de De Morgan

ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES I

x86 arquitetura e instruções básicas

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

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

Prof. Adilson Gonzaga

Revisão da Linguagem C Prof. Evandro L. L. Rodrigues

Estruturas de Controle

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Programando em Assembly

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

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: Operadores relacionais e lógicos estruturas condicionais If...

Representação de Inteiros

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Estruturas de Controle - Seleção. Prof. César Melo

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

Ordem de Bytes: Big Endian e Little Endian

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

4. Constantes. Constantes pré-definidas

Revisão C++ - Parte 1

Arquitetura e Organização de Computadores

Neander - características

Arquitetura e Organização de Computadores

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

CIT Aula 02 Variáveis e Estruturas de desvio condicional. Autor: Max Rodrigues Marques Carga Horária: 2 h 22/07/15 1

Introdução à Linguagem C++

CI064 - Software Básico. Bruno Müller Junior

Introdução a JAVA. Variáveis, tipos, expressões, comandos e blocos

Computador Cleópatra

Programação Orientada a Objetos

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Exceções no Fluxo de Execução: Interrupções e Traps

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Introdução a JAVA. Variaveis, tipos, expressões, comandos e blocos

Estrutura do tema ISA do IA-32

Computador Cleópatra

Programação de Computadores I Funções de Repetição da Linguagem C PROFESSORA CINTIA CAETANO

5 - COMANDOS DE CONTROLE DE PROGRAMA Em C existem os comandos de decisões, os comandos de iteração (ou de laços) e os comandos de desvios.

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

1. Instruções de Desvio

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

Conjunto de Instruções. Prof. Leonardo Barreto Campos 1

Sistemas de Computação. Instruções de Linguagem de Máquina

Programação Estruturada

Organização de Computadores 1

ARQUITETURA DE COMPUTADORES INTRODUÇÃO

Nível da Arquitetura do Conjunto de Instruções. Ronaldo de Freitas Zampolo

Transcrição:

Fluxo de Execução em Assembly A forma natural de execução de um programa é sequencial: CPU busca instruções na memória em endereços sequenciais Instruções de desvio de assembly servem para quebrar a execução sequencial (i.e. pular para outro ponto do código, como em um goto ) O ponto é marcado com um rótulo (label) Existem desvios condicionais e incondicionais ( jump no Pentium, ou branch ) Como implementar essas estruturas de controle? if (a==b) c=d; d=a+c; if (a>=b) { c=(a-b); else { c=(b-a); while (a<=b) {... a++; d=a+c for (i=0; i< 10; i++){ Sum+=sum+i;

Jump Condicional addl%eax, %ebx jne label # se %ebx!= 0 vai para label A condição se refere sempre ao resultado da instrução anterior No Pentium, a maioria das instruções registram características de seus resultados nos bits/flags de EFLAGS Os desvios condicionais operam sobre o valor destes flags cmpl %eax, %ebx jle label Obs: note a inversão dos operandos! # compara %ebx com %eax # se %ebx <= %eax vai para label Flags de Condição (1/2) CF Carry Flag SF Sign Flag ZF Zero Flag OF Overflow Flag PF Parity Flag Setados implicitamente por operadores aritméticos, p.ex. addl f, d Equivale: d = f + d ant CF=1 se houver carry do bit mais significativo(overflow de unsigned): exemplo jc label ZF=1 se d == 0 exemplo jz label SF=1 se d < 0 exemplo js label OF=1 se houver overflow em compl.-2 (f>0 && d ant >0 && d<0) (f<0 && d ant <0 && d>=0) usado em jg, jl, jge,

Flags de condição (2/2) Instrução de comparação: cmpl b,a equivale a a-b sem atribuição do resultado CF=1 se carry do bit mais significativo Para comparação de unsigned ZF=1 se a == b exemplo jz label SF=1 se (a-b) < 0 exemplo e po js label OF=1 se houver overflow em complemento a dois (com sinal) (a>0 && b<0 && (a-b)<0) (a<0 && b>0 && (a-b)>0) Todos os Desvios Instruções tipo: jx label Jump dependendo dos flags de condição jx condição Descrição jmp 1 Unconditional je ZF Equal / Zero jne ~ZF Not Equal / Not Zero js SF Negative jns ~SF Nonnegative jg ~(SF^OF)&~ZF Greater (Signed) jge ~(SF^OF) Greater or Equal (Signed) jl (SF^OF) Less (Signed) jle (SF^OF) ZF Less or Equal (Signed) ja ~CF&~ZF Above (unsigned) jb CF Below (unsigned)

Traduzindo if-else if (test-expr) then-statement; else else-statement; Esquema geral t= test-expr; if (t) goto true; else-statementstatement true: then-statement d = 16; a = 10; if (d < a) c= a d; else c = d a; Caso Específico movl $0x10, %edx movl $0xA, %eax cmpl %eax, %edx jl.l3 subl %eax, %edx movl %edx, %ecx jmp.l5.l3: /* true */ subl %edx, %eax movl %edx, %ecx.l5: /* done*/ Traduzindo if puro Quando não há parte else, deve-se negar a condição de teste. if (test-expr) then-statement; if (a==b) { c= d; d = a+c; Esquema geral t= test-expr; if (!t) then-statement.l5: Caso Específico cmpl %eax, %ebx jne.l5 movl %edx, %ecx /* done*/ movl %eax, %edx addl %ecx, %edx

Traduzindo loops do-while Código C int fat (int x) { int result = 1; do { result *= x; x = x-1; while (x > 1); return result; int fat_goto (int x) { int result = 1; result *= x; x = x-1; if (x > 1) goto loop; return result; Faça desvio para trás para continuar iterando (enquanto condição do while é satisfeita) Traduzindo loops do-while int fat_goto (int x) { int result = 1; result *= x; x = x-1; if (x > 1) goto loop; return result; _fat_goto: pushl %ebp # Setup movl %esp,%ebp # Setup movl $1,%eax # eax = 1 movl 8(%ebp),%edx # edx = x L11: imull %edx,%eax # result *= x decl %edx # x-- cmpl $1,%edx # Compare x : 1 jg L11 # if > goto loop movl %ebp,%esp popl %ebp ret # Finish # Finish # Finish Obs: O valor de retorno é o último valor armazenado em %eax antes de ret.

Diferenças do-while X while Código C do while (Test); if (Test) goto loop Código C while (Test ){ If (!Test) goto after goto loop after: Tradução do while : um exemplo while (a<=b ){ a++; d=a+c; cmpl %ebx, %eax jg depois /* se a>b */ incl %eax jmp loop depois: movl %ecx, %edx addl %eax, %edx

Convertendo while como do-while while (Test) Outro esquema geral para implementar while Versão do-while if (!Test) do while(test); Versão c/ goto if (!Test) if (Test) goto loop; Traduzindo o for for (Init; Test; Update ) Versão do-while Init; if (!Test) do { Update ; while (Test) Versão while Init; while (Test ) { Update ; Init; if (!Test) Update ; if (Test) goto loop;

Avaliando condições complexas A condição test pode conter operadores lógicos Exemplo: ((c>a) (a ==1) && (d < b) )) Expressão é avaliada da esquerda p/ direita Em C, e outras linguagens de alto nível, a avaliação é interrompida assim que o resultado é conhecido ( curto circuito ) (x y) se x resulta em true, não executa y (x && y) se x resulta em false, não executa y Isto é refletido no código Assembly gerado if ((a==b) (c<d)) { a = c; //L1 c = d; //Lfim cmp %ebx, %eax je L1 cmp %edx, %ecx jge Lfim L1: movl %ecx, %eax Lfim: movl %edx, %ecx Desvios indiretos É possível também fazer um desvio para o endereço contido em um registrador, ou na memória (sintaxe: prefixo * ) jmp *%ebx destino: conteúdo de ebx jmp *(%ebx) destino: conteúdo de M[ebx] jmp *.tab(%ebx)destino: de M[tab+ebx] Isto é usado na tradução do switch de C, onde monta-se uma tabela de jump, contendo os endereços dos desvios.

Uso da Tabela Jump para switch Switch Tabela jump Blocos & endereços switch(op) { case val_0: Block 0 case val_1: Block 1 case val_n-1: Block n 1 jtab: Tradução: op vira o índice na tabela target = jtab[op]; goto *target; movl op, %ebx jmp *.jtab(%ebx) Targ0 Targ1 Targ2 Targn-1 Targ0: Targ1: Targ2: Targn-1: Code Block 0 Code Block 1 Code Block 2 Code Block n 1