ASC - Resumo Detalhado.docx

Full Transcript

Arquitetura de sistemas computacionais ====================================== Resumo\ \ \ \ Uma imagem com eletrónica, circuito Descrição gerada automaticamente **1º Ano\ 1º Semestre- 2022/23\ ** 1\. Sistemas de Numeração:\ \ ***1.1 sistemas de numeração posicionais e não posicionais:\ \ ***Desig...

Arquitetura de sistemas computacionais ====================================== Resumo\ \ \ \ Uma imagem com eletrónica, circuito Descrição gerada automaticamente **1º Ano\ 1º Semestre- 2022/23\ ** 1\. Sistemas de Numeração:\ \ ***1.1 sistemas de numeração posicionais e não posicionais:\ \ ***Designamos por Sistema ou Base de Numeração um conjunto de números representados por numerais de forma consistente, os quais podem ser Não Posicionais ou Posicionais: - **Sistemas Não Posicionais:** Neste caso, cada numeral contribui com um valor que não é unicamente dependente da sua posição no número, ou seja, não importa onde um algarismo está, o que importa é o valor que possui. - **Sistemas Posicionais:** Neste caso, cada numeral contribui diretamente com um valor para a posição em que se encontra no número, o nosso sistema decimal é um exemplo deste tipo de sistema. Nos sistemas de numeração posicional, a representação dos números dá-se da seguinte forma: - Os Números Naturais representam-se seguindo a fórmula: N = (a~m-1~,..., a~2~,a~1~,a~0~)b - Os Números Racionais representam-se de maneira semelhante mas com o sinal + ou -. - Os Números Inteiros representam-se da seguinte maneira: Q = (a~m-1~,\...,a~2~,a~1~,a~0~,a~-1~,a~-2~,...)b Dentro dos Sistemas de Numeração Posicional, destaca-se o Sistema Decimal, ou de base 10 (visto que tem 10 algarismos). - Por exemplo: N = (a~2~,a~1~,a~0~)b = 321~10\ ~ Este Sistema de Numeração mostrou-se pouco eficaz para a representação e transmissão de números nos computadores, isto deu-se principalmente pelas seguintes razões: - Como o Sistema de Base Decimal tem 10 algarismos, era necessário haver 10 patamares, cada um com um estado de tensão, de modo que um sinal com uma x carga representasse cada um deles. Um dos principais problemas associados a estes 10 patamares, foi a frequência de erros de interpretação associados a flutuações nos sinais elétricos, visto que cada carga não era muito diferente entre cada um dos patamares, logo caso houvesse um erro mínimo levava a uma má interpretação. - Como há 10 patamares, cada um com um estado de energia distinto, implicava também um alto consumo de energia. - Como se tinha que identificar a carga que cada sinal transmitido tinha para encontrar o número pretendido, era necessário que houvesse alguns circuitos. ***1.2 Sistemas de Numeração eficazes a nível computacional***\ \ De modo a resolver estes problemas, surgiu **o Sistema de Numeração Binário, ou de Base 2.**\ \ **Este sistema só possui dois estados**, ao contrário do decimal que possui 10 estados (um para cada algarismo), **o estado On e Off, respetivamente representados pelos dígitos 1 e 0.**\ **Um bit ou dígito binário (b) corresponde ao nome de cada um dos algarismos, este sendo considerado a Unidade Básica de Informação Digital.** - Esta pode ser armazenada e processada por exemplo numa memória RAM. - **Pode ser transmitida, em que como apenas há dois estados de tensão, On e Off, em que o On representa a existência de tensão e o Off a ausência de tensão**, facilitou a descodificação e impediu erros na interpretação. ![](media/image2.png)**O Byte (B) é um conjunto de dígitos binários, ou de bits, e é utilizado como Unidade de Informação Digital. Este permite codificar muito mais do que apenas dois estados de tensão, conseguindo codificar 256 estados (2^8^), isto no caso de um octeto, ou seja, no caso de ser composto por 8 bits.** (O seu tamanho depende do hardware do computador)\ \ O primeiro e o último bit de cada byte tem representações especificas, respetivamente **MSB e LSB que significa Bit mais Significativo e Bit menos Significativo.**\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ De modo a tirar melhor partido da memória do computador, **é mais eficiente armazenar vários Bytes de cada vez**, um conjunto de Bytes é denominado de Word, o tamanho deste depende da arquitetura física da RAM. No caso da arquitetura x86, estes são os tamanhos mais usados: - 8 Bits -- 1 Byte (B) - 16 Bits -- 2 Bytes -- 1 Word (W) - 32 Bits -- 4 Bytes -- 1 Double Word (DW) - 64 Bits -- 8 Bytes -- 1 Quad Word (QW) Os Múltiplos do Byte representam quantidades diferentes das do Sistema Decimal, portanto surgiu a necessidade de novos prefixos, tais como: - KibiByte (kB) / Kilo - MebiByte (mB) / Mega - GibiByte (gB) / Giga - TebiByte (tB) / Tera - PebiByte (pB) / Penta - ExbiByte (eB) / Exa As memórias RAM e Discos SSD têm capacidades definidas em GibiBytes e TebiBytes, enquanto os Discos Rígidos têm capacidades definidas em GigaBytes e TeraBytes. Além do Sistema Decimal e Binário, temos ainda os Sistemas Hexadecimal e Octal, respetivamente de base 16 e de base 8: - O **Sistema de Numeração Octal** é constituído por 8 algarismos, no caso, 0,1,2,3,4,5,6 e 7, em que cada algarismo representa 3 bits em binário, ou seja, cada algarismo representa 8 estados, sendo uma representação mais compacta. - O **Sistema de Numeração Hexadecimal** é constituído por 16 algarismos, 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E e F, em que cada algarismo representa 4 bits em binário, ou seja, cada algarismo representa 16 estados, sendo o Sistema mais utilizado devido a ser mais compacto que os demais. Um byte pode ser representado por apenas 2 algarismos em Hexadecimal. ***1.3 Conversão entre diferentes sistemas de numeração:*** A conversão entre diferentes sistemas de numeração dá-se de maneira diferente entre eles: - **É possível converter qualquer número de qualquer base para Sistema Decimal segundo a mesma fórmula: N~10~ = a~m-1~ x b^m-1^ +... + a~2~ x b^2^ + a~1~ x b + a~0~ x b^0^**^\ ^Quanto aos Números Racionais é só fazer o mesmo. - **Para converter da base 10 para outras bases faz-se através de divisões e multiplicações sucessivas:\ \ Basicamente divide-se a parte inteira de um número pelo índice da base sucessivamente, cada vez que esta divisão não originar um número natural (sem vírgulas) aponta-se um 1, quando origina aponta-se um 0. Isto sucessivamente até o número chegar a 1.\ Esta "contagem" faz-se de maneira inversa, ou seja, o primeiro 1 ou 0 obtido corresponde ao último algarismo do número em binário, ou seja, vai da direita para a esquerda.\ \ Quanto à parte fracionária, esta multiplica-se pelo índice da base, quando o resultado for um número com 1 na parte inteira, aponta-se um 1, quando é um número com um 0 na parte inteira, aponta-se um 0, isto sucessivamente até o resultado da multiplicação dar exatamente o valor 1. Dependendo da precisão pretendida pode ser menos. Nesta "contagem" o primeiro 1 ou 0 obtido corresponde ao número diretamente à direita da vírgula em binário.**\ \ Também se pode fazer pelo método das diferenças:\ Subtrai-se sucessivamente de N o maior termo do intervalo \[am-1 × b m-1 , a-n × b -n\] não superior a N. O resultado será (am-1 \... a1 a0 , a-1... a-n) b onde os algarismos correspondentes às potências de b que não foram subtraídos terão o. - Podemos ainda converter números do Sistema Binário para o Sistema Octal, em que simplesmente consiste em juntar os Bits em grupos de 3, e traduzir o valor que esses 3 Bits representam em Binário para octal. Caso faltem Bits, adiciona-se 0. - Podemos ainda converter números do Sistema Binário para o Sistema Hexadecimal, em que simplesmente consiste em juntar os bits em grupos de 4, e depois traduzi-los de acordo com o seu valor em binário para o respetivo símbolo em Hexadecimal. Algo importante referir que na representação computacional de números naturais, é muitas vezes necessário especificar em que base o número se encontra, e também obrigatoriamente o espaço a reservar na memória. Relativamente às bases: - Decimal - 123 - Octal - 0123 - Hexadecimal -- 0x123 - O Sistema Binário não está disponível, deve se usar o Hexadecimal. A reserva de espaço de memória, no caso por variáveis, dá-se: - 8 Bits -- unsigned char - 16 Bits -- unsigned short int - 32 Bits -- unsigned int ou unsigned long - 64 Bits -- unsigned long long O qualificador unsigned indica que são números naturais.\ \ \ ***1.4 Operações Aritméticas e booleanas entre sistemas de numeração binário, octal e hexadecimal:***\ \ A aritmética de Números Naturais nos sistemas de base 2,8 e 16 faz-se da mesma maneira que no sistema de base 10, tendo os mesmos algoritmos de cálculo: - **A adição faz-se por transporte em parcela, ou seja, uma vez excedido o dígito 1 este passa para a posição seguinte, tal como se faz no Sistema Decimal.\ \ ** - **A subtração é um processo parecido, mas por empréstimo, ou seja, quando se subtrai um 1 de um 0, vai-se buscar um 1 ao algarismo seguinte. Cada 1 de um algarismo de posição superior corresponde a um 2 na posição seguinte, um acaba por ficar na posição e o outro prossegue. Basicamente pode-se decompor um número que esteja numa posição mais elevada em dois, em que um que desce de posição corresponde novamente a um 2.\ \ ** - **A multiplicação faz-se de maneira semelhante, multiplica-se cada algarismo de um dos operandos pelo número inteiro, à medida que se avança de posição, o número multiplicado faz o mesmo.\ \ ** - **Quanto à divisão, esta é transformada numa sequência de multiplicações e de subtrações, ou seja, começa-se por procurar no dividendo um número maior que o divisor, adiciona-se um 1 de seguida, depois subtrai-se o divisor ao dividendo e repete-se o processo. Pode-se adicionar zeros à direita do resto, o que implica a adição da vírgula, de modo a melhorar a precisão do resultado. A divisão termina quando o resto chegar a 0, ou quando se obter a precisão pretendida.\ \ ** **As Operações Booleanas consistem nas seguintes:** - **Negação (NOT)** - **Disjunção (OR)** - **Conjunção (AND)** - **Disjunção Exclusiva (XOR)** Estas podem ser aplicadas considerando um ou dois dados de entrada, em que para determinar o bit resultante de uma determinada operação booleana sobre os respetivos bits de entrada, aplica-se a seguinte tabela de verdade: ***1.5 Operações Aritméticas e Lógicas Computacionais:***\ \ Antes de mais, temos de definir o que é um programa, visto que muitas vezes é a estes que recorremos em operações aritméticas. Este contém essencialmente duas coisas: - **Código**; no caso, o conjunto de instruções de um programa que o CPU vai executar. - **Dados**; no caso, todos os valores de variáveis e constantes de um programa, os quais podem ser de entrada ou de saída. **Todos os dados são armazenados na memória, esta que como é um recurso finito, é boa prática armazenar apenas o que se precisa de modo a conservar a memória.**\ **Os dados, ou variáveis, ocupam uma zona de memória contigua, em que a sua localização é identificada por um endereço, o qual é um valor número crescente {0,1,2,3,..}.**\ **\ Ao utilizarmos o computador para fazer Operações Aritméticas temos que definir o número de Bits a reservar para a dita operação, ou seja, os Bits a reservar para cada dado da operação, de modo a representar os operandos e o resultado.\ Uma operação aritmética consiste em armazenar na memória os dois operandos, fazer a operação e por fim armazenar o resultado na memória.** **Numa operação aritmética em que se reserva 8 Bits para cada operando e para o resultado, é possível que no decorrer da operação, o resultado exceda a capacidade de armazenamento, ou seja, neste caso o resultado acabe por consistir em mais do que 8 Bits.**\ \ **Este processo em específico só ocorre entre números naturais, e designa-se de transporte, e que apesar de incompleto, o resultado ainda é válido.** - Na Adição, é comum que se reserve mais espaço na memória para o resultado do que o tamanho dos operandos. - Na Subtração e Divisão, não é necessário reservar mais do que o tamanho dos operandos, visto que é impossível exceder o espaço dos operandos. - Na Multiplicação, é comum que se reserve o dobro do espaço na memória que o necessário. O tamanho dos operandos só pode ser de 8 Bits (B), 16 Bits (W), 32 Bits (DW) e 64 Bits (QW).\ **As Operações Lógicas Booleanas podem ser aplicadas no âmbito de Teste de Bits ou de Manipulação de Bits, através da utilização de Máscaras, no caso, sequências de Bits preparadas especificamente para testar ou manipular um conjunto de Bits,** **esta acaba por ser utilizada como um dos operandos.** - Para testar um conjunto de Bits, cria-se uma Máscara em que os 1's representam os dígitos que queremos testar se existem numa sequência de interesse, os 0 acabam por não possuir valor. Ao utilizarmos a operação lógica booleana And, caso o output seja true, então nos lugares onde colocamos os 1's na Máscara, na sequência respetiva existem. - Para manipular um conjunto de Bits, a máscara continua a ser um dos operandos, e digamos que forçamos o resultado, ou seja, o resultado da operação entre a máscara e o conjunto de Bits, vai ser o que queremos.\ Caso queiramos alterar alguns Bits para 1, podemos utilizar a Operação OR e uma Máscara com um 1 nessas posições.\ Caso queiramos alterar alguns Bits para 0, utilizamos a Operação AND e uma Máscara com 0's nessas posições.\ Além disso, também se pode inverter Bits, através da Operação XOR e com os Bits contrários nas posições pretendidas na máscara. ***1.5 Representação de Números Inteiros Computacionalmente:***\ \ Já sabemos como representar Números Naturais no Computador, **no entanto, relativamente a Números Inteiros, é diferente, visto que surgem os números negativos, e surge a necessidade de representar o sinal + e -.\ **Deste modo, surgem várias hipóteses de como podemos representar o sinal + ou -- por Bits, todas requerem que reservemos um Bit para este, a questão é, qual? - Temos a **Hipótese do Sinal Magnitude**, que é uma representação de inteiros intuitiva, em que o Bit do Sinal é o MSB, 0 indica que é positivo e 1 que é negativo, sobrando 7 Bits para representar o número. A gama de representação é de \[-127,127\], e como desvantagens: possui duas representações para o 0, e as operações aritméticas são complexas. - A **Hipótese do Complemento para Um**, é uma representação de inteiros orientada para as operações aritméticas, em que o Bit do Sinal também é o MSB, e 0 indica que é positivo e 1 que é negativo. O número caso seja positivo é representado em Binário, caso negativo é representado na forma do seu "inverso", ou seja, inverte-se os Bits. No entanto, continua a haver duas representações para o 0, e na adição o transporte tem de ser somado, obrigando a duas somas. - A **Hipótese do Complemento para Dois**, é uma representação orientada para as operações aritméticas, em que o Bit de Sinal é o MSB, e 0 indica positivo e 1 negativo. Caso o número seja positivo, o valor representa-se em Binário, caso seja negativo é representado na forma do seu complemento negativo (inverso dos Bits) e é somado 1 ao valor. A sua gama de representação é \[-128,127\] para 8 Bits. É a forma de representação mais usada nos computadores atuais. - Temos ainda a **Hipótese do Excesso 127**, é uma representação de inteiros orientada para a sua comparação, em que o MSB é 0 caso seja negativo e 1 caso seja positivo, basicamente o número é codificado da seguinte forma, soma-se 127 ao valor original e escreve-se em binário normalmente. É a forma de representação usada na virgula-flutuante. **Caso seja excedida a capacidade de representação, faz-se a extensão do número de Bits através da extensão do sinal, ou seja, caso o sinal seja 1, estende-se 1, caso seja 0, estende-se 1. Também se pode fazer a redução do número de Bits.** A representação de Números Inteiros em Computador, faz-se de maneira semelhante à que utilizamos quanto a Números Naturais, o que muda é o sinal à frente. A reserva de espaço por seu lado faz-se de maneira igual, o que se troca é unsigned para signed, que por omissão será sempre signed. Computacionalmente faz-se da seguinte maneira: - Decimal: +123 - Octal: -0123 - Hexadecimal: -0x123 - Binário -- Usar Hexadecimal ***1.6 Operações Aritméticas com Números Inteiros nos sistemas de numeração de base 2,8 e 16:\ ***\ As Operações Aritméticas com Números Inteiros, faz-se da seguinte maneira: - A Adição faz-se da mesma maneira que nos Números Naturais, no entanto, caso haja transporte na operação, esse Bit é simplesmente descartado. - A Subtração é transformada numa Soma. Por isso é que um dispositivo apenas implementa um circuito de soma. - A Multiplicação faz-se de maneira semelhante, no entanto, o número que é negativo não pode ser o multiplicador. - A Divisão é a mesma coisa. **Na adição de números inteiros, a capacidade de representação pode ser excedida, ou seja, pode ocorrer Overflow ou transbordo, em que o valor absoluto do resultado ocupa o bit do sinal, invalidando o resultado.**\ \ Isto pode acontecer na soma de dois números positivos, caso o Bit de Sinal for 1, e na soma de dois números negativos, caso o Bit de Sinal for 0.\ \ Caso ocorra Overflow, o programa deve de imediato terminar, e deve-se verificar se os operandos estão dentro da Gama prevista, de acordo com os Bits reservados, e se foi reservado espaço suficiente para o resultado. Caso o resultado necessite de mais 1 Bit que o escolhido, então deve-se usar um múltiplo a seguir, já que as capacidades já estão predefinidas, sendo 8 Bits, 16 Bits, 32 Bits e 64 Bits.\ \ \ \ \ ***1.7 Vírgula Fixa e Vírgula Flutuante:\ ***\ Para representarmos um número racional, temos duas opções relativamente ao lugar em que colocamos a vírgula, esta podendo ser: - **Vírgula Fixa;**\ **Basicamente fixamos a vírgula numa certa posição, e consequentemente dedicamos um conjunto de Bits para a parte inteira e para a parte fracionária**, o que define o fator de escala da representação. É uma solução eficaz no caso de a gama de valores ser relativamente conhecida e suficientemente limitada, além de que as operações são fáceis de realizar. - **Vírgula Flutuante;**\ **Neste caso a vírgula não tem uma posição fixa, por isso, requer uma forma de indicar a posição da vírgula. Este método permite a representação, abreviada, de números muito pequenos e de números muito grandes.** Um exemplo deste método, é a Notação Científica e o Padrão IEEE 754, que é útil na representação computacional. **A Representação em Notação Científica pode ser feita em diferentes sistemas de numeração, tal como no Decimal e no Binário. Esta é uma forma de representação de números em vírgula flutuante, que utiliza uma potência de 10 para indicar o fator da escala, ou posição relativa da virgula, independentemente do sistema de numeração, a potência é sempre 10.** - No Sistema Decimal, é feita da seguinte forma: sinal mantissa x 10^expoente\ ^ - No Sistema Binário, é feita da mesma forma, mas com a Notação em Binário. **No caso de haver exatamente 1 algarismo significativo à esquerda da vírgula, ou seja 1.04 etc, então a representação é Normalizada, caso contrário denomina-se de Não Normalizada. A Representação Não-Normalizada é a única que é capaz de representar o 0.**\ \ **Computacionalmente, é necessário estabelecer o nível de precisão na representação do número, nomeadamente, o número de algarismos na parte fracionária, e a gama de valores representáveis.**\ \ **Quando se estabelece uma dada precisão e gama, limita-se o conjunto dos valores discretos, ou seja, conjunto de números finitos, os restantes sendo arredondados. O conjunto de números representáveis em virgula flutuante é mais denso perto do zero.**\ \ \ \ \ \ \ \ \ \ \ \ \ ***1.8 Padrão IEE 754:***\ \ **Por isto foi desenvolvido o Padrão IEEE 754, que foi adotado quase universalmente, este que estabelece vários tamanhos de representação, tal como:** - Meia Precisão -- 16 Bits - Precisão Simples -- 32 Bits - Precisão Dupla -- 64 Bits - Precisão Quádrupla -- 128 Bits - Precisão Óctupla -- 256 Bits ![](media/image4.png)Este sistema, define as operações, resultados não representáveis, formatos decimais e outros pormenores internos. **A representação no formato IEEE 754 parte da notação científica normalizada em binário, e atribui conjuntos de Bits para: sinal, fração e expoente, a parte inteira não é representada.\ **\ **O formato de Precisão Simples é designado como binary32, que corresponde a uma representação\ 32 Bits. O sinal possui 1 Bits, em que 0 é positivo e 1 negativo, o Expoente com 8 Bits representado em Excesso 127, e a fração com precisão de 23 Bits representada em Binária.\ \ \ \ \ \ \ \ \ \ \ \ **\ \ \ \ \ **O formato de Precisão Dupla, é designado como binary64, que corresponde a uma representação 64 Bits, em que o sinal tem 1 Bit, 1 negativo e 0 positivo, o Expoente é representado em Excesso 1023, e a fração com precisão de 52 Bits representada em binário.**\ \ \ Ainda há outros formatos binários do padrão IEEE 754, tal como: - Meia Precisão, designado como binary16.\ Sinal: 1 Bit, Expoente: 5 Bits, Fração: 10 Bits.\ Em que o Expoente usa representação em Excesso 15. - Precisão Quádrupla, designado como binary128.\ Sinal: 1 Bit, Expoente: 15 Bits, Fração: 112 Bits.\ Em que o Expoente usa representação em Excesso 16383. - Precisão Óctupla, designado como binary256.\ Sinal: 1 Bit, Expoente: 19 Bits, Fração: 236 Bits.\ Em que o Expoente usa representação em Excesso 262143. **Uma razão forte para usar um formato de precisão mais elevado é para evitar Overflow, Underflow e erros de arredondamento em aritmética.** ![](media/image6.png)***1.8.1 Representação Normalizada:\ ***\ Quando a representação em Notação Científica é normalizada, só existe um algarismo significativo (um 1) à esquerda da vírgula, isto em Binário. No padrão IEE 754, este Bit não é representado (hidden bit).\ \ A Representação Normalizada para positivos binary32 cobre:\ Isto porque o Expoente só pode variar entre -126 e entre 127.***\ \ 1.8.2 representação não-normalizada:\ ***\ Acaba por surgir a questão de como representar o valor 0 no Padrão IEE 754, visto que a obrigatoriedade de existir um algarismo à esquerda da vírgula, impede a representação de números fracionários sem parte inteira, e a do 0.\ \ Deste modo, utiliza-se a Representação Não-Normalizada, a qual permite não só representar o 0 (em que todos os Bits são 0), mas também permite representar números fracionários mais próximos de 0, ou seja, amplia a gama de representação nessa zona, corrigindo os erros da Representação Normalizada, o seu Hidden Bit corresponde a um 0.***\ \ 1.8.3 Conversão entre Base 10 e binary32:***\ \ **De base 10 para binary32, deve-se prosseguir da seguinte forma:** 1. **Converter o número na base 10 para binário e representá-lo em Notação Científica.** 2. **Preencher o Bit de Sinal adequadamente.** 3. **Caso seja Normalizado, representar o Expoente em Excesso 127, caso seja Não-Normalizado, representar o Expoente como 0000 0000.** 4. **Por fim, preencher os Bits da Fração com a mantissa, e juntar os Bits todos.** **De binary32 para base 10, deve-se prosseguir da seguinte forma:** - **Primeiro verificar o Bit de Sinal, para se obter o sinal do número.** - **Analisar o valor do Expoente, caso seja 1111 1111, então o valor é infinito ou indeterminado, caso seja 0000 0000, é Não-Normalizado, caso seja outro valor qualquer, então é Normalizado, e deve-se converter de Excesso 127 para Binário.** - **Por fim, representar o número em Notação Científica, e converter o número de Binário para base 10.** ***1.8.4 Representação do Padrão IEE 754 em C e Java:*** A nível computacional, representa-se constantes em vírgulas flutuantes da seguinte forma: - Se o valor não tiver um sufixo então é considerado como binary64. - Se o sufixo for f ou F então será binary32. Relativamente às variáveis, estas representam-se da seguinte forma em vírgula flutuante: - Representação em binary32: float. - Representação em binary64; double. ***1.8.5 Operações Aritméticas em Vírgula Flutuante:***\ \ **Sempre que um dos operandos seja um número em vírgula flutuante, então a operação será feita em vírgula flutuante.\ \ Relativamente às Operações Aritméticas, estas realizam-se da seguinte maneira:** - **Primeiro deve-se igualar o valor dos Expoentes, ou seja, elevando o Expoente menor para o valor do Expoente maior, ajustando a mantissa.\ ** - **Depois faz-se a Operação Aritmética, considerando o Hidden Bit.\ ** - **Por fim, coloca-se o resultado em Representação Normalizada.** **Nas Operações Aritméticas entre números em vírgula flutuante, sejam positivos ou negativos, pode ser excedida a capacidade de representação nesse formato:** - **Pode então ocorrer Overflow, em que acontece quando o valor absoluto do resultado ultrapassa o maior valor representável.\ ** - **Mas também pode ocorrer Underflow, em que o valor absoluto do resultado perde precisão ou é inferior ao menor valor representável, é designado como gradual underflow.** A imprecisão na vírgula flutuante, pode ser causada pela representação em binário de valores decimais, ou por o resultado de operações aritméticas ser muito superior ao dos operandos. ***1.8.6 Representação de Infinitos e NaNs:\ ***\ **Estes dois casos, correspondem à Representação Não-Normalizada:\ \ Em Situação de Overflow, o resultado é designado como + ou -- infinito, em que no Padrão IEE 754, é reservada uma combinação do Expoente, onde todos os Bits são representados em 1, relativamente à fração ou mantissa, fica com todos os Bits a 0, o Bit do Sinal define o sinal do infinito.\ \ Numa Situação onde ocorra uma Indeterminação, então o Resultado é designado como NaN (Not a Number), e no Padrão IEE 754, é reservada a mesma combinação do Expoente com todos os Bits a 1,** 2\. aRQUITETURA DE UM Sistema Computacional:***\ \ 2.1 primeiras descrições da arquitetura de um computador:\ ***As dificuldades em configurar o computador, conduziram às primeiras descrições de um computador de programa armazenado: - Alan Turing desenvolveu a Máquina de Turing Universal, que era uma máquina hipotética com um armazenamento infinito. - Von Neumann escreveu uma descrição de um computador de programa armazenado (1945), o qual se tornou a Arquitetura de Von Neumann, a qual ganhou mais notoriedade que a de Alan Turing. ***\ 2.2 Arquitetura de Von Neumann:***\ \ A Arquitetura de Von Neumann descreve uma arquitetura para um computador que armazena Instruções e Dados como Bits na mesma memória. Esta é constituída por: - **Registos**, que armazenam valores temporários e endereços.\ Estas são pequenas zonas de armazenamento rápido dentro da CPU, os quais contém:\ MAR -- Memory Address Register; A Localização na memória para leitura ou escrita.\ MDR -- Memory Data Register; O dado a transferir de/para a memória.\ Acc -- Accumulator; Um resultado temporário de uma operação aritmética ou lógica.\ PC -- Program Counter; Um endereço da próxima instrução a ser executada.\ CIR -- Current Instruction Register; A instrução atual para descodificação/execução. - **Unidade de Aritmética e Lógica (ALU),** que realiza as operações aritméticas e de lógica booleana.\ Esta Unidade realiza as operações aritméticas sobre naturais e inteiros, e booleanas. Consiste numa unidade funcional, que pode receber dados de entrada, no caso os operandos, e transmitir o resultado escrito na memória, ou dar notificação no caso de ocorrer transporte ou overflow. - **Unidade de Controlo (UC),** que lê cada instrução, descodifica-a e controla a sua execução.\ Realiza o Ciclo Fundamental de Execução, este em três etapas, em que começa por Ler (fetch), ou seja, carrega a partir da memória a próxima instrução a ser executada, depois Descodifica, ou seja, identifica a instrução especifica definida pela sequência de bits carregada anteriormente, e por fim Executa, no caso, realiza a instrução identificada, no caso de ser uma operação aritmética ou lógica a UC vai coordenar o carregamento de operandos a partir da memória (leitura), instruir a ALU para efetuar a operação e encaminhar o resultado da operação para a memória (escrita). - **Memória,** para instruções e dados dos programas.\ Esta é baseada em memória de acesso aleatória (RAM -- Random Access Memory), também conhecida como memória principal, em que cada localização dentro desta, pode conter uma instrução ou dado que pode ser acedida para leitura ou escrita, especificando o seu endereço (O qual é um valor numérico crescente). Uma transferência da/para a memória é especificada com: Operação, leitura ou escrita; Endereço, localização a partir do qual se lê ou escreve; Tamanho, números de bytes a ler ou escrever. Esta memória é acessível diretamente pelo CPU. - **Barramento,** canal de comunicação entre os componentes.\ Este é uma ligação interna de alta velocidade, entre o CPU e a memória, existem 3 barramentos, os quais são: Barramento de endereços, em que os endereços a usar em operações de leitura ou escrita são colocados neste barramento para a memória; Barramento de Dados, em que os dados a usar como entrada em operações aritméticas ou lógicas e o resultado de uma operação aritmética ou lógica, são colocados neste barramento; Barramentos de controlo, em que os sinais ou comandos de controlo são enviados através deste barramento pelo CPU, também é usado para enviar informações de estado para o CPU. ***2.3 Problemas da Arquitetura de Von Neumann:***\ \ Um programa é constituído por múltiplas instruções, em que a execução de um programa corresponde à aplicação do ciclo fundamental de execução a cada instrução do código, ou seja, ler (utilizados os registos PC e CIR), descodificar (é utilizado o registo CIR) e executar (que pode envolver a utilização dos registos MAR, MDR e Acc), e a escrita de resultado na memória.\ \ **Um dos erros da Arquitetura de Von Neumann é o respetivo Gargalo, no caso, o barramento único entre o CPU e a memória, ou seja, só existe um único canal de acesso entre os dois dispositivos,** este que é utilizado para várias ações, tais como a Leitura e Escrita de Instruções na zona de código do programa (esta última foi descontinuada por se tornar perigoso, visto que o próprio computador consegue se programar), e a Leitura e Escrita de Dados na zona de dados do programa. **Isto implica consequentemente que a taxa de transferência desse único barramento é insuficiente para o ritmo do CPU, fazendo com que este tenha que esperar muito.**\ **Para resolver estes erros, surgiu a Arquitetura de Harvard, esta que organiza instruções e dados em memórias independentes, e portanto, separa o barramento em dois canais de comunicação, um para cada memória (instruções e dados), tornando possível a leitura simultânea de instruções e de dados.**\ \ ***2.4 Arquitetura dos Computadores Atuais:\ ***\ **Grande parte dos computadores atuais usa uma modificação da arquitetura de Harvard, esta permite que a memória de instruções também contenha dados, visto que as instruções ocupam menos espaço que os dados, logo, possibilitando uma melhor utilização da memória, tal como na de Von Neumann, no entanto, mantém a possibilidade de o CPU aceder a múltiplos barramentos que conduzem a bancos independentes de memória, tal como a de Harvard.**\ **Os computadores atuais relativamente à arquitetura, dividem-se na visão do utilizador e na visão do sistema físico:** - **Quanto à visão do utilizador o computador possui uma arquitetura de Von Neumann, em que o código se encontra armazenado na mesma memória que os dados.** - **Quanto à visão do sistema físico, assemelha-se a uma arquitetura modificada de Harvard, em que existe separação da cache em cache de instruções e cache de dados, esta sendo uma memória temporária.** **E dividem-se também relativamente ao acesso à memória, quanto à memória principal comportam-se como a de Van Neumann, com apenas um barramento, mas quanto ao acesso da memória em cache comporta-se como a de Harvard, com barramentos separados.**\ \ **Um dos grandes problemas que surgiu quando começou a haver melhoria de hardware e software, foi a incompatibilidade entre estes, visto que antigamente como o software interagia diretamente com a máquina qualquer alteração poderia implicar uma incompatibilidade, seja do software ser escrito em linguagem de alto-nível, ou do contrário.**\ **Para responder a isto surgiu a Arquitetura do Reportório de Instruções, que consiste num modelo abstrato de um computador, que define tudo o que um programador precisa de saber do computador, cuja principal utilidade é funcionar como uma interface entre o hardware e o software, possibilitando compatibilidade entre diferente hardware e software, já que oferece um conjunto de instruções em linguagem-máquina (baixo-nível) realizáveis na infraestrutura física. A Microarquitetura consiste numa Arquitetura efetiva da máquina que implementa o Reportório de Instruções.**\ \ 3. Arquitetura do Reportório de Instruções x86\ \ **\ *3.1 COMPONENTENTES DA ARQUITETURA DO REPORTÓRIO DE INSTRUÇÕES x86:*\ \ Define o modelo abstrato do computador que é visto pelo software, este último interage com a máquina física através deste reportório, que funciona como uma interface. Acaba por seguir o modelo de Von Neumann quanto aos componentes.\ **\ ![](media/image8.png)**A Unidade Central de Processamento é composta pelas seguintes unidades:** - **Registos.\ ** - **Unidade de Aritmética e Lógica.\ ** - **Unidade de Vírgula Flutuante / SIMD.\ ** - **Unidade de Controlo.** ***3.1.1 Registos:***\ \ **Os Registos correspondem ao espaço de armazenamento no CPU usado pelas instruções, já que é de acesso mais rápido do que a memória principal, embora mais pequeno.\ **No total existem 16 Registos Gerais de 64 Bits cada. Os Registos Gerais podem possuir partes com 32,16 ou 8 Bits, em que que, os prefixos R e E correspondem respetivamente a 64 e 32 Bits, e que os Sufixos X, H/L correspondem respetivamente a 16 e 8 Bits. No caso dos Registos Register, cada sufixo D,W e B representa respetivamente 32 Bits, 16 Bits e 8 Bits. - \(A) Accumulator: RAX -- EAX, AX, AH e AL - \(B) Base: RBX -- RBX, EBX, BX, BH e BL - \(C) Counter: RCX -- RCX, ECX, CS, CH e CL - \(D) Data: RDX -- RDX, EDX, DX, DH e DL - (SI) Source Index: RSI -- RSI, ESI e SI - \(DI) Destination Index: RDI -- RDI, EDI e DI - (BP) Base Pointer: RBP -- RBP, EBP e BP - (SP) Stack Pointer: RSP -- RSP, ESP e SP - \(R) Register: Rn -- Rn, RnD, RnW e RnB **E ainda existe o Program Counter (RIP), e Sinalização e Controlo (RFlags).**\ \ \ \ \ **O RFlags é o registo utilizado pelo CPU para sinalizar estados resultantes da execução de instruções, receber ordens básicas de controlo do Programa e gestão do sistema. Este tem como principais flags:** - **CF (Carry Flag) -- Serve para sinalizar que ocorreu transporte, ou empréstimo em operações entre números naturais.\ ** - **OV (Overflow Flag) -- Serve para sinalizar que ocorreu transbordo (overflow) numa operação entre números inteiros.\ ** - **ZF (Zero Flag) -- Serve para sinalizar que uma operação teve como resultado zero.\ ** - **SF (Sinal Flag) -- Serve para sinalizar que o resultado tem o sinal negativo.** ***3.1.2 Unidade de Aritmética e Lógica (ALU):\ \ *A Unidade de Aritmética e Lógica realiza as seguintes operações: adição, subtração, multiplicação e divisão com números naturais ou inteiros; operações lógicas booleanas; e ainda faz o deslocamento e rotação de Bits.**\ \ Como entrada pode aceitar valores imediatos (carregados junto com as instruções) e valores provenientes dos Registos Gerais e da Memória Principal. Em termos de saída, pode devolver o resultado para um registo geral, ou para a memória principal, mas também pode devolver informação complementar ao resultado armazenado no registo de Flags (RFlags).\ \ ***3.1.3 Unidade de Vírgula Flutuante (FPU / SIMD):\ ***\ **A Unidade de Vírgula Flutuante, ou a FPU, implementa o Padrão IEEE 754-2008, e partilha recursos com a Unidade SIMD (unidade vetorial), esta realiza as seguintes operações em vírgula flutuante: adição, subtração, multiplicação, divisão; raiz quadrada; funções trigonométricas; e comparação.** Em termos de entradas e de saídas, acaba por aceder aos Registos SSE2 (da unidade vetorial).\ \ ***3.1.4 Unidade de Controlo:***\ \ **A Unidade de Controlo realiza o ciclo fundamental de execução, que consiste em:** - **Ler (fetch)\ O endereço para leitura de instruções é mantido no registo RIP. Dado que as instruções x86 têm tamanhos variáveis é necessário conhecer o tamanho da instrução que vai ser executada para que esse tamanho seja adicionado a RIP (e fique a apontar para a instrução seguinte).\ ** - **Descodificar\ De modo que permita identificar a instrução a executar, após esta já é conhecido o tamanho da instrução.\ ** - **Executar\ Dependendo da instrução pode utilizar uma das unidades funcionais, no caso ALU / FPU / SIMD, ou pode aceder (ler/escrever) à memória.\ ** ***3.2 Dados e Instruções:*** **Um programa de computador ou software corresponde a uma sequência de instruções que descreve como o computador deve realizar uma determinada tarefa.\ Este define essencialmente uma ou mais secções de dados, e uma secção de código.**\ \ **A estrutura de um programa consiste em:** - **Section.data -- Zona de Dados Inicializados\ ** - **Section.bss -- Zona de Dados Não-Inicializados\ ** - **Section.text -- Zona de Código** **\ É importante referir que a declaração de variáveis apenas reserva espaço em memória, não define tipos.**\ \ ***3.2.1 Secção de Dados:*\ \ A localização dos dados em memória é definida pelas variáveis, as quais correspondem a endereços de memória simbólicos, que na compilação acabam por ser traduzidos para endereços respetivos de memória virtual, ou seja, para endereços numéricos.**\ **Os dados podem-se dividir consoante o seu tipo e o seu tamanho, nomeadamente:** - **Naturais representados em Binário e Inteiros representados em CP2. (Byte, Word (2 Bytes), dword (4 Bytes), qword (8 Bytes)).\ ** - **Vírgula Flutuante representados em Padrão IEEE 754. (32 Bits (4 Bytes) e 64 Bits (8 Bytes)).\ ** - **Endereços de Memória (8 Bytes), em que cada um corresponde apenas a um único dado.\ ** - **Bits e Cadeia (string) de Bits (1 ou mais Bits)\ ** - **Byte e Cadeia (string) de Bytes (1 ou mais Bytes)** **A representação ASCII (American Standard Code for Information Interchange) estabelece uma correspondência entre um conjunto de 128 caracteres baseados no alfabeto inglês e um byte específico.**\ \ **A cadeia de Bytes mais usada é a cadeia de caracteres, normalmente designada como apenas string.** Estes caracteres de uma forma geral estão representados em ASCII, mas podem ser usadas noutras representações como o UTF8 (que inclui o ASCII).\ \ **Os ficheiros de texto usam em geral a representação ASCII, ou UTF8.**\ \ **Os dados na memória são armazenados na memória a partir do Byte menos significativos.\ Um vetor de dados (array) contém múltiplos dados de um mesmo tipo.\ Por seu lado, uma estrutura de dados contém múltiplos dados que podem ser de tipos diferentes.**\ ***3.2.2 Secção de Código:***\ \ **Esta corresponde à zona onde se encontram as instruções do programa, as quais se encontram codificadas em Binário (linguagem-máquina). Esta secção não pode ser escrita, ou seja alterada, durante a execução do programa, só pode ser lida.**\ \ Relativamente ao Endereçamento de Instruções, o Program Counter (PC), que está no Registo RIP, contém o endereço da memória a partir de onde vai ser carregada a próxima instrução.\ \ ***3.3 Reportório de Instruções:***\ \ **O Reportório de Instruções corresponde ao conjunto das instruções que um dado processador suporta.\ \ Todos os processadores compatíveis com o Reportório de Instruções x86 conseguem executar as mesmas instruções.\ \ Um programa executável é composto por código e dados, em que o código é formado por uma sequencia de instruções do reportório x86, as quais são representadas em linguagem-máquina (binário), mas podem ser apresentadas para humanos em Assembly (texto em ASCII).\ \ Um Reportório de Instruções pode evoluir através da inclusão de novas instruções, ou de modificações de instruções já existentes, no entanto, qualquer modificação deve assegurar a compatibilidade para os programas já existentes.**\ \ As Instruções no Assembly podem se dividir nas seguintes categorias: - Gerais: nop, mov, xchg , cbtw, cwtl, cwtd, cltd, stc, clc, cmc, syscall, lea; - Aritméticas: add, sub, mul, div, neg; - Lógicas: not, and, or, xor, sal(r), shl(r), rcl(r), rol(r), test; - Controlo de fluxo: jmp, jc, jo, jz, js, cmp, loop; - Pilha e funções: push, pop, pushf, popf, call, ret; Algumas instruções só se aplicam a números Naturais ou Inteiros: - As Operações aritméticas sobre valores sem sinal (unsigned) aplicam-se quando se trabalha com números naturais, exemplo de instruções: mul, div, ja, jb, jna, jnb, jc; - As Operações aritméticas sobre valores com sinal (signed) o aplicam-se quando se trabalha com números inteiros, exemplos de instruções: imul, idiv, cbtw, cwtl, cwtd, jg, jl, jng, jnl, jo, js;

Use Quizgecko on...
Browser
Browser