Testando o Teorema de De Morgan

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.

4. Desenhe um digrama esquemático para cada uma das funções abaixo. a.

Fluxo de Execução em Assembly

Projeto de Circuitos Lógicos. Introdução ao Computador 2010/01 Renan Manola

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

Eletrônica Digital Lista de Exercícios

CAPÍTULO 1 REVISÃO DE LÓGICA COMBINACIONAL

Assembly IA32 Procedimentos

Estruturas de controlo do C if-else statement

Organização de computadores

PORTAS NOR e NAND OR - AND - NOT. Considerando as entradas A e B, teremos na saída a complementação ou negação das mesmas.

Eletrônica Digital. Funções lógicas, álgebra de boole e circuitos lógicos combinacionais básicos. Professor: Francisco Ary


Abaixo descreveremos 6 portas lógicas: AND, OR, NOT, NAND, NOR e XOR.

Linguagem de Montagem Assembly

Ordem de Bytes: Big Endian e Little Endian

Transistor. Portas Lógicas (2) Base; Coletor; Emissor.

Introdução ao Assembly

Introdução à Computação: Introdução às Portas Lógicas

FUNDAMENTOS DA AUTOMAÇÃO Funções e Portas Lógicas. Prof. Luiz Fernando Laguardia Campos FMS

Circuitos Lógicos Capítulo 3 Portas Lógicas e Álgebra Booleana Parte II

Prof. Leonardo Augusto Casillo

Circuitos Digitais Álgebra de Boole

Sistemas Digitais Ficha Prática Nº Uniformização de circuitos com pontas NAND e NOR

Assembly do IA-32 em ambiente Linux

MC-102 Aula 04 Expressões Relacionais, Lógicas e Comandos Condicionais

A linguagem ASSEMBLY

Estrutura do tema ISA do IA-32

Lógica Boolena. Aula 05. Prof. Msc. Arthur G. Bartsch

UFMT. Ministério da Educação UNIVERSIDADE FEDERAL DE MATO GROSSO PRÓ-REITORIA DE ENSINO DE GRADUAÇÃO PLANO DE ENSINO

3. CAPÍTULO LÓGICAS DIGITAIS

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

ÁLGEBRA DE BOOLE B.1 - DIAGRAMA DE VENN

Disciplina de Organização de Computadores I

Álgebra de Boole. Nikolas Libert. Aula 4B Eletrônica Digital ET52C Tecnologia em Automação Industrial

Curso Profissional de Técnico de Gestão de Equipamentos Informáticos 10º ANO

Sistemas Digitais Apresentação

TEOREMAS DE DE MORGAN. Teorema 1

Arquitetura de Computadores Aula 9 Portas Lógicas

Sistemas Digitais Álgebra de Boole Binária e Especificação de Funções

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

Arquitectura e Organização de Computadores

Sistemas Digitais. Planificação das aulas teóricas e aulas práticas Ano Lectivo 2005/ 2006

Sistemas Digitais Módulo 5 Teoremas Lógicos, Simplificação Algébrica e Projeto de Circuitos Lógicos

PORTAS E OPERAÇÕES LÓGICAS

Lógica para Computação. Álgebra de Boole

Descrevendo Circuitos Lógicos Capítulo 3 Parte II

PRINCÍPIO BOOLEANO E PORTAS LÓGICAS (Unidade 3)

Lab. de Programação Concorrente em Física Primeira Prática

Professor: André Rabelo Curso: Engenharia da Computação Disciplina: Lógica Digital Período: 3º Data Entrega: 25/04/2012 Valor: 10 pts Objetivos:

6. Análise Lógica Combinacional

ARQUITETURA DE COMPUTADORES INTRODUÇÃO

CAPÍTULO 3 PORTAS LÓGICAS E ÁLGEBRA BOOLEANA

CIRCUITOS DIGITAIS ÁLGEBRA BOOLEANA

Arquitetura e Organização de Computadores

PCS 3115 Sistemas Digitais I Análise e Síntese de Circuitos Combinatórios Prof. Dr. Marcos A. Simplicio Jr.

Lógica para computação - Propriedades Semânticas da Lógica Proposicional (parte 2/2) Alfabeto Simplificado e Formas Normais

Descrevendo Circuitos Lógicos (Continuação) CPCX UFMS Slides: Prof. Renato F. dos Santos Adaptação: Prof. Fernando Maia da Mota

Introdução a Engenharia Reversa

Introdução à Automação

Circuitos Digitais. Conteúdo. Lógica. Introdução. Tabela-Verdade. Álgebra Booleana. Álgebra Booleana / Funções Lógicas. Ciência da Computação

Sistemas de Computação

CIRCUITOS DIGITAIS COMBINACIONAIS (Unidade 3)

Usando IDA-PRO para analisar os desvios de um código ASM e sua aplicação no Crack.

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

Introdução à Arquitetura e Linguagem Assembly de Processadores IA-32

Assembly x86. Hugo Bessa - hrba Paulo Serra Filho ptvsf

Módulo 2 Álgebra e Lógica Booleana

Técnicas de projeto de algoritmos: Indução

Apresentação da Disciplina Prof. Rômulo Calado Pantaleão Camara. Carga Horária: 60h

Transcrição:

Pedro Garcia http://www.sawp.com.br 04 de Fevereiro de 2010 Assembly Working Party Laboratório de Cálculos Científicos, Instituto de Física, Universidade de Brasília, Brasil

O Teorema Teorema de De Morgan Teorema de lógica, que obteve vasta aplicabilidade em aplicações da lógica booleana. Muito utilizado em computação e eletrônica para simplificação de expressões booleanas, implicando em circuitos mais simples. Base fundamental para produção de portas lógicas compostas por combinação de uma porta única (NAND or NOR).

O Teorema Primeiro teorema de De Morgan. Enunciado: Definition O complemento do produto é a soma dos complementos. Lembrando que na aritmética booleana, o produto têm equivalência lógica e, enquanto que a soma equivale logicamente à operação ou. Este teorema pode ser visualizado pela tabela abaixo. A B A B A + B 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 0

O Teorema Primeiro teorema de De Morgan. ( A B C N ) = A + B + + N

O Teorema Segundo teorema de De Morgan. Definition O complemento da soma é igual ao produto dos complementos. Demonstração. 1 Do 1 teorema, sabemos que (A B) = A + B

O Teorema Segundo teorema de De Morgan. Definition O complemento da soma é igual ao produto dos complementos. Demonstração. 1 Do 1 teorema, sabemos que (A B) = A + B 2 Negando a expressão acima, temos que (A B) = A + B = A B

O Teorema Segundo teorema de De Morgan. Definition O complemento da soma é igual ao produto dos complementos. Demonstração. 1 Do 1 teorema, sabemos que (A B) = A + B 2 Negando a expressão acima, temos que (A B) = A + B = A B 3 Tomando A = X e B = Y

O Teorema Segundo teorema de De Morgan. Definition O complemento da soma é igual ao produto dos complementos. Demonstração. 1 Do 1 teorema, sabemos que (A B) = A + B 2 Negando a expressão acima, temos que (A B) = A + B = A B 3 Tomando A = X e B = Y 4 Obtemos que: A B = X Y

O Teorema Segundo teorema de De Morgan. Definition O complemento da soma é igual ao produto dos complementos. Demonstração. 1 Do 1 teorema, sabemos que (A B) = A + B 2 Negando a expressão acima, temos que (A B) = A + B = A B 3 Tomando A = X e B = Y 4 Obtemos que: A B = X Y 5 A + B = X + Y

O Teorema Segundo teorema de De Morgan. Definition O complemento da soma é igual ao produto dos complementos. Demonstração. 1 Do 1 teorema, sabemos que (A B) = A + B 2 Negando a expressão acima, temos que (A B) = A + B = A B 3 Tomando A = X e B = Y 4 Obtemos que: A B = X Y 5 A + B = X + Y 6 Portanto, X Y = (X + Y)

O Teorema Segundo teorema de De Morgan. ( A + B + C + + N ) = A B N

Programa-exemplo C Ilustrando De Morgan em C 1 int main(void) { 2 int a, b, n_op_ab, n_op_a_b, n_a, n_b; 3 4 /* primeiro teorema de De Morgan */ 5 for (a = 0; a <= 1; a++) 6 for (b = 0; b <= 1; b++) { 7 n_op_ab =!(a & b); 8 n_a =!a; 9 n_b =!b; 10 n_op_a_b = n_a n_b; 11 n_op_ab == n_op_a_b; /* should tb TRUE, 1 */ 12 } 13 14 /* segundo teorema de De Morgan */ 15 for (a = 0; a <= 1; a++) 16 for (b = 0; b <= 1; b++) { 17 n_op_ab =!(a b); 18 n_a =!a; 19 n_b =!b; 20 n_op_a_b = n_a & n_b; 21 n_op_ab == n_op_a_b; /* should tb TRUE, 1 */ 22 } 23 }

ASM Code Implementação em ASM Compile com gcc -g demorgan.s -o demorgan demorgan.s Programa principal. 1 main: 2 pushl %ebp 3 movl %esp, %ebp 4 5 # stt: show trivial things 6 call _preamble 7 8 # 1th De Morgan Theorem 9 call _first 10 11 # 2th De Morgan Theorem 12 call _second 13 14 leave 15 ret

ASM Code Função _preamble preamble _preamble 1 _preamble: 2 pushl %ebp 3 movl %esp, %ebp 4 subl $8, %esp 5 6 movl $head, (%esp) 7 call puts 8 9 leave 10 ret $head 1 head: 2.asciz "\x1b[h\x1b[2jtrue Tables from De Morgan Theorem.\ 3 \nauthor: Pedro Garcia."

ASM Code Função _first _first Cabeçalho da função 1 _first: 2 pushl %ebp 3 movl %esp, %ebp 4 subl $8, %esp 5 6 movl $first_demorgan, (%esp) 7 call puts 8 9 movl $first_true_table_head, (%esp) 10 call printf $first_demorgan 1 first_demorgan: 2.asciz "\n1th Thorem:!(A & B) ==!A!B\n" $first_true_table_head 1 first_true_table_head: 2.asciz " A B!(A.B)!A +!B \n"

ASM Code Função _first _first primeiro teorema de De Morgan 1 movl false, %eax 2 movl false, %ebx 3 call _first_make_table 4 5 movl false, %eax 6 movl true, %ebx 7 call _first_make_table 8 9 movl true, %eax 10 movl false, %ebx 11 call _first_make_table 12 13 movl true, %eax 14 movl true, %ebx 15 call _first_make_table Equivalente em C 1 /* primeiro teorema de De Morgan */ 2 for (a = 0; a <= 1; a++) 3 for (b = 0; b <= 1; b++) 4 first_make_table(a, b);

ASM Code Função _first_make_table _first_make_table Inserindo a função na pilha 1 _first_make_table: 2 pushl %ebp 3 movl %esp, %ebp 4 subl $64, %esp 5 6 movl %eax, 4(%esp) 7 movl %ebx, 8(%esp)

ASM Code Função _first_make_table _first_make_table Processando o Primeiro Teorema de De Morgan 1 movl %eax, %ecx 2 not %ecx 3 movl %ebx, %edx 4 not %edx 5 6 #!A +!B 7 or %ecx, %edx 8 movl %edx, 16(%esp) 9 10 #!(A.B) 11 and %ebx, %eax 12 notl %eax 13 movl %eax, 12(%esp) Equivalente em C 1 n_op_ab =!(a & b); 2 n_a =!a; 3 n_b =!b; 4 n_op_a_b = n_a n_b;

ASM Code Função _first_make_table _first_make_table Outputing 1 # print 2 movl $true_table_fmt, (%esp) 3 call printf 4 5 leave 6 ret $true_table_fmt 1 true_table_fmt: 2.asciz " %2d %2d %2d %2d \n"

ASM Code Função _second _second Cabeçalho da função 1 _second: 2 pushl %ebp 3 movl %esp, %ebp 4 subl $8, %esp 5 6 movl $second_demorgan, (%esp) 7 call puts 8 9 movl $second_true_table_head, (%esp) 10 call printf $second_demorgan 1 second_demorgan: 2.asciz "\n2th Theorem:!(A B) ==!A &!B\n" $second_true_table_head 1 second_true_table_head: 2.asciz " A B!(A+B)!A.!B \n"

ASM Code Função _second _second segundo teorema de De Morgan 1 movl false, %eax 2 movl false, %ebx 3 call _second_make_table 4 5 movl false, %eax 6 movl true, %ebx 7 call _second_make_table 8 9 movl true, %eax 10 movl false, %ebx 11 call _second_make_table 12 13 movl true, %eax 14 movl true, %ebx 15 call _second_make_table Equivalente em C 1 /* segundo teorema de De Morgan */ 2 for (a = 0; a <= 1; a++) 3 for (b = 0; b <= 1; b++) 4 second_make_table(a, b);

ASM Code Função _second_make_table _second_make_table Inserindo a função na pilha 1 _second_make_table: 2 pushl %ebp 3 movl %esp, %ebp 4 subl $64, %esp 5 6 movl %eax, 4(%esp) 7 movl %ebx, 8(%esp)

ASM Code Função _second_make_table _second_make_table Processando o Segundo Teorema de De Morgan 1 movl %eax, %ecx 2 not %ecx 3 movl %ebx, %edx 4 not %edx 5 6 #!A.!B 7 and %ecx, %edx 8 movl %edx, 16(%esp) 9 10 #!(A+B) 11 or %ebx, %eax 12 notl %eax 13 movl %eax, 12(%esp) Equivalente em C 1 n_op_ab =!(a b); 2 n_a =!a; 3 n_b =!b; 4 n_op_a_b = n_a & n_b;

ASM Code Função _second_make_table _second_make_table Outputing 1 # print 2 movl $true_table_fmt, (%esp) 3 call printf 4 5 leave 6 ret $true_table_fmt 1 true_table_fmt: 2.asciz " %2d %2d %2d %2d \n"

Resultado Resultados $./demorgan True Tables from De Morgan Theorem.\n Author: Pedro Garcia. 1th Thorem:!(A & B) ==!A!B A B!(A.B)!A +!B 0 0-1 -1 0-1 -1-1 -1 0-1 -1-1 -1 0 0 2th Theorem:!(A B) ==!A &!B A B!(A+B)!A.!B 0 0-1 -1 0-1 0 0-1 0 0 0-1 -1 0 0

Observações Observações, Considerações e Reclamações Porque o atributo FALSE possui valor 0 e TRUE é 1 (ao invés de 1)? demorgan.s 1 false: 2.int 0 3 4 true: 5.int -1 $./demorgan 1th Thorem:!(A & B) ==!A!B A B!(A.B)!A +!B 0 0-1 -1 0-1 -1-1 -1 0-1 -1-1 -1 0 0 2th Theorem:!(A B) ==!A &!B A B!(A+B)!A.!B 0 0-1 -1 0-1 0 0-1 0 0 0-1 -1 0 0

Observações Observações, Considerações e Reclamações Porque o atributo FALSE possui valor 0 e TRUE é 1 (ao invés de 1)? Complemento de 2: o sinal negativo é representado como 1 em binário. O resultado impresso pelo programa está em decimal. Uma alternativa para remover o sinal negativo da saída seria utilizar os registradores de flags na hora da comparação. Na verdade, a melhor forma de fazermos comparação com resultado booleanos é utilizando estes registradores. Exemplo 1 andl %edx, %eax 2 testl %eax, %eax 3 sete %al 4 movzbl %al, %eax

Observações Observações, Considerações e Reclamações Stacking _first: pushl movl subl... %ebp %esp, %ebp $8, %esp _second_make_table: pushl %ebp movl %esp, %ebp subl $64, %esp... Por que cada função começa com operações com o registrador %esp? A chamada de funções é estruturada como uma pilha, o que permite indicar ponto de chamada e de retorno.

Observações Observações, Considerações e Reclamações Stacking _first: pushl movl subl... %ebp %esp, %ebp $8, %esp _second_make_table: pushl %ebp movl %esp, %ebp subl $64, %esp... Por que os valores em cada função varia? (subl $64, %esp, subl $8, %esp) Podemos imaginar que para cada função chamada, devemos alocar um espaço em memória para tal. Diferentes funções neste programa estão usando quantidades diferentes de recursos em memória (em geral, para chamar as funções puts e printf). Enquanto uma precisa imprimir apenas uma variável, outras precisam imprimir até cinco, necessitando colocá-las na pilha para chamada da função de saída.

Observações Dúvidas, sugestões, reclamações?

Referências Referências IDOETA, I.V. Elementos de Eletrônica Digital. 35 ed. Érica. São Paulo, 1998. ISBN 85-7194-019-3. BLUM, R. Professional Assembly Language. Wiley Publishing. Indianápolis (EUA), 2005. ISBN 0-7645-7901-0.