Okay. Então, agora vamos mudar fora de modelo de máquina e falar sobre outros aspectos de arquiteturas de conjunto de instruções. E, para falar sobre o que mais está em arquiteturas de conjunto de instruções, bem, há o modelo de máquina fundamental, como muitos registros você tem, se você, o que tipo de acesso de registro que você tem. Você tem baseado em pilha? Você tem acumulador? Você tem um cadastro-registro, ou um registrador-memória arquitetura? Além disso, você precisa falar sobre o que o operações fundamentais que você tem, instruções fundamentais que você tem. Então, vamos olhar para as classes de instruções. Começamos com coisas como dados instruções de transferência. Assim, as cargas, as lojas de mover-se para controlar registra. Então, isso é o que tem MIPS. E, neste curso, vamos ser confiando muito em MIPS, o MIPS conjunto de instruções arquitetura, muito para nossos casos de exemplo. Mas, você tem carga, armazenar movimento para e mover-se de registros de controle, com controle diferente regista. Você tem unidade lógica aritmética instruções. Então, coisas como adição, subtração, e ignorando multiplicação e divisão. Este é um ponto interessante aqui, Conjunto Menos Than, que é uma espécie de uma diversão. É um operador de comparação. Então, se você quer ter dois valores e comparar e ver qual é menos do que o outro, você pode usar SET Less Than. Carregar superior imediata, isto é, movendo a valor em registros local diferente, como mudar a operação. Você pode ter instruções de controle de fluxo. Assim, você pode fazer ramos, saltos, armadilhas. E, um dos pontos que eu quero começar através aqui está dentro ou entre arquiteturas de conjunto de instruções diferentes, as pessoas fazem escolhas diferentes sobre o que instruções para ter. Algumas pessoas têm os muito complexos, alguns tem os muito simples, ou alguns dos arquiteturas são os muito complexos, e algumas das arquiteturas são muito simples entes. Você instruções de ponto flutuante, adição de números de ponto flutuante, multiplicando números de ponto flutuante, subtraindo números de ponto flutuante. Estes são realmente comparar as operações, oh, desculpe-me, esta é uma operação de comparação números de ponto flutuante. Então, comparar menos do que para duplas, ou dobrar ponto flutuante de precisão. Aqui, temos operações de conversão. Então, é a conversão de um único Precisão número de ponto flutuante para um número inteiro, ou op palavra inteiro, número. Assim, este é convertido, isto é um, isto é as instruções MIPS. Você pode ter instruções multimídia, ou o que é chamado múltiplo única instrução dados. E, nós estaremos falando sobre enviar o bando neste curso, mais tarde, quando chegar a dados paralelismo e unidades de vetor. E, este é realmente um exemplo de x86. Eu queria dar de operações estranhas que, por vezes, mostram-se como fundamental operações ou instruções fundamentais na instruções definir arquiteturas, é, este é um exemplo chamado REP MOVSB. Isso não é duas instruções, que é um instrução com um prefixo e um espaço em entre ela. Yup. Esta é realmente válido Intel montagem código. E o que é REP MOVSB? Bem, REP MOVSB ​​é uma operação de cadeia onde ele vai realmente copiar uma string em outra string. Então, se você tiver algum texto e quiser copiar para outro texto, parte do texto, você pode fazer REP MOVSB ​​e configurar um número e ele vai realmente copiar. Isto é o equivalente de mais alguma coisa como loja e cópia. Então, nós podemos fazer isso tudo em uma instrução. Assim, em adição a estes cadeia complexa operações, coisas como REPS MOV, REP MOVSB, podemos ver, havia uma espécie de velho piadas sobre ter extra e adicional instruções, e com muito complexo instruções. Assim, por exemplo, na arquitectura VAX, eles tinham instruções que poderia fazer muito coisas complexas. Acho que houve um que até fez um rápido Transformada de Fourier em uma instrução. Isso é como um todo Rápida de Fourier ou, através de um conjunto de dados enormes definido em um instrução. Assim, você pode ver que há um monte de escolha entre suas classes de instruções ea arquitetura ISA, a instruções que o arquiteto arquitetura, tem de se sentar e pensar sobre o que deve estar em um conjunto de instruções em relação ser deixado de fora de um conjunto de instruções. Outra característica do conjunto de instruções arquiteturas que o arquiteto precisa pensar é, como você vai fazer e Access Memória? E, o que é o tratamento diferente Modos que podem ser utilizados? Então, ou como fazê-lo a partir de operandos memória? Então, olhando para um exemplo aqui, temos um registrar o endereçamento baseado modo. Assim, em um modo de registo baseado em endereçamento, só podemos citar dois registos e colocar -los em outro registro. E, é um, um formato de três operandos aqui. X86 terá apenas dois. Mas, você nome, registar três, Registo dois, adicioná-los juntos e colocá-los em Registar quatro, por exemplo. E, um de a, as coisas interessantes aqui está, isso não pode realmente acessar qualquer memória. Nós os chamamos de modo de memória, mas não pode realmente acessar a memória. Se você tem bastante espaço e registrar o seu implementação ou a sua micro-arquitetura realmente implementa todos os registos, então não vão memória de acesso. Mas, pode acessar a memória. Assim, por exemplo, há máquinas para fora lá onde você tem um registro, registrar, registar a operação, ou registar-se, registrar, registrador de instrução. Mas, o processador tem nenhum arquivo de registo. Tudo é em memória principal. Então, ele tem que ir ler os dados do principal memória para ir realmente fazer a operação e é apenas uma espécie de caches, ou mantém os dois operações que são necessárias. E é tudo na arquitetura micro nível. Então, tudo isso é o grande Um arquitetônico nível e perguntando, o que é o fundamental operações de memória que pode ser feito? Então, isso é um registo endereçamento baseado em modo, podemos ter uma mídia com base abordando modos. Então, temos aqui algo como uma constante de cinco a ser adicionado ao registar, colocando -lo em outro registro. Então, aqui está o nosso código de montagem para isso. Pode ter de deslocamento baseada endereçamento. Assim, em deslocamento vamos dar uma registrar valor, adicioná-lo a uma constante alguns, e depois ter que olhar para cima e na principal memória, esse local, e fazer algumas operação, vamos dizer, de outro registo. Mas, trata-se o deslocamento com base, e é chamado de deslocamento, porque você pode ter um registrar e ter algum deslocamento fora de lo. Você pode ter registar indireta, e isso é, muito comum em algo como MIPS, ou, na verdade, se você for olhar para o Itanium conjunto de instruções. Eles não têm material de deslocamento, que só têm registrar indireta. Assim, isto é semelhante ao deslocamento, mas você não pode ter um deslocamento. Você só pode ir e ler a partir de um determinado endereço de memória que está armazenado no registre-se. Você pode ter endereçamento absoluto. Esta não é realmente muito mais comum em modernas arquiteturas. Mas, nos mais velhos, máquinas mais antigas, este era comum assim que você toma memória e ter um constante, não é fora do cadastro, e ir procurar na memória, e então fazer algumas operação com isso. Você pode ter a memória indireta. E este é o tipo de forma interessante denotar este aqui. Mips muito não tem essa. Mas, você poderia fazer uma operação de memória de um operação de memória de um registo. Então, o que você tem é, de um registo, você tem um endereço. E então, você levaria esse endereço, você olhar para cima na memória principal, obter o dados. E isso em si é um endereço. E então, você procurar na memória principal novamente com ele. Então, é uma espécie de duplo indexador baseado fora a, a, uma espécie registo do modo de endereçamento. E, isso, isso fica muito chique. Então, se você olhar para algo como VAX, eles definitivamente tinha isso. Você pode ter parente PC, ou programa ponteiro relativa balcão, ou instrução endereçamento relativo. Assim, você pode levar o contador de programa, adicione algum deslocamento, e em seguida a memória do índice. Isto é muito útil para a posição código independente, ou o código que você não sabe onde ele vai ser carregado. E, se você quer ir acessar alguns dados perto de onde o código é, você não sabe exatamente onde o código é carregado. Mas, o contador de programa, porque você sabe que instrução sua execução, você pode basicamente índice fora isso e encontrar memória em torno de onde você está, em torno de onde o seu carregado na memória principal. Então, este é um código PIC. Você também pode ter dimensionado. Isso é algo que tem x86 onde você pode realmente ter um registo, e adicioná-lo para outro registo e multiplicado por outra coisa. Assim, em 86, isso é chamado de SIB, escala, índice e modo de base. Assim, você pode realmente ter um deslocamento, adicioná-lo para alguns, aos registos e multiplicar lo. E, isso é muito útil se você está tentando índice de matriz e através de uma certa dimensão. Então, se você tem um conjunto de quatro bytes palavras, você pode apenas manter assinalando-se este contador aqui. Então, você começa a zero, um, dois, três e como este carrapatos aqui em cima, em vez de subindo por um byte, você sobe por quatro bytes de cada vez. E se você for, os dados que você está tentando carga é de quatro bytes de comprimento, você realmente ser capaz de simplesmente pegar os elementos exatos na matriz você quer versus ter de fazer esta multiplicação em outro lugar. Normalmente, essas operações em escala, ou modos de memória em escala abordando têm muito tipo limitado de, multiplicação aqui. Você não pode multiplicar por, digamos, sete. Normalmente, ele é uma espécie de, a multiplicação por fatores de dois ou um pequeno conjunto de fatores de dois, porque isso é, isso é fácil. Isso é apenas uma operação de mudança de base dois. E então, você pode pensar sobre os tipos de dados e seus tamanhos. Então, o que eu quero dizer com tipos de dados? Bem, você poderia ter binário inteiro. Você pode pensar em ter diferentes tipos de dados inteiros. Você pode pensar em ter, unário codificado, binário codificado. Você poderia pensar em ter, as coisas que são, de certa forma, role de diferentes maneiras. Assim, por exemplo, como você provavelmente aprendeu sobre a sua organização de classe computador, há aqueles complemento contra twos complementar aritmética, e isso é diferentes tipos de dados, lá. Então, você tem dados binários inteiros, e dizer se ele é complementar os contra dois, complemento a dois é, é bastante importante. Você pode ter decimal codificado binário. Então, este é o lugar onde cada dígito é codificado com quatro bits de cada algarismo decimal, se você, é codificado em uma espécie de ponteiro. Vai ser o período, se quiser, é, também é codificada ali entre o seu fracção e a parte inteira ou a, a, a, a porção de número natural. Assim, seu decimal binário codificado pode ter diferentes, cálculos muito exatos para coisas como planilhas e negócios cálculos. Você pode ter os tipos de ponto flutuante. E há realmente um monte de diferente tipos de ponto flutuante aqui, você pode ter, há uma padronização agora que é chamado IEEE 754, que é o que é usado em computadores mais modernos. E, este foi diferente do que o Cray pontos flutuantes em supercomputadores Cray. Eles tinham um ponto muito mais ampla de flutuação, e eles também tiveram número diferença de bits dada para a mantissa versus o expoente. E, fazendo isso, a sua precisão pode ser diferente de maneiras diferentes. Assim, por exemplo, você pode ter uma maior intervalo de números, mas a de precisão menor, ou uma pequena faixa de números com maior precisão. E, há diferentes trade-offs lá. Além disso, a Intel internamente, pelo menos em x87, tinha essa coisa que chamaram Intel Extended Precisão que é de 80 bits. IEEE 754, a maior coisa de encontrar em que, é um duplo de 64 bits. Mas, se você quiser ainda mais precisão para seus números de ponto flutuante, você pode precisa de 80 bits. Você poderia ter embalado dados vetoriais. Isto é como os dados da MMX onde você está tentando para embalar os dados todos juntos e operar em que, ao mesmo tempo. Assim, normalmente, coisas como MMX, você precisa para trazer os dados para um tipo de dados embalados, e depois operar em um tipo de dados inteiro, para que tem valores diferentes na mesma. E, algumas arquiteturas mesmo ter um tipo de dados especial chamado endereços que é diferente de um número inteiro binário. Então, alguns computadores mais antigos realmente tinha endereço registra. E o tipo de dados de endereço foi diferente do que os dados de tipo de dados, ou o binário tipo inteiro. E, que era diferente do que o flutuante tipo de dados de ponto, e não era diferente registros e nomes diferentes para registro que. E, o que era agradável sobre isto é, eles sabia que, se você colocou alguma coisa no Registros de endereço, foi definitivamente um endereço. Então, ele tinha informações sobre o tipo, e isso é separar-se da largura. Então, vamos dizer, você tem binário inteiro. Bem, as pessoas construíram máquinas que tem oito bits, 16 bits, 32 bits, 64 bits. Todas essas coisas diferentes, que é uma espécie de o tamanho da palavra padrão. E, em seguida, finalmente, um dos mais importantes coisas que você precisa fazer é vir com a codificação das instruções diferentes. E, tem havido muito debate sobre essa de que você deve ter largura fixo versus variável instruções de largura. Então, vamos olhar para um par de diferentes ISA e ver onde elas caem, o acampamento eles se enquadram. Assim, a maioria das arquitecturas de risco são fixos largura. Então, você tem, MIPS, Power PC, SPARC, ARM, cair nesta categoria. E, como exemplo, MIPS que vamos estar falando muito sobre neste curso, é, cada instrução é exatamente quatro bytes de comprimento. E, o que é legal sobre isso é que é fácil codificar, mas não pode ser muito compacto. No outro lado da de, desta pergunta sobre codificação ISA, você pode ver instruções variáveis ​​de comprimento em que o largura da instrução pode variar amplamente. Então, o que é legal sobre isso é que você pode ter coisas que ocupam, coisas que são muito comum a assumir uma quantidade muito pequena de espaço. Então, se você tem uma instrução que é, como, um byte de comprimento e é sempre chamado, você pode efetivamente fazer um manual Codificação Huffman em seu conjunto de instruções. Então, você leva as coisas mais comuns, e colocá-los na menor quantidade de dados. Mas, se você tem algo que é muito incomum, você pode tê-lo ter um monte de, lote de bytes. Assim, por exemplo aqui, x86, você pode ter entre um e 17 bytes para uma instrução. Eu acho que isso tem realmente foi atualizado agora. Se você olhar para x86-64, que pode ser entre um e 18 bytes. Assim, e algumas idéias aqui. Pode ser qualquer coisa no meio. Um, dois, três, quatro, todo o caminho até a 18. E, algumas arquiteturas CISC, você tem, IBM360 é um bom CISC exemplo, de um arquitetura complexo conjunto de instruções é x86, Motorola 68k, VAX, estes eram todos codificação de instruções de comprimento variável arquiteturas. E agora, buscamos novamente com alguma coisa que um pouco difuso. Há coisas que começam sorta para cruzar mais. As pessoas começaram a olhar, comecei a construir principalmente fixado ou comprimida arquitetura do conjunto de instruções. Então, um exemplo disso, é algo como: MIPS16, que é efetivamente um MIPS conjunto de instruções, onde há de 32 bits ou bytes, quatro instruções e 16 bits ou dois, duas instruções. E, de um polegar, que é o comprimido ou o conjunto de instruções principalmente fixo arquitetura da ARM. Sim, tem que amar a nomeação lá. Também o tipo de coisa semelhante, onde tiveram dois bytes e bytes como quatro instruções diferentes. Este é um pouco diferente do que compactado. Então, isso é como um, um principalmente fixo arquitetura com tipo de duas diferentes tamanhos de instrução. Se você olhar como algo como Power PC e VLI, alguns VLIWs, eles realmente têm um arquivo compactado, o formato comprimido onde eles vão realmente armazenar as instruções compactado e descompactá-los quando acaba na memória principal. Ou, acaba nas caches, pelo menos. Assim, você pode pensar em algumas arquiteturas onde a, o código na memória principal é pequeno. Mas, então, quando chegarmos ao cache-lo, talvez ele é expandido ou fica ampliado quando ele sai para o processador principal. E depois, há palavras de instrução longas onde você realmente pode nomear explicitamente múltiplas instruções acontecendo no ao mesmo tempo. Ou, ainda muito longas palavras de instrução, ou o que é chamado VLIWs, que vamos ser estudando um monte neste curso. Onde você pode colocar vários largura fixa instruções em um, ou vários instruções de um cabaz fixo de largura. Então, alguns bons exemplos aqui são Multiflow, a arquitectura de LX, e também a partir de STMicro, o LX arquitetura [inaudível] da HP e STMicro que é, mostra-se em impressoras de hoje, principalmente. DSPs Ti são realmente arquiteturas VLIW, e um par de outros bons exemplos. Então, só para mostrar aqui algo complexo de como você pode acabar com 1-18 bytes, aqui, temos de instruções x86 de definido. E, fundamentalmente, você precisa de um código de operação, um Vale byte de opcode. Mas, você pode, algumas instruções podem têm entre um e três bytes aqui. E então, não é diferente abordando modos, informações especiais sobre diferentes modos de endereçamento, deslocamentos e medeia a cerca de endereçamento diferente modos. E todos aqueles ocupam mais espaço. E podem também ter, de modo que os prefixos REP, REP no REP, REP MOVSB ​​é na verdade um prefixo, que diz que, repita esta operação várias vezes. Você pode codificar todas essas coisas em um variável com formato de instrução como x86. E, para dar um exemplo, algo como MIPS, todas as instruções em MIPS é exatamente quatro bytes de comprimento e que têm de caber tudo para ele. Então, um arquiteto ISA ou Conjunto de Instruções Arquiteto arquitetura tem de decidir o layouts dos bits dentro de uma instrução definido e que geralmente é algo que é definido no conjunto de instruções arquitetura. Então, para resumir algumas instruções mundo real conjuntos e onde eles caem com diferentes número de operandos, de operação, número de as operações de memória, tamanhos de dados e registradores, vamos caminhar por um par de arquiteturas de conjunto de instruções diferentes. E, você provavelmente já ouviu estas no passado, ouviu estes de passagem, mas você não pode efectivamente utilizado qualquer destas máquinas. Mas, isso é porque alguns deles são incorporado ou alguns deles não são não comumente usado mais. Mas, eles são bons para conhecer. Então, vamos começar com Alpha. Alpha foi construído pela Digital Equipment Corporation, e é um registo-registo arquitetura com três operandos nomeados. Não há operandos memória explícita no conjunto de instruções, tem 64 bits como o tipo de dados padrão. E quando, na verdade, Alpha veio originalmente fora, você só podia fazer 64 operações de bit com isto. Isso vai, de certa forma, mais tarde, mudar à medida que descobrir que não poderia ter sido o melhor idéia. Endereçamento de 64 bits, foi principalmente concebidos para estações de trabalho. Endereços assim, grandes, computadores rápido, eles pode ver algo como ARM. Braço é usado no meu celular. É uma arquitetura que há um monte de diferentes implementações, e eles licenciada para muitas pessoas diferentes, mas também é registrar, registrar, registrar, três operandos. Há um, um de 32 e agora é uma 64-bit tamanho dos dados que acaba de sair. 30, que vai ser 16 registros, eo endereçamento, como eu disse, é um 64-bit versão saiu mas é principalmente 32. E, ele mostra-se em telefones celulares embutidos aplicações. Mips que é, uma conseqüência do Stanford MIPS projeto e, posteriormente, foi comercializado. Registre-se, registrar, registar, vamos a focar esta principalmente neste classe. Espécie de estação de trabalho semelhante incorporado. Sparc é outro conjunto de instruções. Isto é o que Sun originalmente utilizado, ou utilizados de usar. Foi uma conseqüência do seu risco de um, e tipo de risco dois, arquiteturas. Tem, assim, este é, este é um interessante. Entre 24 e 32 dependendo de registos como você, você olha para ele. Eles têm essa idéia interessante, onde, como você carrega mais dados, tipo, ou como você fazer chamadas de função, dados se derramou na memória principal e fica preso em da memória principal, tipo como uma pilha. Então, é tipo, uma mistura entre um empilhar e um, a arquitetura de um registo. A maioria destes eram estações de trabalho. Você pode ver que a TI C6000, mais para DSPs. Mas, então, nós vamos começar a ver algum coisas mais interessantes aqui. Vamos dar uma olhada em VAX. Então, VAX é uma arquitetura de memória de memória, onde tem três operandos nomeados, ou pode ter até três operandos nomeados, e todos os três deles podem vir de principal memória. Tem o número relativamente pequeno de registra, e podemos ver algo como o Motorola 6800. Isto não deve ser confundido com o 68000 ou a 68K, este é um 6800. Que tem acumulador baseado registrar ou arquitetura baseada em acumulador onde você pode ter um nome que vem operando, vem da memória. É um 8-bit caminho de dados, e é usado principalmente em um micro-controlador. Então, por que, por toda a diversidade nestes arquiteturas de conjunto de instruções? Bem, arquitetura de conjunto de instruções é realmente influenciado pela tecnologia, ou influenciada pela tecnologia de transistor. Assim, vemos que, se o armazenamento é limitado, pode querer codificação apertado. E, por outro lado é muito se você tem pequeno número de transistores, você pode querer para se ajustar sobre o chip inteiro, e este foi o, na verdade, a idéia fundamental atrás RISC. Se você tem muitos e muitos transistores, você sabe, pode não ter que se preocupar com ter que enfiar tudo em um muito pequena quantidade de área. Você poderia pensar sobre a adição de múltiplos núcleos e muitos núcleos, ou uso de múltiplos processadores lá e construir um conjunto de instruções arquitetura especificamente projetada para multicores e núcleos muitos. E, em seguida, também, os conjuntos de instruções são muitas vezes influenciados por suas aplicações. Assim, um bom exemplo disso é que, se você está a construção de uma arquitectura de processamento de sinal ou de um, ou de um processador de sinal digital, um DSP, você pode querer adicionar DSP instruções. E então, finalmente, eu quero falar sobre como a tecnologia de software tem arquitetura de conjunto de instruções influenciado ao longo do tempo. Então, se olharmos para algo como o SPARC arquitetura, ele tem o que é chamado de registrar janela. Assim, na janela de registo, o que acontece é sempre que você faz uma chamada de função, ele vai realmente ter oito registradores e colocá-los na memória, e então você começa oito novos registra. Quando você faz um retorno, que leva oito registra na memória principal e coloca-lo de volta para o arquivo de registro, classificar e swaps fora os que estavam lá antes. E, o que era aquilo, foi no momento em que SPARC foi feita, compiladores não sabia como fazer alocação de registradores. Então, você perderia como um problema em aberto. Desde aquele tempo, alocação de registradores, descobrir como levar um número fixo de registros e dados em movimento a partir de uma pilha em memória principal e vice-versa pode ser orquestrada de forma muito eficaz e muito eficientemente pelo compilador. Mas, no momento, foram muito compiladores simples. Então, as pessoas não sabem como fazer isso, então eles precisavam de hardware ajudar a fazer isso. Assim, a arquitetura do conjunto de instrução tem que constroem cozido para ele. Mas, agora que temos registo eficaz alocação, nós não vimos qualquer outro arquiteturas registar janelas vir depois disso. Se você falar com qualquer um que é realmente fui e implementou uma instrução SPARC definir arquitetura, arquitetura micro, eles basicamente odeio registo janelas. É como se a desgraça desta arquitetura. Mas, em vez da tecnologia compilador foi não é bom o suficiente. Assim, as aplicações influenciá-lo, compilador tecnologia influencia o seu conjunto de instruções arquitetura. Tecnologia influencia o ISA, e ISA tem evoluído ao longo do tempo. Mesmo que, como dissemos inicialmente, você Sabe, muitas vezes as pessoas querem construir ISA que não mudam assim você pode manter executando um software que tem binário compatibilidade. Mas, você sabe, às vezes, em algum ponto, pode fazer sentido para realmente quebrar a compatibilidade e re-otimizar sua arquitetura de conjunto de instruções.