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.