Baixe o app para aproveitar ainda mais
Prévia do material em texto
Faculdades de Tecnologia CARLOS DRUMMOND DE ANDRADE Tecnologia em Análise e Desenvolvimento de Sistema Ronaldo Barbato de Oliveira Arquitetura de Computadores Notas de Aula SÃO PAULO – SP Agosto/2007 2 1-Introdução Muita gente ainda desconhece a composição e organização dos componentes que integram um instrumento vital para o seu trabalho: o computador. Hoje em dia, um bom profissional da área de informática, deve possuir sólidos conceitos sobre os componentes e a organização dos computadores. Mesmo o profissional que irá se dedicar 100% de seu tempo a trabalhar projetando, construindo, testando, validando, instalando, treinando ou qualquer outra tarefa em nível de software, deve, pelo menos, informar-se sobre o hardware. O trabalho em nível de software pode ser profundamente influenciado, pelo hardware, quer seja na produtividade, quer seja em seu planejamento; desta forma, os componentes físicos de um sistema computacional não podem ser desconhecidos a um profissional da área de informática. Saber usar um computador, reconhecer e saber usar seus principais periféricos de entrada e saída pode ser suficiente para futuros profissionais, mas você estará subestimando seu potencial e a si próprio, além de tornar-se limitado. Sem saber sobre a organização e o funcionamento de seus principais componentes não saberá se adquiriu ou indicou o computador mais adequado à determinada função, ou, um equipamento caro incapaz de realizar tarefas nas quais os modelos mais simples se sobressaem. Conceituação Um computador é uma máquina capaz de sistematicamente coletar, manipular e fornecer os resultados da manipulação de informações para um ou mais objetivos. Por ser uma máquina composta de vários circuitos e componentes eletrônicos, também é chamado de equipamento de processamento eletrônico de dados. Processamento de dados consiste, então, em uma série de atividades ordenadamente realizadas, com o objetivo de produzir um arranjo determinado de informações a partir de outras obtidas inicialmente. A manipulação das informações coletadas no inicio da atividade chama-se processamento; as informações são usualmente denominadas dados. Os termos dado e informação podem ser tratados como sinônimos ou como termos distintos; dado pode ser definido como a matéria prima originalmente obtida de uma ou mais fontes e informação, como o resultado do processamento, isto é, o dado processado. Sistemas “Conjunto de partes coordenadas que concorrem para realização de um determinado objetivo”. Sistemas de processamento de dados são aqueles responsáveis pela coleta, armazenamento, processamento e recuperação, em equipamentos de processamento eletrônico, dos dados necessários ao funcionamento de um outro sistema maior: o sistema de informações. Sistemas de Computação Um computador precisa entender cada instrução, de modo a executar corretamente a operação que se pretendem, as pessoas falam português, inglês e outras línguas para se comunicar e os computadores utilizam uma linguagem própria, a linguagem binária ou de máquina. Essa linguagem de máquina é tediosa de manipular para os seres humanos, difícil de compreender 3 e fácil de acarretar erros. Por essa razão, foram desenvolvidas outras linguagens, mais próximas do entendimento dos operadores, genericamente chamadas linguagens de programação. Atualmente, há dezenas dessa linguagens, tais como: Cobol, PL/I, Pascal, Fortran, Basic, Lisp, Assembley, C etc. Cada uma dessas linguagens possui regras fixas e rígidas de sintaxe, semelhantes às das linguagens de comunicação humana, tais como português, inglês etc. (embora estas não possuam sintaxe tão rígidas). O programador escreve o programa através da descrição por instrução. Tal programa não é, entretanto, possível de ser diretamente executado pela máquina, visto que as linguagens de programação são apenas um modo do operador comunicar-se com o computador. A máquina somente entende e executa instruções mais simples, chamadas instruções de máquinas. Todo computador é construído com circuitos eletrônicos capazes de reconhecer e executar diretamente apenas um conjunto limitado e simples de instruções de máquina, nas quais todo programa (escrito em Pascal, Cobol, Basic etc.) deve ser convertido antes de ser executado. Essas instruções são normalmente do tipo: executar operações aritméticas sobre dois números; executar operações lógicas sobre dois números; mover um conjunto de bits (um número ou parte) de um ponto para outro do computador; desviar a seqüência do programa; comunicação com algum disposição de entrada ou saída de dados. O conjunto formado pelos circuitos eletrônicos e partes eletromecânicas de um computador é conhecido como hardware que é a parte física e visível do computador. O software consiste em programas, de qualquer tipo e em qualquer linguagem, que são introduzidos na máquina para fazê-la trabalhar, passo a passo, e produzir algum resultado. Histórico As primeiras máquinas de computar. John Napier (1550-1617), escocês inventor dos logaritmos, também inventou os ossos de Napier, que eram tabelas de multiplicação gravadas em bastão, o que evitava a memorização da tabuada. A primeira máquina de verdade foi construída por Wilhelm Schickard (1592-1635), sendo capaz de somar, subtrair, multiplicar e dividir. Essa máquina foi perdida durante a guerra dos trinta anos, sendo que recentemente foi encontrada alguma documentação sobre ela. Durante muitos anos nada se soube sobre essa máquina, por isso, atribuía-se a Blaise Pascal (1623-1662) a construção da primeira máquina calculadora, que fazia apenas somas e subtrações. A máquina de Pascal foi criada com objetivo de ajudar seu pai a computar os impostos em Rouen, França. O projeto de Pascal foi bastante aprimorado pelo matemático alemão Gottfried Wilhelm Leibniz (1646-1726), que também inventou o cálculo, o qual sonhou que, um dia no futuro, todo o raciocínio pudesse ser substituído pelo girar de uma simples alavanca. Todas essas máquinas, porém, estavam longe de ser um computador de uso geral, pois não eram programáveis. Isto quer dizer que a entrada era feita apenas de números, mas não de instruções a respeito do que fazer com os números. Babbage, Ada Lovelace e programas de computador. A origem da idéia de programar uma máquina vem da necessidade de que as máquinas de tecer produzissem padrões de cores diferentes. Assim, no século XVIII foi criada uma forma de representar os padrões em cartões de papel perfurado, que eram tratados manualmente. Em 1801, Joseph Marie Jacquard (1752-1834) inventa um tear mecânico, com uma leitora automática de cartões. 4 A idéia de Jacquard atravessou o Canal da Mancha, onde inspirou Charles Babbage (1792-1871), um professor de matemática de Cambridge, a desenvolver uma máquina de “tecer números”, uma máquina de calcular onde a forma de calcular pudesse ser controlada por cartões. Tudo começou com a tentativa de desenvolver uma máquina capaz de calcular polinômios por meio de diferenças, o calculador diferencial. Enquanto projetava seu calculador diferencial, a idéia de Jacquard fez com que Babbage imaginasse uma nova e mais complexa máquina, o calculador analítico, extremamente semelhante ao computador atual. Sua parte principal seria um conjunto de rodas dentadas, o moinho, formando uma máquina de somar com precisão de cinqüenta dígitos. As instruções seriam lidas de cartões perfurados. Os cartões seriam lidos em um dispositivo de entrada e armazenados, para futuras referências, em um banco de mil registradores. Cada um dos registradores seria capaz de armazenar um número de cinqüentadígitos, que poderiam ser colocados lá por meio de cartões a partir do resultado de um dos cálculos do moinho. Além disso tudo, Babbage imaginou a primeira máquina de impressão, que imprimiria os resultados dos cálculos, contidos nos registradores. Babbage conseguiu, durante algum tempo, fundos para sua pesquisa, porém não conseguiu completar sua máquina no tempo prometido e não recebeu mais dinheiro. Hoje, partes de sua máquina podem ser vistas no Museu Britânico, que também construiu uma versão completa, utilizando as técnicas disponíveis na época. Junto com Babbage, trabalhou a jovem Ada Augusta, filha do poeta Lord Byron, conhecida como Lady Lovelace e Ada Lovelace. Ada foi a primeira programadora da história, projetando e explicando, a pedido de Babbage, programas para a máquina inexistente. Ada inventou os conceitos de sub-rotina, uma seqüência de instruções que pode ser usada várias vezes, loop, uma instrução que permite a repetição de uma seqüência de cartões, e do salto condicional, que permite saltar algum cartão caso uma condição seja satisfeita. Ada Lovelace e Charles Babbage estavam avançados demais para o seu tempo, tanto que até a década de 1940, nada se inventou parecido com seu computador analítico. Até essa época foram construídas muitas máquinas mecânicas de somar destinadas a controlar negócios (principalmente caixas registradoras) e algumas máquinas inspiradas na calculadora diferencial de Babbage, para realizar cálculos de engenharia (que não alcançaram grande sucesso). A máquina de tabular O próximo avanço dos computadores foi feito pelo americano Herman Hollerith (1860-1929), que inventou uma máquina capaz de processar dados baseada na separação de cartões perfurados (pelos seus furos). A máquina de Hollerith foi utilizada para auxiliar no censo de 1890, reduzindo o tempo de processamento de dados de sete anos, do censo anterior, para apenas dois anos e meio. A máquina de Hollerith foi também pioneira ao utilizar a eletricidade na separação, contagem e tabulação dos cartões. A empresa fundada por Hollerith é hoje conhecida como International Bussiness Machines, ou IBM. Os primeiros computadores de uso geral O primeiro computador eletro-mecânico foi construído por Konrad Zuse (1910–1995). Em 1936, esse engenheiro alemão construiu, a partir de relês que executavam os cálculos e dados lidos em fitas perfuradas, o Z1. Zuse tentou vender o computador ao governo alemão, que desprezou a oferta, já que não poderia auxiliar no esforço de guerra. Os projetos de Zuse ficariam parados durante a guerra, dando a chance aos americanos de desenvolver seus computadores. Foi na Segunda Guerra Mundial que realmente nasceram os computadores atuais. A Marinha americana, em conjunto com a Universidade de Harvard, desenvolveu o computador Harvard Mark I, projetado pelo prof. Howard Aiken, com base no calculador analítico de Babbage. O Mark I ocupava 120m³ aproximadamente, conseguindo multiplicar dois números de dez dígitos em três segundos. 5 Simultaneamente, e em segredo, o Exército Americano desenvolvia um projeto semelhante, chefiado pelos engenheiros J. Presper Eckert e John Mauchy, cujo resultado foi o primeiro computador a válvulas, o Eletronic Numeric Integrator And Calculator (ENIAC)[2], capaz de fazer quinhentas multiplicações por segundo. Tendo sido projetado para calcular trajetórias balísticas, o ENIAC foi mantido em segredo pelo governo americano até o final da guerra, quando foi anunciado ao mundo. No ENIAC, o programa era feito rearranjando a fiação em um painel. Nesse ponto John von Neumann propôs a idéia que transformou os calculadores eletrônicos em “cérebros eletrônicos”: modelar a arquitetura do computador segundo o sistema nervoso central. Para isso, eles teriam que ter três características: 1. Codificar as instruções de uma forma possível de ser armazenada na memória do computador. Von Neumann sugeriu que fossem usados uns e zeros. 2. Armazenar as instruções na memória, bem como toda e qualquer informação necessária a execução da tarefa, e 3. Quando processar o programa, buscar as instruções diretamente na memória, ao invés de lerem um novo cartão perfurado a cada passo. Este é o conceito de programa armazenado, cujas principais vantagens são: rapidez, versatilidade e automodificação. Assim, o computador programável que conhecemos hoje, onde o programa e os dados estão armazenados na memória ficou conhecido como Arquitetura de von Neumann. Para divulgar essa idéia, von Neumann publicou sozinho um artigo. Eckert e Mauchy não ficaram muito contentes com isso, pois teriam discutido muitas vezes com ele. O projeto ENIAC acabou se dissolvendo em uma chuva de processos, mas já estava criado o computador moderno. 6 2 - Componentes de um sistema de computação Conceitos sobre organização de computadores Para estudar organização de computadores alguns conceitos básicos devem ser assimilados/ revisados. Estes conceitos abrangem os componentes funcionais básicos e as formas de representação/ armazenamento de informações, além do funcionamento básico dos sistemas de computação. Funcionamento básico dos sistemas de computação Os computadores executam quatro funções distintas sendo elas: Entrada; Processamento; Armazenamento/recuperação de dados; Saída. A Figura 1 ilustra a organização dos sistemas de computação. Figura 1: Componentes básicos de um sistema de computação Para que um computador trabalhe é necessária à inserção de informações (entrada). Seguindo as instruções fornecidas pelos programas, o computador processa os dados oriundos da entrada (processamento) armazenando-os logo em seguida para posterior utilização. As informações produzidas ficam disponíveis para utilização (saída) e a menos que se desejem as informar e produzir novamente, elas devem ser armazenadas em um dispositivo de armazenamento estável. O esquema geral da figura 1 é seguido por praticamente todos os computadores, sendo que os da- dos são produzidos através de instruções durante a etapa de processamento, realizada pela CPU (Uni- dade Central de Processamento - processador). Cada processador tem um conjunto único de instruções para processar os dados, porém geralmente utilizam a mesma forma de composição das instruções. A Figura 2 mostra a forma das instruções comumente utilizada pelos processadores. Figura 2: Forma geral das instruções A “operação” especifica a função a ser desempenhada, por exemplo, soma, armazene ou desvie, entre outras. Os “operandos” fornecem os dados a serem utilizados na operação ou ainda a forma de alcançar a posição destes dados na memória. 7 O Bit, o Caractere, o Byte e a Palavra Todas as informações manipuladas pelos computadores devem ser entendidas pela máquina. Como o computador é um dispositivo eletrônico, ele armazena e movimenta as informações de forma eletrônica, podendo utilizar um valor de corrente. Para que a máquina representasse todos os símbolos da linguagem humana eletricamente seriam necessárias mais de 100 diferentes voltagens (corrente). Uma máquina deste tipo além de ser de custo elevado, seria difícil de construir e de baixa confiabilidade. Desta forma, optou-se por construir máquinas binárias, capazes de entender apenas dois valores diferentes. Os computadores digitais são totalmente binários, isto é, trabalham apenas com dois valores, tornando assim simples o emprego da lógica booleana (Sim/Não, Verdadeiro/Falso, Aberto/ Fechado,...) tanto na construção de componentes quanto como base para a escrita de programas (programação). Convencionou-se chamar os dois níveis elétricos de 0 e 1 sendo que cada algarismo da representação numérica binária é denominado de bit, correspondente a abreviatura de binary digit (dígito binário). Obviamente com apenas 1 bit isolado pode-se representarmuito pouca coisa (apenas 2 valores), desta forma, usam-se agrupamentos ordenados de bits para a representação de informações úteis. A menor informação inteligível aos seres humanos é o caractere, como por exemplo, o número “5” ou a letra “a”. Existem diversos agrupamentos de bits para representar caracteres, sendo que o mais po- pularmente utilizado é chamado de byte. Um byte é uma seqüência ordenada de 8 bits, sendo cada bit tratado de forma independente dos demais e com um valor fixo de acordo com sua posição. Qualquer seqüência binária pode ser convertida para um número na base decimal, sendo utilizado este valor para encontrar o caractere correspondente, utilizando uma tabela de caracteres. As memórias ge- ralmente armazenam e recuperam informações byte a byte, ou ainda em múltiplos de bytes. A representação binária de valores também é utilizada para a representação de números dentro dos computadores. A metodologia é a mesma, sendo convertido o valor em base decimal para o correspondente em base binária. Por exemplo, o número 2310 pode ser armazenado no seguinte byte 00010111. Os dispositivos de memória atuais utilizam agrupamentos de bytes para representar sua capacidade de armazenamento. Uma vez que tais agrupamentos são oriundos de uma base binária o fator de multiplicação utilizado é 1024 (210). Cada faixa possui também uma letra para abreviar a categoria. A Tabela 1 demonstra alguns agrupamentos de bits e bytes utilizados. Tabela 1: Agrupamento de bits e bytes Agrupamento Símbolo Representa Byte B 8 bits Kilo K 1024 Bbytes Mega M 1024 Kbytes Giga G 1024 Mbytes Tera T 1024 Gbytes Peta P 1024 Tbytes Estes agrupamentos são utilizados na descrição das capacidades de armazenamento dos computadores hoje em dia, sendo que esta capacidade é referenciada por um número e um símbolo correspondente. Por exemplo, 256MB de memória. 8 Outro conceito importante muito utilizado na descrição do mecanismo de transferência de informações entre a CPU e a memória principal é o conceito de palavra. A palavra é utilizada para indicar a unidade de transferência e processamento de um computador. As palavras são múltiplos de 1 byte, sendo que os microprocessadores geralmente utilizam 32bits – 4 bytes como tamanho da palavra e 64 bits – 8 bytes. 9 3 - Conversão de Bases e Aritmética Computacional Notação Posicional A notação posicional determina o valor de um número em função da posição e do valor de cada algarismo dentro do número Base Decimal. Exemplo: 130310 1 x 103 + 3 x 102 + 0 x 101 + 3 x 100 = 1 x 1000 + 3 x 100 + 0 x 10 + 3 x 1 = 1000 + 300 + 0 + 3 = 1303 Da aritmética temos que, em qualquer base, o valor do i-ésimo dígito d de um número é dado por: d x basei, onde i começa em 0 e cresce da direita para a esquerda, de acordo com a posição ocupada pelo dígito. Por exemplo, o número 1011 na base dois é igual a: 1 x 23 + 0 x 22 + 1 x 21 + 1 x 20 = 1 x 8 + 0 x 4 + 1 x 2 + 1 x 0 = 8 + 0 + 2 + 1 = 11 Genericamente, um sistema qualquer de numeração posicional é expresso por: N = ( dn-1 dn-2 dn-3 ... d1 d0 )b onde: d – algarismo dentro do número n-1, n-2, ..., 1, 0 – indicam a posição de cada algarismo b – indica a base de numeração n – indica o número de dígitos inteiros O valor do número pode ser obtido por: N = dn-1 x bn-1 + dn-2 x bn-2 + ... + d1 x b1 + d0 x b0 Assim, o número 374810 pode ser expresso por: (3 x 103) + (7 x 102) + (4 x 101) + (8 x 100) Outras bases de numeração Veremos as bases 2 e outras potências de 2 (8 e 16) Vejamos o número: 10112 1 x 23 + 0 x 22 + 1 x 21 + 1 x 20 = 1 x 8 + 0 x 4 + 1 x 2 + 1 x 1 = 8 + 0 + 2 + 1 = 1110 10 Na base 8, são utilizados os dígitos de 0 a 7, em bases superiores a 10, usam-se letras para representar os dígitos; é o caso da base 16, que usa as letras A, B, C, D, E e F para representar os valores 10, 11, 12, 13, 14 e 15 respectivamente. A seguir temos um exemplo em octal: 7278 7 x 82 + 2 x 81 + 7 x 80 = 7 x 64 + 2 x 8 + 7 x 1 = 448 + 16 + 7 = 47110 E um exemplo em hexadecimal: 2DB16 2 x 162 + D x 161 + B x 160 = 2 x 256 + 13 x 16 + 11 x 1 = 512 + 208 + 11 = 73110 Tabela 2: Representação numérica nas bases 2, 8, 10 e 16 BASE 2 BASE 8 BASE 10 BASE 16 00000 0 0 0 00001 1 1 1 00010 2 2 2 00011 3 3 3 00100 4 4 4 00101 5 5 5 00110 6 6 6 00111 7 7 7 01000 10 8 8 01001 11 9 9 01010 12 10 A 01011 13 11 B 01100 14 12 C 01101 15 13 D 01110 16 14 E 01111 17 15 F 10000 20 16 10 10001 21 17 11 11 Conversão de Bases Base 2 -> Base 8 23 = 8 Três dígitos binários equivalem a um dígito octal 1101110102 6 7 2 8 Base 2 -> Base 16 24 = 16 Quatro dígitos binários equivalem a um dígito hexadecimal 1 1011 10102 1 B A16 Base 10 -> Base 2 Na conversão da base 10 para a base 2 o número decimal é dividido sucessivas vezes pela base; o resto de cada divisão ocupará sucessivamente as posições de ordem 0, 1, 2 e assim por diante até que o resto da última divisão ocupe a posição de mais alta ordem. Veja o exemplo da conversão do número 3710 para a base 2: 150403120110<= O resto das divisões de cima para baixo são posicionados da direita para a esquerda. 1001012 = 3710 Base 10 -> Base 16 A mesma maneira das transformações de decimal para binário, com divisões sucessivas pelo número 16. Veja o exemplo da conversão do número 3710 para a base 16: 37 | 2 10 18 | 2 01 9 | 2 12 4 | 2 03 2 | 2 04 1 | 2 150403120110 15 0 37 : 2 = 18 resto 10 18 : 2 = 9 resto 01 9 : 2 = 4 resto 12 4 : 2 = 2 resto 03 2 : 2 = 1 resto 04 1 : 2 = 0 resto 15 150403120110 2736 | 16 00 171 | 16 111 10 | 16 102 0 Mas, 1010 = A16 e 1110 = B16 A2B100 = AB016 = 273610 12 Aritmética Binária Adição Para somar dois números binários, fazem-se as contas coluna a coluna, da direita para a esquerda, como de costume, fazendo o transporte de um (<e vai um>) quando for o caso. Para isto, observe as seguintes operações básicas: 1 + 0 + 0 +1 +1 0 1 1 1 0 1 10 11 (1 + 1 é igual a 0 e vai 1) (1 + 1 + 1 é igual a 1 e vai 1) Outros exemplos: + 111 100111 1 11110 + 1101 100100 11001 101110 + 1101 + 1001011111+ 10011 + 1110 10010 110110 101100 111100 Subtração Como o conjunto de símbolos contém apenas 2 dígitos, ao se efetuar a subtração parcial entre 2 dígitos, um do diminuendo e outro do diminuidor, se o segundo (diminuidor) exceder o primeiro (diminuendo), subtrai-se uma unidade ao dígito imediatamente à esquerda no diminuendo (se existir e o seu valor for 1), convertendo-o a 0. Em seguida, substituímos o diminuendo por 2, que corresponde à equivalência 1*2, da unidade extraída. Se o dígito imediatamente à esquerda for 0, procura-se nos dígitos consecutivos. Exemplos: 11101 - 111 02 02 021 -11101 -11101 -11101 -111 -111 -111 10010 11010 10110 Exemplos: 11000 - 111 1 0112 1 1 0120 - 1 0200 - -11000 -1111001 10001 13 Aritmética Hexadecimal Adição Como exemplo, suponha a adição de 8h+5h, se somada em decimal o valor seria 13. Em hexadecimal, o valor 13 é representado por Dh. Deve-se reparar que, tal como nos habituamos a fazer no primário, sempre que o resultado iguala ou ultrapassa a base, subtraímos esta ao resultado, e fazemos um transporte para a coluna seguinte («e vai um», neste caso). Suponha agora a adição de 19 por 9, que em decimal o resultado seria 28, em hexadecimal, inicialmente somamos os dígitos menos significativos: 9H+9H = 18; como o resultado é maior que a base (16), então 18-16 = 2 e vai um para o dígito mais significativo. 1 + 19 9 22 Não é preciso converter os números F8h e A34h para decimal, somá-los e reconverter o resultado para a base 16. Podemos fazer a conta coluna a coluna. Então F8H + A34H é calculado da seguinte for- ma: 1 + F 8 H + F 8 H + F 8 H + F 8 H A 3 4 H A 3 4 H A 3 4 H A 3 4 H C H 2 C H B 2 C H Subtração Vamos ver a subtração a partir de um exemplo: 27H-1EH. Efetuamos a operação de subtração co- luna a coluna. Na primeira coluna, o diminuidor (E) é superior ao diminuendo (7). Então, adicionamos a base ao diminuendo, executamos a subtração, e há transporte de uma unidade que somamos ao di- minuidor da coluna seguinte. 1 2 7 H 2 7 H - 1 E H - 1 E H 9 H 0 9 H Retirando o número transportado do diminuendo da coluna da esquerda, 2-1, obtemos 1, e subtra- indo 1 do diminuidor, obtemos 0: 14 4 – Conceitos de Lógica Digital Portas e Operações Lógicas AND A operação lógica AND é uma operação que aceita dois operandos. Estes operando são biná- rios simples (base 2). A operação AND é representar com a tabela verdade apresentada abai- xo. As duas colunas a esquerda representam os dois operandos da operação AND Op1 Op2. Em outras palavras, a operação lógica AND é: “se o primeiro operando é 1 e o segundo ope- rando é 1, o resultado é 1, senão o resultado é 0”. OR A operação lógica OR também é uma operação com dois operandos. E a tabela verdade da operação OR tem a seguinte forma: A operação lógica OR pode ser descrita como: “Se o primeiro operando ou o segundo ope- rando (ou os dois) forem 1, o resultado é 1, senão o resultado é 0. Esta operação também é conhecida como ou inclusivo (inclusive-OR). NOT A operação lógica NOT é mostrada pela tabela verdade seguinte: Nela se o operando for 1, o resultado é 0, senão o resultado é 1. Op1 Op2 AND Op1 Op2 0 0 0 0 1 0 1 0 0 1 1 1 Op1 Op2 OR Op1 Op2 0 0 0 0 1 1 1 0 1 1 1 1 Op1 NOT Op1 0 1 1 0 15 XOR A operação lógica XOR que é a abreviação de eXclusive OR (ou exclusivo) e pode ser consi- derado um caso particular da função OR, sendo sua tabela verdade da seguinte forma: O resultado de uma operação XOR é verdade se os valores de suas entradas forem diferentes e será falsa se os valores das entradas forem iguais. NAND A operação lógica ou porta NAND é definida como complemento da porta AND e sua tabela verdade é mostrada a seguir: Correspondência entre Circuitos Eletrônicos e Funções Booleanas Há uma correspondência de um-para-um entre circuitos elétricos e funções booleanas. Para toda e qualquer função booleana é possível desenvolver um circuito eletrônico e vice-versa. Como as fun- ções booleanas precisam apenas dos operadores booleanos AND, OR e NOT, podemos construir qualquer circuito eletrônico usando exclusivamente essas operações. As funções booleanas AND, OR e NOT correspondem aos seguintes circuitos eletrônicos: às portas lógicas AND e OR e ao inversor (NOT). Um fato interessante é que você precisa apenas de um único tipo de porta lógica para implementar qualquer circuito. Esta porta é a NAND, mostrada acima. Para provar que podemos construir qualquer função booleana usando apenas portas NAND, preci- samos mostrar como construir um inversor (NOT), a porta AND e a porta OR de um NAND (já que podemos criar qualquer função booleana usando apenas AND, NOT e OR). Construir um inversor é fácil, apenas conecte as duas entradas, como mostrado na figura acima. Uma vez criado o inversor, construir uma porta AND é fácil - apenas inverta a saída de uma porta NAND. Afinal de contas, NOT (NOT (A AND B)) é equivalente a A AND B. É claro que isto con- some duas portas NAND para se construir uma única porta AND, mas ninguém disse que circuitos construídos apenas com portas NAND seriam ótimos, apenas que isto seria possível de ser feito. Op1 Op2 XOR Op1 Op2 0 0 0 0 1 1 1 0 1 1 1 0 Op1 Op2 NAND Op1 Op2 0 0 0 0 1 0 1 0 0 1 1 1 16 A última porta que precisamos sintetizar é a porta OR. Podemos construir facilmente uma porta OR a partir de portas NAND aplicando os teoremas de DeMorgan. (A or B)' = A' and B' Teorema de DeMorgan. A or B = (A' and B')' Inverta os lados da equação. A or B = A' nand B' Definição da operação NAND. Aplicando essas transformações, obtém-se o circuito da figura acima. Agora você poderia estar se perguntando por que estamos nos preocupando com isto. Afinal de contas, porque simplesmente não usar as portas AND, OR e inversora? Existem duas razões para isso. Primeiro, portas NAND são ge- ralmente menos caras de se construir do que outras portas. Segundo, é também muito mais fácil cons- truir circuitos integrados complexos usando blocos básicos iguais do que construir um circuito inte- grado usando as diferentes portas básicas. Ordem das operações no cálculo de expressões lógicas A ordem das operações é igual as equações algébricas comuns, ou seja: {[( )]} e AND antes do OR _ _ Ex: x OR y AND z o primeiro cálculo a ser realizado é: y AND z e não x OR y x OR(y AND z) É como se a expressão tivesse parênteses. Circuitos Combinatórios As portas estudas até aqui necessitam serem combinadas ou interligadas para produzirem redes lógicas, também chamadas de circuitos combinatórios e que produzirão o resultado esperado pelo projeto, ou seja, um circuito combinatório é definido como um conjunto de portas cuja saída em qualquer instante de tempo é função somente de suas entradas. Nesta categoria temos, por exemplo, o decodificador 3 x 8 apresentado abaixo, onde para cada uma entrada possível teremos apenas uma porta AND com a saída em 1. Este tipo de circuito é utilizado para se endereçar, ou se acessar apenas um componente. 17 Abaixo é apresentada a tabela verdade do decodificador. Circuito Seqüencial Um circuito combinatório que possui um arranjo conhecido por flip-flop passa a ser chamado de circuito seqüencial, isto porque o flip-flop é o elemento básico para se guardar ou armazenar informações. Um circuito para ser considerado flip-flop precisa possuir as seguintes características fundamentais; Ser um elemento biestável, isto é, pode guardar um entre dois possíveis valores permanentemente, enquanto estiver energizado. E possuir dois sinais, um deles sendo o complemento do outro. Flip-Flop tipo D Neste flip-flop quando a entrada Clk estiver em 1 a saída Q será igual a entrada Dado, quando Clk vai para zero, a saída Q vai guardar ou lembrar o ultimo valor que estava em Dado, ou seja, ela ira armazenar o valor que estava na entrada enquanto estiver energizado. 18 5 – Subsistemas de Memória Introdução A memória principal é apenas um dos componentes dentro do subsistema de memória de um com- putador, a seguir analisaremosa hierarquia e os tipos principais de memória. Todos os programas que são executados nos computadores apresentam um princípio denominado localidade de referência. Este princípio estabelece que os programas acessam uma parte relativamente pequena do seu espaço de endereçamento em um dado instante de tempo. Existem dois tipos diferen- tes de localidade: temporal e espacial. A localidade temporal estabelece que se um item é referenciado, ele tende a ser referenciado no- vamente dentro de um espaço de tempo pequeno. Já a localidade espacial estabelece que se um item é referenciado, outros itens cujos endereços estejam próximos dele tendem a ser referenciados rapida- mente. Estas propriedades aparecem nos programas pela sua própria natureza. Como exemplo, podemos citar os loops onde as instruções e os dados tendem a ser acessados de modo repetitivo (localidade temporal). Além disso, se as instruções são acessadas seqüencialmente os programas apresentam loca- lidade espacial. O princípio da localidade é utilizado para implementar o subsistema de memória de um computa- dor e esta organização é denominada hierarquia de memória. A hierarquia de memória prevê a existência de vários níveis de memória e cada um destes níveis possui capacidades de armazenamento e tempos de acesso diferentes. As memórias mais rápidas são também as mais caras, considerando o custo por bit armazenado. Já as memórias mais lentas são me- nos custosas e possuem maior capacidade de armazenamento. Hierarquia de Memória Uma hierarquia de memória pode ser formada por diversos níveis, para qualquer quantidade de ní- veis os dados são copiados entre dois níveis adjacentes. Os níveis superiores são os mais próximos ao processador e os níveis inferiores são mais distantes do processador. A unidade mínima de transferência de dados entre dois níveis adjacentes é chamada de bloco, se a informação solicitada estiver contida num nível ocorre um acerto. Caso contrário, estando a informa- ção ausente, dizemos que ocorreu uma falha. Neste caso, o nível inferior da hierarquia é acessado para que seja possível recuperar o bloco com a informação solicitada. A medida de desempenho da hierarquia de memória é dada pela taxa de acertos, que corresponde aos dados solicitados que estão presentes naquele nível da memória. A taxa de falhas corresponde aos dados não encontrados naquele nível da memória. A penalidade por falha corresponde ao somatório dos tempos necessários para identificar que o dado não está presente no nível procurado, acessar o ní- vel inferior e trazer o bloco para o nível superior da hierarquia e enviar o dado ao processador. 19 Em um sistema de computador tanto a CPU quanto o subsistema de entrada e saída interagem com a memória, dado que cada conteúdo (palavra ou byte) armazenado na memória possui seu próprio en- dereço, a interação é feita através de uma seqüência de leituras e escritas a endereços de memória es- pecíficos. Num sistema de computador existem tipos de memória com diferentes características que formam uma hierarquia, como a hierarquia hipotética ilustrada na figura acima. A hierarquia de memória pode ser analisada segundo suas capacidades de armazenamento, custo por bit e tempo de acesso. Partindo do nível mais inferior da figura, as memórias secundárias são ca- pazes de armazenar uma grande quantidade de informação, seu custo por bit é menor e o seu tempo de acesso é relativamente maior do que as memórias dos níveis superiores. No segundo nível, está a memória principal, ela é capaz de armazenar uma quantidade menor de in- formação, seu custo por bit é maior e seu tempo de acesso é menor do que as memórias secundárias. No nível mais superior estão as memórias cachê e estas memórias são as mais rápidas e com o maior custo por bit. Por serem muito caras as memórias cache são pequenas. Isto é, são as que têm menor capacidade de armazenamento em relação as demais. Qualquer que seja a quantidade de níveis utilizados na hierarquia de memória os dados são sempre copiados entre os níveis adjacentes. Existem diversas políticas de gerenciamento para a memória primária ou memória principal. O ge- renciamento de memória usa regras ou políticas de gerenciamento para: • busca. Determina quando um bloco de informação deve ser transferido da memória secundária para a memória principal; • armazenamento. Determina onde o bloco de informação deve ser colocado na memória principal; • substituição. Determina qual bloco de informação deve ser substituído por um novo bloco. Existem muitos esquemas diferentes de gerenciamento de memória. A seleção de um esquema, em particular, depende de muitos fatores, mas em especial depende do suporte de hardware do sistema. CLASSIFICAÇÃO DAS MEMÓRIAS Quanto à leitura e escrita, as memórias podem ser classificadas como: R/W - Read and Write (memória de leitura e escrita), comumente (e impropriamente) chamada de RAM (Random Access Memory ou memória de acesso aleatório), embora não seja a única RAM, este tipo de memória permite operações de escrita e leitura pelo usuário e pelos programas. Seu tempo de acesso é da ordem de dezenas de nano segundos e independe do endereço acessado. É construída com tecnologia de semicondutores (bipolar, CCD), Existem basicamente dois tipos de memória RAM, o tipo dinâmico - DRAM ("Dynamic Random Access Memory") que são módulos que possuem alta capacidade, podendo comportar grandes quanti- dades de dados. No entanto, o acesso a essas informações costuma ser mais lento que nas memórias estáticas. Em compensação tem preços bem menores que as memórias do tipo estático, pois utiliza uma tecnologia mais simples. E o tipo estático que é chamado SRAM ("Static Random Access Me- mory") e é muito mais rápido que as memórias DRAM, porém armazenam menor quantidade de da- dos. A memória RAM é volátil, ou seja, perde a informação armazenada quando deixa de ser energizada. Os módulos, também chamados "pentes" de memória RAM variam em capacidade de armazenamen- to e em velocidade. Em princípio, quanto mais memória RAM o computador tiver, tanto mais rápido será o seu funcionamento e mais facilmente ele suportará a execução de funções simultâneas. Os ta- manhos de memória RAM foram aumentando gradativamente: 16, 32, 64, 128, 256, 512 MB, e assim por diante. A seguir, são mostrados os tipos de encapsulamento de memórias mais usados nos PCs: EDO é a sigla para (Extended Data Out). Trata-se de um tipo de memória que chegou ao mercado no início de 1997 e que possui como característica essencial a capacidade de permitir ao processador acessar um endereço da memória ao mesmo tempo em que esta ainda estava fornecendo dados de uma 20 solicitação anterior. Esse método permite um aumento considerável no desempenho da memória RAM. Esse tipo de memória precisava ser usada com pentes em pares. Isso porque os processadores daque- la época (Pentium) podiam acessar 64 bits por vez, mas cada pente de memória EDO trabalhava ape- nas com 32 bits. No caso de processadores 486, esse acesso era feito a 32 bits e assim um único pente poderia ser usado. Memórias EDO usavam o encapsulamento SIMM-72, visto em um tópico mais à frente. - DIP (Dual In Line Package) - esse é um tipo de encapsulamento de memória antigo e que foi utili- zado em computadores XT e 286, principalmente como módulos EPROM (que eram soldados na pla- ca). Também foi muito utilizado em dispositivos com circuitos menos sotisticados; - SIPP (Single In Line Pin Package) - esse tipo encapsulamento é uma espécie de evolução do DIP. A principal diferença é que esse tipo de memória possui, na verdade, um conjunto de chips DIP que formavam uma placa de memória (mais conhecida como pente de memória). O padrão SIPP foi apli- cado em placas-mãe de processadores 286 e 386; - SIMM (Single In LineMemory Module) - o encapsulamento SIMM é uma evolução do padrão SIPP. Foi o primeiro tipo a usar um slot (um tipo de conector de encaixe) para sua conexão à placa- mãe. Existiram pentes no padrão SIMM com capacidade de armazenamento de 1 MB a 16 MB. Este tipo foi muito usado nas plataformas 386 e 486 (primeiros modelos). Na verdade, houve dois tipos de padrão SIMM: o SIMM-30 e o SIMM-72. O primeiro é o descrito no parágrafo anterior e usava 30 pinos para sua conexão. O segundo é um pouco mais evoluído, pois usa 72 pinos na conexão e armazena mais dados (já que o pente de memória é maior), variando sua capacidade de 4 MB a 64 MB. O SIMM-72 foi muito utilizado em placas-mãe de processadores 486, Pentium e em equivalentes deste; - DIMM (Double In Line Memory Module) - esse é o padrão de encapsulamento que surgiu após o tipo SIMM. Muito utilizado em placas-mãe de processadores Pentium II, Pentium III e em alguns mo- delos de Pentium 4 (e processadores equivalentes de empresas concorrentes), o padrão DIMM é com- posto por módulos de 168 pinos. Os pentes de memória DIMM empregam um recurso chamado ECC (Error Checking and Correction - detecção e correção de erros) e tem capacidades mais altas que o padrão anterior: de 16 a 512 MB. As memórias do tipo SDRAM (Synchronous Dynamic Random Ac- cess Memory) utilizam o encapsulamento DIMM, e é um tipo de memória que permite a leitura ou o armazenamento de dois dados por vez (ao invés de um por vez, como na tecnologia anterior). Além disso, a memória SDRAM opera em freqüências mais altas, variando de 66 MHz a 133 MHz. A memória do tipo DDR (Double Data Rate), atinge taxas de transferência de dados de duas vezes o ciclo de clock, podendo chegar a 2,4 GB por segundo na transmissão de dados. ROM - Read Only Memory ou memória apenas de leitura Esta memória permite apenas a leitura e uma vez gravada não pode mais ser alterada. Também é de acesso aleatório (isto é, é também uma RAM), mas não é volátil. É utilizada geralmente por fabrican- tes para gravar programas que não se deseja permitir que o usuário possa alterar ou apagar acidental- mente (tal como por ex..a BIOS - Basic Input Output System e microprogramas de memórias de con- trole). Quando se liga uma máquina, é da ROM que vem os programas que são carregados e processa- dos no "boot" (na inicialização o hardware aponta automaticamente para o primeiro endereço da ROM). Desta forma, parte do espaço de endereçamento da MP é ocupado por ROM. A ROM é mais lenta que a R/W e é barata, porém o processo produtivo depende de ser programada por máscara ("mask programmed") em fábrica e devido ao alto custo da máscara somente se torna econômica em grandes quantidades. Obs.: Boot (ou bootstrap loader) é o processo de inicialização e carga dos programas básicos de um computador, automática, sem intervenção externa. Este termo vem de uma analogia com um processo (impossível) que seria uma pessoa se levantar puxando-se pelos cordões de suas próprias botas. 21 PROM - Programmable Read Only Memory ou memória apenas de leitura, programável. Esta memó- ria é uma ROM programável (em condições e com máquinas adequadas, chamadas queimadores de PROM) e geralmente é comprada "virgem" (sem nada gravado), sendo muito utilizada no processo de testar programas no lugar da ROM, ou sempre que se queira produzir ROM em quantidades pequenas. Uma vez programada (em fábrica ou não), não pode mais ser alterada. EPROM - Erasable Programmable Read Only Memory ou memória apenas de leitura, programável (com queimadores de PROM) e apagável (com máquinas adequadas, à base de raios ultra-violeta). Esta memória é uma PROM apagável. Tem utilização semelhante à da PROM, para testar programas no lugar da ROM, ou sempre que se queira produzir ROM em quantidades pequenas, com a vantagem de poder ser apagada e reutilizada. EEPROM (ou E2PROM) - Electrically Erasable Programmable Read Only Memory ou memória a- penas de leitura, programável e eletronicamente alterável. Também chamada EAROM (Electrically Alterable ROM). Esta memória é uma EPROM apagável por processo eletrônico, sob controle da UCP, com equipamento e programas adequados. É mais cara e é geralmente utilizada em dispositivos aos quais se deseja permitir a alteração, via modem, possibilitando a carga de novas versões de pro- gramas à distância ou então para possibilitar a reprogramação dinâmica de funções específicas de um determinado programa, geralmente relativas ao hardware (p.ex., a reconfiguração de teclado ou de modem, programação de um terminal, etc). Arquitetura de Computadores 1 Componentes do Computador e Modelo de Von Neumann Arquitetura de Computadores 2 1 Introdução • Um computador é composto por blocos convencionalmente chamados de: – Memória – Unidades Operacionais – Unidade de Controle – Dispositivos de entrada e saída • São compostos de dispositivos de menor complexidade tais como registradores, contadores, multiplexadores, seletores, decodificadores, somadores e portas lógicas (and, or, inv, ...) Unidade Central de Processamento CPU Arquitetura de Computadores 3 1. Introdução • Registadores são elementos digitais com capacidade de armazenar dados. Tem associados sinais de carga que determinam quando serão armazenados novos conteúdos nesses elementos. São compostos por latches ou flip-flops. • Contadores, Multiplexadores, seletores, decodificadores, somadores e portas lógicas são capazes de operar com dados fornecendo como resultado o novo dado da operação que realizam. • Elementos digitais necessitam ser ativados ou habilitados por sinais de controle definidos pela unidade de controle. Arquitetura de Computadores 4 2 Elementos Básicos de um Computador Controle (contadores, flip- flops, latches, lógica aleatória, ...) Memória de dados e de programa Unidade operacional (registradores, contadores, Unidade aritmética e lógica (ULA), ...) Entrada e Saída Arquitetura de Computadores 5 2 Elementos Básicos de um Computador Memória de Dados e programas Banco de registradores Unidade de controle (gera os sinais de controle) Program counter Arquitetura de Computadores 6 3 Princípio Básico de Funcionamento • Cada computador tem um conjunto de operações e convenções único para determinar as posições dos dados os quais a operação será realizada. • Os vários computadores diferem-se nas operações específicas que fornecem e nos métodos que eles usam para para referenciar dados que serão manipulados por uma operação . Operação, determinada instrução: Operação Operandos • Operação: especifica a função que será desempenhada • Operandos: fornece a maneira de calcular a posição atual dos dados com o qual a operação será realizada Arquitetura de Computadores 7 3 Princípio Básico de Funcionamento • Um programa é constituído por uma sequência pré- determinada de instruções que devem ser seguidas para que seja atingido o objetivo computacional. • Programa armazenado na memória de programa, também chamada memória da máquina. • As instruções são executadas em uma sequencia determinada por suas posições de memória. • O endereço representa uma posição particular na memória e pode ser formado de várias maneiras. (direto, indireto) Arquitetura de Computadores 8 3 Princípio Básico de Funcionamento • A unidade lógica e aritmética realiza ações indicadas nas instruções, executando operações numéricas (aritméticas) e não numéricas (lógicas). • Unidade central de processamento (CPU) (unidade de controle e unidade opercional) é responsável pelo: – Busca da instrução na memoria de programa – Decodificação da instrução (tabela dos codicos das instruções, especifica paracada microprocessador) – Execução das Instruções (unidade operacional controlada pelos sinais de controle) Arquitetura de Computadores 9 3 Princípio Básico de Funcionamento • Contador de instrução (program counter) PC (busca da instrução): – Contem a posição (endereço da memória de programa) da proxima execução a ser executada. – Registrador localizado na CPU • Registrador de Instrução (busca da instrução) – Contem a instrução (codigo) lida da memória e que será executada. • A instrução é decodificada (interpretada) e uma sequencia de sinais são gerados para a execução da instrução. Arquitetura de Computadores 10 4 Barramento • Dados são transferidos entre os diversos elementos de um computador por caminhos físicos chamado de barramento. • Arquitetura Von Neumann: mesmo barramento para os dados e para as instruções. (Gargalo de Von Neumann) • Do ponto de vista da arquitetura, um barramento de caracteriza pela sua largura em bits. • A largura dos bits do barramento deve corresponder ao comprimento dos elementos (dados, endereço, controle) que são por ele transportados. Arquitetura de Computadores 11 5 Memória • A memória é formada por elementos armazenadores de informação. (latches) • Uma memória esta dividida em palavras (words) • Cada palavra ocupa uma posição de memória e é identificada univocamente por um endereço. • O conteúdo armazenado nas palavras da memória tanto pode representar dados como instruções. Memória Reg, endereço da mem (REM) Reg, dados da mem (RDMin) Reg, dados da mem (RDMout) Read Write Arquitetura de Computadores 12 6 Unidade Operacional • Unidade Operacional (Bloco Operacional): executa as transformações sobre os dados especificadas pelas instruções. • Porte do processador: – Número de registradores – Tamanho dos registradores – Quantidade e tipo de operações da Unidade lógica e aritmética (ULA) realiza. – Desempenho, paralelismo na execução, etc... Arquitetura de Computadores 13 7 Unidade Aritmética e Lógica (ULA) • Realiza operações aritméticas e lógicas sobre um ou mais operandos. • Exemplo: soma de dois operandos, negação de um operando, AND de dois operandos, deslocamento para a direita, esquerda, etc... • As operações da ULA são normalmente muito simples. Funções mais complexas são realizadas pela ativação sequencial de funções mais simples. (Ex. multiplicação) • A ULA fornece o resultado da operação realizada e também alguns codigos de condição (overflow, sinal, carry, zero, ...) Arquitetura de Computadores 14 7 Unidade Aritmética e Lógica (ULA) • Os sinais de controle selecionam a operação da ULA • ULA se caracteriza pelo comprimento em bit dos operandos, número e tipo de operações, código de condições gerados. Operando A Operando B Resultado controle códigos de condição Arquitetura de Computadores 15 8 Acumulador • Registrador que tem função armazenar um operando e / ou resultado fornecido pela ULA. • Nos computadores mais simples, é encontrado apenas um acumulador. Em arquiteturas mais complexas, vários registradores podem desempenhar a função de acumulador. • O registrador acumulador se caracteriza ao nível de arquitetura pelo seu comprimento em bits. Arquitetura de Computadores 16 9 Unidade de Controle • Produz sinais de controle que gerenciam o fluxo interno de dados e o instante preciso em que ocorre a transferência entre uma unidade e outra. • Cada sinal de controle comanda uma microoperação como: – carga em um registrador, – seleção de um dado para a entrada em um determinado componente – Ativação da memória – Seleção de uma operação da ULA – Habilitação de um circuito lógico Arquitetura de Computadores 17 9 Unidade de Controle • Unidade de Controle são máquinas de estados finitas (FSM) realizadas por lógica sequencial composto por latches e flip-flops e portas combinacionais. • Exemplo de duas organizações de lógica sequencial: – Organização convencional: unidade de controle composta por componentes digitais tais como flip-flops, contadores, decodificadores, que geram sequencialmente e nos instantes de tempo adequeados todos os sinais de controle necessários a atividade da unidade operacional, do sistema de entrada e saída e da memória. – Organização Microprogramada: os sinais de controle são armazenados numa memória especial chamada de memória de controle. Vários sinais de controle são buscados a cada acesso a memoria de controle. Esses sinais são agrupados em longas palavras chamadas microinstrução. Arquitetura de Computadores 18 9 Unidade de Controle • RI : registrador de Instrução • RST : registrador de estado Unidade de Controle Registador de Instrução Registrador de Estado Sinais de controle Arquitetura de Computadores 19 10 Alguns Registradores • PC (apontador de instrução): caracteriza pelo seu comprimento em bits. Deve poder acessar toda a memória de programa. Guarda o endereço da memória de programa onde a instrução será lida. • RI (registrador de instrução): armazena a instrução lida da memória de programa. O comprimento em bits de RI depende do tamanho e codificação das instruções do computador. • RST (registrador de estado): armazena códigos de condição gerados pela ULA ou por outras unidades como interrupção de dispositivos de E/S. Em função do conteúdo do registrador a unidade de controle gera ou não os sinais de controle. Arquitetura de Computadores 20 11 Conjunto de Instruções • Uma instrução é um conjunto de bits devidamente codificados que indica ao computador que sequencia de microoperações ele deve realizar. • Instruções são realizadas por semelhança de propósito e formato. • Classificação: – Instruções de transferência de dados (MOV) – Instruções Aritméticas e Lógicas (ADD, OR, ...) – Instruções de Teste e Desvio (JMP, JNZ, ...) • O conjunto de todas as instruções que um computador reconhece e pode executar é chamado de conjunto de instruções desse computador. Arquitetura de Computadores 21 12 Ciclo de Busca-Decodificação-Execução • Busca-Decodificação-Execução de Instruções • Busca: – Copiar o PC para o registrador de endereços da memória (REM) – Ler uma instrução da memória – Copiar o registrador de dados da memória (RDM) para o registrador de instrução (RI) – Atualizar o pontador do PC • Decodificação – Determinar qual instrução a ser realizada, normalmente implementada por lógica combinacional Arquitetura de Computadores 22 12 Ciclo de Busca-Decodificação-Execução • Execução: – Cálculo do endereço dos operandos – Busca dos operandos na memória – Seleção da operação da ULA – Carga nos registradores – Escrita de operandos na memória – Atualização do PC para desvios. Arquitetura de Computadores 23 13 Programação de um Processador • Linguagem que o processador entende é a linguagem de máquina. • Linguagem de máquina é uma linguagem numérica (binária) que representa a codificação do conjunto de instruções. • Um programa descrito em linguagem simbólica pode ser traduzido em linguagem de máquina para facilitar o desenvolvimento dos programas pelo usuário. • Formato das instruções Operação Operando1 Operando2 .... ... Conforme a arquitetura de n endereços, teremos n operandos. “Assembly 8086” Faculdades de Tecnologia CARLOS DRUMMOND DE ANDRADE Tecnologia em Análise e Desenvolvimento de Sistema Ronaldo Barbato de Oliveira Arquitetura de Computadores Introdução à linguagem assembly do 8086 A sintaxe assembly do 8086 • A linguagem montadora não é sensível à letra maiúscula ou minúscula • Para facilitar a compreensão do textodo programa, sugere-se: – uso de letra maiúscula para código; – uso de letra minúscula para comentários. Introdução à linguagem assembly do 8086 Declarações (statements): • Instruções, que são convertidas em código de máquina • Diretivas, que instruem o montador a realizar alguma tarefa específica: – Alocar espaço de memória para variáveis; – Criar uma sub-rotina (procedure ou procedimento). Introdução à linguagem assembly do 8086 • Formato de uma declaração (linha de programa): [Nome:] [Cod. oper.] [Operando(s)] [;Comentário] Exemplo: INICIO: MOV CX,5h ;inicializar contador Observação: A separação entre os campos deve ser do tipo <espaço> ou <tab>. Introdução à linguagem assembly do 8086 Campo Nome: – Pode ser um rótulo de instrução, um nome de sub-rotina, um nome de variável, contendo de 1 a 31 caracteres, iniciando por uma letra ou um caracter especial e contendo somente letras, números e os caracteres especiais ? . @ _ : % Exemplos: nomes válidos nomes inválidos LOOP1: DOIS BITS .TEST 2abc @caracter A42.25 SOMA_TOTAL4 #33 Observação: O Montador traduz os nomes por endereços de memória. Introdução à linguagem assembly do 8086 Campo de Código de Operação: – Contem o código de operação simbólico (mnemônico) – No caso de diretivas, contem o código de pseudo- instrução Exemplos: instruções diretivas MOV .MODEL ADD .STACK INC nome PROC JMP Introdução à linguagem assembly do 8086 Campo de operandos: • Instruções podem conter 0, 1 ou 2 operandos no 8086. Exemplos: NOP ; sem operandos: instrui para fazer nada INC AX ; um operando: soma 1 ao conteúdo de AX ADD A,2d ; dois operandos: soma 2 ao conteúdo da ; palavra de memória A ADD A,2 Introdução à linguagem assembly do 8086 Campo de operandos (cont.): • No caso de instruções de dois operandos: – o primeiro, operando destino: registrador ou posição de memória onde o resultado será armazenado, o conteúdo inicial será modificado; – o segundo, operando fonte: não modificado pela instrução; – os operandos são separados por uma vírgula. • No caso de diretivas, o campo de operandos contem mais informações acerca da diretiva. Introdução à linguagem assembly do 8086 Campo de Comentário: – Um ponto-e-vírgula ( ; ) marca o início deste campo; – O Montador ignora tudo após o este marcador até o fim da linha; – Comentários são opcionais, mas imprescindíveis. • OBS.: Uma boa prática de programação é comentar tudo e incluir a informação acerca da idéia por trás da codificação (o algorítmo). Introdução à linguagem assembly do 8086 Campo de Comentário (cont.): • Exemplos: MOV CX,0 ;movimenta 0 para CX (óbvio!) MOV CX,0 ;CX conta no. de caracteres, ;inicialmente vale 0 ; (linhas em branco: separação) ; ; inicialização dos registradores (linha inteira de comentário) Introdução à linguagem assembly do 8086 Formato de dados, variáveis e constantes • Números: Exemplos: – binário: 1110101b ou 1110101B – decimal: 64223 ou 64223d ou 64223D – hexa: 64223h ou 64223H, 0x64223 Introdução à linguagem assembly do 8086 • Exemplos de números ilegais: – 1,234 caracter estranho (vírgula) – FFFFh não começa por número de 0 a 9 difícil distinguir do nome de uma variável – 1B4D não termina com h ou H Introdução à linguagem assembly do 8086 • Caracteres ASCII e strings: – Caracteres isolados ou strings de caracteres devem estar escritos dentro de aspas simples ( ‘ ) ou duplas ( “ ). Exemplos: “ A” ou ‘ A ’ ‘ola, como vai’ “EXEMPLO” Introdução à linguagem assembly do 8086 Variáveis: • Variável é um nome simbólico para um dado atualizável pelo programa. – Cada variável possui um tipo e é associada a um endereço de memória; – Usa-se pseudo-instruções para definir o tipo da variável; – O Montador atribui o endereço de memória. Introdução à linguagem assembly do 8086 PSEUDO-INSTRUÇÃO SIGINIFICADO DB define byte (8 bits) DW define word (16 bits, 2 bytes consecutivos) DD define doubleword (2 palavras, 4 bytes consecutivos) DQ define quadword (4 palavras, 8 bytes consecutivos) DT define ten bytes (10 bytes consecutivos) Introdução à linguagem assembly do 8086 • Definição de variáveis de tipo byte: Nome DB valor_ inicial Exemplos: Alfa DB 0 ;equivale a 00h A DB 10h B DB 0150h ;ilegal, por que? BIT DB ? ;não inicializada Introdução à linguagem assembly do 8086 • Definição de variáveis de tipo word: Nome DW valor_inicial Exemplos: WORD1 DW 0h ; equivale a 0000h CONTA Dw 0150h ; OK!, por que? C DW ? ; não inicializada WORD1 DW 1234h ; byte baixo 34h, endereço WORD1 ; byte alto 12h endereço WORD1+1 Introdução à linguagem assembly do 8086 • Array: sequência de bytes ou words consecutivos na memória – Armazenar dados relacionados; – Armazenar caracteres ASCII organizados (ex: texto). Exemplos: BYTE_ARRAY DB 10h,20h,30h WORD_ARRAY DW 1000h,123h,0h,0FFFFh • Um array pode conter um string de caracteres, sendo definido como: LETRAS DB ‘abC’ ; e´ equivalente aos caracteres ASCII LETRAS DB 61h,62h,43h ;depende se maiúscula ou ; minúscula Introdução à linguagem assembly do 8086 • Combinação de caracteres e números numa mesma definição: MENSAGEM DB ‘Alo!’, 0Ah,0Dh,’$’ OBS.: Para alguns serrviços da BIOS o caracter '$' marca o fim de um string de caracteres (e não é exibido). Introdução à linguagem assembly do 8086 • Constantes: é um nome simbólico para um dado de valor constante, que seja muito utilizado num programa. – Para atribuir um nome a uma constante, utiliza-se a pseudo-instrução EQU (equates -> igual a) e a sintaxe: Nome EQU valor_da_constante Exemplos: LF EQU 0Ah ;caracter Line Feed como LF CR EQU 0Dh ;caracter Carriage return como CR LINHA1 EQU ‘Digite seu nome completo’ MENSAGEM DB LINHA1,LF,CR Observação: Constantes não geram código de máquina e nem “ocupam” espaço de memória em tempo de execução. Introdução à linguagem assembly do 8086 • Algumas instruções básicas do 8086 – MOV destino, fonte • Usada para transferir dados entre: – registrador e registrador – registrador e uma posição de memória – mover um número diretamente para um registrador ou posição de memória Introdução à linguagem assembly do 8086 • Instrução MOV Operando Operando destino fonte Registrador Registrador Posição dados segmento memória Registrador Dados sim sim sim Registrador sim não sim Segmento Posição sim sim não memória Constante sim não sim Introdução à linguagem assembly do 8086 • Exemplos de instruções MOV válidas: MOV AX,WORD1 ;movimenta o conteúdo da posição de ;memória WORD1 para o registrador AX MOV AH,’A’ ;transfere o caracter ASCII ‘A’ para AH MOV AH,41h ;idem anterior: 41h corresponde ao caracter A MOV AH,BL ;move o conteúdo do byte baixo de BX ;o byte alto de AX MOV AX,CS ;transfere cópia do conteúdo de CS para AX Introdução à linguagem assembly do 8086 • MOV AX,WORD1 • Obs: para a instrução MOV não é permitido operar de posição de memória para posição de memória diretamente, por motivos técnicos do 8086. Antes Depois AX AX 0006h 8FFFh WORD1 WORD1 8FFFh 8FFFh Introdução à linguagem assembly do 8086 • Por exemplo: MOV WORD1,WORD2 ;instrução inválida. Esta restrição é ;contornada como segue ; MOV AX,WORD2 ;primeiro o conteúdo de WORD2 vai para AX MOV WORD1,AX ;depois, o conteúdo de AX é movido para a ;posição de memória WORD1 Introdução à linguagem assembly do 8086 XCHG destino, fonte • Usada para troca de dados (nos dois sentidos) entre: – registrador e registrador – registrador e uma posição de memória – não é permitido trocas diretas entre posições de memória Introdução àlinguagem assembly do 8086 • XCHG destino, fonte Operando Operando destino fonte Registrador Posição dados memória Registrador Dados sim sim Registrador não não Segmento Posição sim não memória Introdução à linguagem assembly do 8086 • Exemplos de instruções válidas: XCHG AX, WORD1 ;troca o conteúdo da posição de memória ; WORD1 com o do registrador AX XCHG AH, BL ;troca o conteúdo do byte baixo de BX ;com o do byte alto de AX XCHG AX,BX Antes Depois AX BX 0006h FFFFh AX BX FFFFh 0006h Introdução à linguagem assembly do 8086 • ADD destino,fonte • SUB destino,fonte – Usadas para adicionar (ou subtrair) dados entre: • registrador e registrador • registrador e uma posição de memória • adicionar (ou subtrair) um número diretamente a (de) um registrador ou posição de memória Operando Operando destino fonte Registrador Posição dados memória Registrador Dados sim sim Posição sim não memória Constante sim sim Introdução à linguagem assembly do 8086 • Exemplos de instruções válidas: ADD AX,BX ;soma o conteúdo de BX com AX, resultado em AX ADD AX,WORD1 ;soma o conteúdo da posição de memória ;WORD1 a AX e resultado em AX SUB WORD2,AX ;subtrai o conteúdo de AX do conteúdo da ;posição de memória WORD2, resultado em ;WORD2 SUB BL,5 ;subtrai a quantidade 5 decimal do conteúdo ; de BL Introdução à linguagem assembly do 8086 Observações: ADD BYTE1,BYTE2 ;instrução inválida esta restrição ; é contornada como segue MOV AL,BYTE2 ;primeiro o conteúdo de BYTE2 vai para AL ADD BYTE1,AL ;depois, o conteúdo de AL é somado ao da ; posição de memória BYTE1, resultado final ; em BYTE1 O resultado de SUB, se for negativo, estará armazenado no registrador destino em complemento de 2. Introdução à linguagem assembly do 8086 • INC destino • DEC destino – Usadas para adicionar 1 (incrementar) ou subtrair 1 (decrementar) ao/do conteúdo de: • um registrador; • uma posição de memória. Exemplos: INC CX ;incrementa o conteúdo de CX INC WORD1 ;incrementa conteúdo posição memória WORD1 DEC BYTE2 ;decrementa conteúdo posição de memória BYTE2 DEC CL ;decrementa o conteúdo de CL (byte baixo de CX) Introdução à linguagem assembly do 8086 • NEG destino – Usada para substituir o conteúdo destino pelo seu complemento de 2, operando sobre: • um registrador; • uma posição de memória. Exemplos: NEG BX ; gera o complemento de 2 ; do conteúdo de BX NEG WORD1 ; idem, no conteúdo da posição de ; memória WORD1 Introdução à linguagem assembly do 8086 • Tradução de expressões matemáticas em Linguagem de Alto Nível para Linguagem Montadora Exemplo1: B = A MOV AX,A ; transfere o conteúdo da posição de ; memória A para AX e MOV B,AX ; transfere AX para a posição de ; memória B Introdução à linguagem assembly do 8086 Exemplo 2: A = 5 - A NEG A ; gera o complemento de 2 da posição ; de memória A e ADD A,5 ; realiza (-A) + 5, que equivale a 5 - A Exemplo 3: A = B - 2A MOV AX,B ; AX contem a variável B SUB AX,A ; AX contem B - A SUB AX,A ; AX contem B - 2A MOV A,AX ; movimenta o resultado para A Estrutura de um programa em Linguagem Montadora • Segmento de dados – Contem a definição e declaração das variáveis. – Pode-se também fazer a atribuição de símbolos para constantes. Sintaxe: .DATA Exemplo: .DATA WORD1 DW A8h BYTE1 DB 5 MENSAGEM DB ‘Isto e uma mensagem’ LF EQU 0Ah Estrutura de um programa em Linguagem Montadora • Segmento de pilha (stack segment) – Reserva um bloco de posições de memória consecutivas para armazenar a pilha. – Deve ter espaço suficiente para suportar a pilha no seu máximo tamanho. Sintaxe: .STACK tamanho Exemplo: .STACK 100h ; reserva 100h bytes para a área ; de pilha, um tamanho razoável ; para a maioria das aplicações não ; recursivas Estrutura de um programa em Linguagem Montadora • Segmento de código – Contem propriamente as instruções do programa. – Dentro do segmento de código, as instruções são organizadas em procedimentos ou sub-rotinas. Sintaxe: .CODE Estrutura de um programa em Linguagem Montadora Exemplo: .CODE nome PROC ; ;corpo da procedure -> instruções ; nome ENDP ; ;outras procedures seguem abaixo, se existirem onde: nome -> identificação da procedure PROC e ENDP -> pseudo-instruções usadas para delimitar a procedure para um programa simples, não há necessidade de se definir a procedure. Estrutura de um programa em Linguagem Montadora Exemplo de uma estrutura de programa assembly completa TITLE nome_do_programa .MODEL SMALL .STACK 100h .DATA ; ;definição dos dados: variáveis e constantes ; .CODE EXEMPLO PROC ; ;seqüência de instruções ; EXEMPLO ENDP ; ;segue outras procedures ; END EXEMPLO Obs: se não houver definição de procedure, usa-se apenas END. Introdução à linguagem assembly do 8086 Instruções de entrada e saída IN e OUT -> instruções Assembly para acessar portas de E/S para periféricos Não são utilizadas na maioria das aplicações: os endereços das portas de E/S variam conforme o modelo do PC é mais fácil utilizar o SO (DOS) ou o BIOS para Funções de E/S Para acessar as rotinas de E/S do BIOS ou DOS utiliza-se a instrução: INT número_de_interrupção Introdução à linguagem assembly do 8086 Observação: Em uma chamada do BIOS (ou função do DOS) o programa em curso é interrompido, passando o controle para o DOS, que realiza a operação de E/S e retorna o controle para o programa. Exemplo: INT 21h ; acessa um grande número de funções ; de E/S do DOS Introdução à linguagem assembly do 8086 • Algumas funções DOS de E/S Função 1h: Entrada de um caracter simples pelo teclado Acesso: AH = 1h Resultado: AL = código ASCII do caracter digitado no teclado Função 2h: Exibição de caracter simples no monitor de vídeo Acesso: AH = 2h DL = código ASCII do caracter a exibir Resultado: exibição na tela do monitor Introdução à linguagem assembly do 8086 Exemplos: Trecho padrão de programa para providenciar a entrada de um caracter ASCII pelo teclado: MOV AH,1h ;prepara para entrar caracter pelo ; teclado o processador espera até ; que o usuário digite o caracter ; desejado INT 21h ; após a digitação, caracter ASCII ; em AL. Se um caracter não-ASCII ; for digitado, AL = 0h Obs: o caracter teclado também aparece no monitor (eco), por causa do DOS. Instruções de controle de fluxo Instruções de laço (loop) e de salto (jump) permitem que: – o programa "tome" certas decisões, alterando seu curso; – certas partes de um programa sejam repetidas um número controlado de vezes. Saltos Condicionais Jxxx rótulo_de_destino xxx define uma condição dependente de algum dos Flags de Estado Se a condição xxx é verdadeira: - a próxima instrução a ser executada é aquela definida pelo rótulo_de_destino; - a CPU ajusta o registrador IP para apontar para a posição de memória dada por rótulo_de_destino. Se a condição xxx é falsa: - a próxima instrução é aquela que imediatamente segue o salto. Saltos Condicionais Faixa de endereçamento do rótulo_de_destino: - deve preceder Jxxx não mais do que 126 bytes; - deve suceder Jxxx não mais do que 127 bytes. Há três classes de saltos condicionais: - saltos sinalizados: dependem de um resultado na forma de um número sinalizado; - saltos não-sinalizados: dependem de um resultado na forma de um número não-sinalizado; - saltos de Flag simples: que dependem do status de algum dos Flags. Obs.: A instrução Jxxx não altera nenhum Flag. Saltos Condicionais Tipos de saltos condicionais Saltos sinalizados Símbolo Descrição Condições JG ou JNLEsalto se maior do que OU salto se não menor do que ou igual a ZF = 0 E SF = OF JGE ou JNL salto se maior do que ou igual a OU salto se não menor do que SF = OF JL ou JNGE salto se menor do que OU salto se não maior do que ou igual a SF ≠ OF JLE ou JNG salto se menor do que ou igual a OU salto se não maior do que ZF = 1 OU SF ≠ OF Saltos Condicionais Tipos de saltos condicionais Saltos não-sinalizados Símbolo Descrição Condições JÁ ou JNBE salto se acima de OU salto se não abaixo de ou igual a CF = 0 E ZF = 0 JAE ou JNB salto se acima de ou igual a OU salto se não abaixo de CF = 0 JB ou JNAE salto se abaixo de OU salto se não acima de ou igual a CF = 1 JBE ou JNA salto se abaixo de ou igual a OU salto se não acima de CF = 1 OU ZF = 1 Saltos Condicionais Tipos de saltos condicionais Saltos de Flag simples Símbolo Descrição Condições JE ou JZ salto se igual OU salto se igual a zero ZF = 1 JNE ou JNZ salto se não igual OU salto se não igual a zero ZF = 0 JC salto se há VAI-UM (carry) CF = 1 JNC salto se não há VAI-UM (not carry) CF = 0 JO salto se há overflow OF = 1 JNO salto se não há overflow OF = 0 JS salto se o sinal é negativo SF = 1 JNS salto se o sinal é não-negativo (+) SF = 0 JP ou JPE salto se a paridade é PAR (even) PF = 1 JNP ou JPO salto se a paridade é IMPAR (odd) PF = 0 Saltos Condicionais Diferença entre Saltos sinalizados e não-sinalizados a) Trecho de programa que supõe quantidades não-sinalizadas: ;supondo que AX contem 7FFFh e BX contem 8000h ... CMP AX,BX JA PT2 ;o salto não ocorre porque 7FFFh < 8000h ... ... PT2: MOV ... ;continuação do programa Saltos Condicionais Diferença entre Saltos sinalizados e não-sinalizados b) Trecho de programa que supõe quantidades sinalizadas: ;supondo que AX contem 7FFFh e BX contem 8000h ... CMP AX,BX JG PT2 ;o salto ocorre porque 7FFFh (+) > 8000h (-) ... ... PT2: MOV ... ;continuação do programa Salto Condicionais Exemplo: Supondo que AX e BX contenham números sinalizados, escreva um trecho de programa que coloque o maior deles em CX. ... MOV CX,AX ;AX já é pressuposto ser o maior deles CMP AX,BX JNL ABAIXO ;poderia ser também JGE ABAIXO MOV CX,BX ;caso BX seja de fato o maior deles ABAIXO: ... ;continuação do programa ... Salto Incondicional JMP rótulo_de_destino Rótulo_de_destino é uma posição no programa, no mesmo segmento de código onde JMP aparece Não há restrição de faixa de endereçamento como em JXXX JMP pode ajudar a solucionar o problema de faixa de endereçamento das instruções JXXX Como? Salto Incondicional Exemplo: trecho utilizando JMP para resolver a restrição no alcance de JXXX TOPO: ... ; mais do que 126 bytes de instruções: limitação ; para JXXX ... ; corpo de algum laço ; DEC CX ; se Zero termina o laço JZ CONTINUA JMP TOPO CONTINUA: MOV ... ; o programa continua ... Instrução de laço Repetição LOOP rótulo_de_destino Tem como contador implícito o registrador CX, que deve ser inicializado antes do laço. Salta para rótulo_de_destino enquanto o conteúdo de CX não for zero. Quando CX = 0, a próxima instrução após LOOP será executada. CX é decrementado automaticamente quando LOOP é executada. Nenhum FLAG é afetado. Instrução de laço Exemplo de instruções válidas: LOOP PT1 LOOP TOPO LOOP RETORNO Obs: são equivalentes as seqüências: MOV CX, (valor_inicial) MOV CX, (valor_inicial) TOPO: ... TOPO: ... ... ... LOOP TOPO DEC CX JNZ TOPO Instrução de laço 2) FOR loop Em linguagem de alto nível: FOR (número_de_vezes) DO (seqüência de instruções) END_FOR Instrução de laço Em linguagem de alto nível: FOR (80 vezes) DO (exibir “ * “ ) END_FOR Em linguagem de montagem: ... ;for 80 vezes MOV CX,80d MOV AH,2h MOV DL,” * ” ;do TOPO: INT 21h LOOP TOPO ;end_for ... Instrução de laço 3) WHILE loop Em linguagem de alto nível: WHILE(condição_verdadeira) DO (seqüência de instruções) END_WHILE Instrução de laço Em linguagem de alto nível: WHILE (caracter diferente de CR?) DO (ler caracter do teclado e armazená-lo) (contador = contador +1) END_WHILE Em linguagem de montagem: ... MOV DX,0h ; inicialização MOV AH,1h INT 21h ;while LOOP: CMP AL,0Dh ; é o caracter CR? JE FIM ; salto quando caracter é igual a CR MOV AL, (algum lugar) ; salvando o caracter lido INC DX ; conta número de caracteres INT 21h JMP LOOP ; fecha o loop WHILE ;end_while FIM: Instrução de laço 4) REPEAT loop Em linguagem de alto nível: REPEAT (seqüência de instruções) UNTIL (condição_verdadeira) Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, até que seja lido o caracter Carriage Return (CR). Instrução de laço Em linguagem de alto nível: REPEAT (ler caracter do teclado e armazená-lo) (contador = contador + 1) UNTIL (caracter igual a CR) Em linguagem de montagem: ... MOV DX,0h ;inicialização MOV AH,1h ;repeat LOOP: INT 21h MOV AL, (algum lugar) ;salvando o caracter lido INC DX ;conta número de caracteres CMP AL,0Dh ;é o caracter CR? JNE LOOP ;salto enquanto caracter não é CR ;until ... Exemplo: Exibição de na tela de todos os caracteres ASCII TITLE EXIBICAO DE CARACTERES ASCII .MODEL SMALL .STACK 100H .CODE ;inicializacao de alguns registradores ; MOV AH,2 ;funcao DOS para exibicao de caracter MOV CX,256 ;contador com o numero total de caracteres MOV DL,00H ;DL inicializado com o primeiro ASCII ; ;definicao de um processo repetitivo de 256 vezes ; PRINT_LOOP: INT 21H ;exibir caracter na tela INC DL ;incrementa o caracter ASCII DEC CX ;decrementa o contador JNZ PRINT_LOOP ;continua exibindo enquanto CX nao for 0 ; ;quando CX = 0, o programa quebra a sequencia do loop ;saida para o DOS ; MOV AH,4CH INT 21H END Instrução de comparação CMP destino,fonte CMP (Compare) compara os conteúdos destino e fonte, que podem ser: · registrador e registrador · registrador e uma posição de memória · um número diretamente como operando fonte Combinações legais de operandos Operando destino Operando fonte Registrador de dados Posição de memória Reg. de dados sim sim Posição de memória sim não Constante sim sim Instrução de comparação CMP calcula a subtração: (destino) - (fonte) O resultado não é armazenado, porém Todos os Flags de Estado são afetados. Exemplos de instruções válidas: CMP DX,BX ;compara os conteúdos de DX e BX CMP AX,[WORD1] ;compara o conteúdo do registrador AX com o da ;posição de memória WORD1 CMP AH,’A’ ;compara o conteúdo de AH com o caracter ASCII ‘A’ “Instruções de Multiplicação, Divisão e Bits de Status ” Instruções de Multiplicação MUL fonte IMUL fonte • MUL (multiply) -> usada com números em representação não-sinalizada; • IMUL (integer multiply) -> usada com números sinalizados. • Multiplicação com números em formato byte: – registradores de 8 bits e variáveis de tipo DB; – segundo operando é assumido em AL; – resultado (destino) pode atingir 16 bits e se encontra em AX. Instruções de Multiplicação • Multiplicação com números em formato word: – registradores de 16 bits e variáveis de tipo DW – segundo operando é assumido em AX – resultado pode atingir 32 bits (tamanho doubleword) e se encontra em: • DX -> 16 bits mais significativos (high word)
Compartilhar