Buscar

Estrutura e Funcionamento da CPU

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 18 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 18 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 18 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 1/18
MI1022806 2023 2 AULA07
Estrutura e Funcionamento da CPU
Pilhas
Representações Little-Endian, Big-Endian e Bi-Endian
Modos de Endereçamento
Endereçamento imediato
Endereçamento direto
Endereçamento indireto
Endereçamento de registrador
Endereçamento indireto via registrador
Endereçamento por deslocamento
Endereçamento Relativo
Endereçamento via registrador-base
Endereçamento por indexação
Endereçamento a pilha
Modos de Endereçamento do ARM
Máquinas CISC x RISC
Paradigma CISC - Complex Instruction Set Computer
Paradigma RISC - Reduced Instruction Set Computer
Arquiteturas de Von Neumann x Harvard
Pipelines
Tempo de processamento
Pipeline na família ARM
Pipeline: Situação Ideal
Arquitetura x Organização de computadores
Exercícios
Estrutura e Funcionamento da CPU
A Unidade Central de Processamento ou CPU (Central Processing Unit), também conhecida como processador, é a parte de um
sistema computacional digital, que executa as instruções de um programa de computador, utilizando a aritmética básica, lógica, e a
entrada e saída de dados. Basicamente, um processador é uma poderosa máquina de calcular que recebe um determinado volume de
dados em padrão binário (0s e 1s) e tem a função de responder a esse volume, processando a informação com base em instruções
armazenadas em sua memória interna.
Uma pilha (http://www.cos.ufrj.br/~rfarias/cos121/pilhas.html), ou stack é uma estrutura de dados ordenada do tipo LIFO (last-
in-first-out) (https://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html), na qual apenas um dos elementos pode ser acessado, em
um dado instante - o elemento do topo da pilha.
O tamanho da pilha, ou o número de elementos empilhados, é variável. Normalmente, existe um tamanho máximo de "níveis" da
pilha, mas estes podem ser continuamente acrescentados ou removidos.
Quase todas as pilhas são controladas por 3 apontadores/ponteiros (variáveis que armazenam endereços de memória):
o apontador que endereça o topo da pilha, normalmente chamado de TOP - este valor é incrementado ou decrementado,
conforme a pilha aumenta ou diminui (até o limite máximo de LENGHT, e o limite mínimo de BOTTOM);
o apontador que endereça o limite máximo de tamanho da pilha, muitas vezes chamado de LENGHT, e
o apontador que endereça a base da pilha, também chamado de BOTTOM.
Normalmente, a instrução que empilha, isto é, coloca um novo dado no topo da pilha é a instrução PUSH. Da mesma forma, a
instrução que desempilha, ou seja, remove o item do topo da pilha, normalmente, chama-se POP.
Índice
Pilhas
http://www.cos.ufrj.br/~rfarias/cos121/pilhas.html
https://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html
https://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 2/18
Figura 1 - Conceito básico de pilha de memória.
Na grande maioria dos casos, as pilhas são usadas nas CPUs para gerenciar a chamada e retorno de procedimento. Ou seja, é comum
que se armazene endereço de retorno nas pilhas, ou status de registradores, etc.
Alguns processadores possuem pilhas para uso interno. Porém estas não estão disponíveis para os programadores.
Quando estiverem, instruções específicas para processamento nas pilhas, além de PUSH e POP, são desejáveis.
Por exemplo:
Figura 2 - Instruções específicas para processamento nas pilhas: 1. Início, 2. PUSH, 3. POP e 4 MUPST.
Note que a última instrução, MUPST, de MUltiPlica STack atuará sobre os dois últimos valores do topo da pilha.
Na imensa maioria dos casos, as operações lógico-aritméticas nas pilhas seguem esta notação pós-fixa, também chamada de
notação polonesa reversa. Nesta notação, o operador vem depois dos operandos.
Exemplo:
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_127_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_127_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_128_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_128_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 3/18
a + b ⇒ a b +
a + (b x c) ⇒ a b c x +
(a + b )x c ⇒ a b + c x 
A figura abaixo ilustra todos os passos, e comportamento da pilha, se esta estivesse executando a sequência de instruções de pilha
abaixo, para efetuar a operação f = (a - b)/(c + d x e):
(I) PUSH A
(II) PUSH B
(III) SUB
(IV) PUSH C
(V) PUSH D
(VI) PUSH E
(VII) MUL
(VIII) ADD
(IX) DIV
(X) POP F
Figura 3 - Instruções de pilha para efetuar a operação f = (a - b)/(c + d x e).
A partir do momento em que os valores utilizados nas CPUs começaram a ultrapassar o limite de um byte (8 bits), surgiu a dúvida:
"como dispor estes bytes componentes de cada palavra na memória?"
Byte menos significativos em endereços mais baixos da memória, ou vice-versa.
Por exemplo:
Seja o valor hexadecimal 12345678h, armazenado em 32 bits, a partir da posição de memória 184, em memória endereçável a cada byte.
Figura 4 - Representação de armazenamento: (a) big-endian e (b) little-endian.
Representações Little-Endian, Big-Endian e Bi-Endian
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_129_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_129_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_130_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_130_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 4/18
No mapeamento mostrado à esquerda, em (a), o byte mais significativo é armazenado no menor endereço de byte. Isto é conhecido
como representação big-endian e é equivalente à ordem de escrita ocidental.
No mapeamento mostrado à direita, em (b), o byte menos significativo é armazenado no menor endereço de byte. Isto é conhecido
como representação little-endian, e é remanescente da ordem de avaliação das operações aritméticas, da direita para a esquerda.
Os processadores bi-endian possibilitam a utilização de ambas as disposições de bytes, big-endian e little-endian. Assim, os
desenvolvedores podem escolher qualquer uma das disposições de bytes, setando bits dos registradores de estado de máquina
(MSR), ao migrar sistemas operacionais, ou aplicações de outras máquinas.
Processadores ARM bi-endian
Os processadores ARM suportam modo bi-endian.
No entanto, o tipo de memória suportada também depende do projeto do resto da plataforma (conexões de barramento,
controladores de memória, periféricos, etc). Consulte sempre o datasheet para se certificar de que o modo escolhido é possível de ser
usado, na sua plataforma.
Tabela 1 - The Cortex-M3 Little Endian memory View Exemple
Adress Bits 31-24 Bits 23-16 Bits 15-8 Bits 7-0
0x1003-0x1000 Byte-0x1003 Byte-0x1002 Byte-0x1001 Byte-0x1000
Byte-0x1007-0x1004 Byte-0x1007 Byte-0x1006 Byte-0x1005 Byte-0x1004
Byte-... Byte-4xN+3 Byte-4xN+2 Byte-4xN+1 Byte-4xN
Tabela 2 - The Cortex-M3 Big Endian memory View Exemple
Adress Bits 31-24 Bits 23-16 Bits 15-8 Bits 7-0
0x1003-0x1000 Byte-0x1000 Byte-0x1001 Byte-0x1002 Byte-0x1003
Byte-0x1007-0x1004 Byte-0x1004 Byte-0x1005 Byte-0x1006 Byte-0x1007
Byte-... Byte-4xN Byte-4xN+1 Byte-4xN+2 Byte-4xN+3
Modos de Endereçamento
Nas aulas anteriores, focamos o que faz um conjunto de instruções. Em particular, examinamos os tipos de operação e de operandos
que podem ser especificados em instruções de máquinas.
Esta aula aborda a questão de como especificar operações e operandos nas instruções:
como o endereço de um operando é especificado e,
como são organizados os bits de uma instrução, para definir a operação e os endereços de operandos, em uma instrução.
Em um formato de instrução típico, os campos de endereço são relativamente pequenos. Para viabilizar a referência a umaenorme
quantidade de posições de memória principal, ou virtual, várias técnicas de endereçamento têm sido empregadas.
As mais comuns são:
Endereçamento imediato;
Endereçamento direto;
Endereçamento indireto;
Endereçamento de registrador;
Endereçamento indireto via registrador;
Endereçamento por deslocamento;
Endereçamento a pilha.
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 5/18
Tabela 3 - Modos de endereçamento
Modo Algoritmo Principal Vantagem Principal Desvantagem
Imediato Operando = A Nenhuma referência à memória Limitada magnitude do operando
Direto EA = A Simples Espaço de endereçamento limitado
Indireto EA = (A) Espaço de endereçamento grande Múltiplas referências à memória
Registrador EA = R Nenhuma referência à memória Espaço de endereçamento limitado
Indireto via Registrador EA = (R) Espaço de endereçamento grande Referência extra à memória
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 6/18
Deslocamento EA = A + (R) Flexibilidade Complexibilidade
Pilha EA = *Top Nenhuma referência à memória Aplicabilidade limitada
Onde
A = conteúdo de campo de endereço da instrução
R = conteúdo de campo de endereço que referencia um registrador
EA = endereço real (efetivo) da posição que contém o operando
(X) = conteúdo da posição de endereço X
A forma mais simples é o endereçamento imediato, no qual o valor do operando é especificado diretamente na instrução
OPERANDO = A
Esse modo pode ser usado para definir e usar constantes ou para atribuir valores iniciais em variáveis.
O valor é armazenado em complemento-dois, e o bit de sinal é propagado.
A grande desvantagem é que o tamanho do operando é limitado pelo tamanho do campo de endereço, o qual, na maioria dos
conjuntos de instrução, é bem menor que o tamanho de uma palavra.
Figura 5 - Endereçamento imediato.
O ARM não aceita endereçamento imediato para acessos à memória.
Algumas instruções, porém, como a MOV, toleram endereçamento imediato, com restrição ao tamanho do valor utilizado (até valor
4096d, 13 bits).
Exemplo no ARM:
 MOV R1, #3
Outra forma simples de endereçamento, na qual o campo de endereço contém o endereço efetivo do operando
EA = A
Também fornece um espaço de endereçamento limitado.
Endereçamento imediato
Endereçamento direto
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_131_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_131_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 7/18
Figura 6 - Endereçamento direto.
Exemplo no ARM:
LDR R3,=MY_NUMBER 
...
MY_NUMBER DCD 0x12345678 ;onde 0x12345678 é o endereço do valor a ser carregado para R3
=> A diretiva DCD tem que ser usada porque o ARM não aceita instruções com a forma:
LDR R3, #2000 ;onde 2000 seria o endereço do valor a ser carregado em R3
Diretiva DCD
A diretiva DCD aloca um ou mais palavras de memória, alinhadas no limite de 4 bytes, e define os conteúdos iniciais de memória, em
tempo de execução.
& é um sinônimo de DCD.
SINTAXE:
{label} DCD expr{,expr}
onde:
expr é:
uma expressão numérica
uma expressão relativa ao registrador PC.
A instrução DCD insere até 3 bytes de preenchimento antes da palavra definida, se necessário, para alcançar o alinhamento de 4-
bytes. A variação DCDU não faz o alinhamento.
EXEMPLOS:
data1 DCD 1,5,20 ; Defines 3 words containing
 ; decimal values 1, 5, and 20
data2 DCD mem06 + 4 ; Defines 1 word containing 4 +
 ; the address of the label mem06
data3 DCDU 1,5,20 ; Defines 3 words containing
 ; 1, 5 and 20, not word aligned
No endereçamento indireto, especifica-se o endereço de uma palavra de memória, que, por sua vez, contém o endereço do operando:
EA = (A)
Endereçamento indireto
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_132_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_132_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 8/18
Figura 7 - Endereçamento indireto.
Exemplo:
Este modo não existe no ARM, mas seria algo do tipo
MOV R1, [0x2000]
Semelhante ao endereçamento direto, exceto que o campo de endereço se refere a um registrador, não a um endereço de memória.
EA = R
Tipicamente, um campo de endereço que referencia um registrador tem 3 a 4 bits, possibilitando referenciar um total de 8 a 16
registradores de propósito geral.
Figura 8 - Endereçamento de registrador.
As vantagens deste modo de endereçamento são:
1. O tamanho do campo de endereço requerido na instrução é pequeno;
2. Não requer nenhuma referência à memória (tempo menor de acesso).
Exemplo no ARM:
 MOV R1, R2 ;onde o valor armazenado em R2 é o valor a ser movido para R1
Neste modo de endereçamento, o campo de endereço contém um registrador, o qual, por sua vez, contém o endereço do operando.
Endereçamento de registrador
Endereçamento indireto via registrador
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_133_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_133_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_134_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_134_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 9/18
Figura 9 - Endereçamento indireto via registrador.
É um dos mais vantajosos, porque permite que o endereço (de tamanho longo) seja utilizado na própria instrução. Como utiliza um
registrador, requer um acesso à memória a menos, tornando o acesso ao operando ainda mais rápido.
Este modo não existe no ARM, mas seria algo do tipo
Exemplo no ARM:
 STR R1,[R0]
É um modo de endereçamento bastante poderoso. Combina as capacidades dos endereçamentos direto e indireto via registrador.
É conhecido por uma variedade de nomes, dependendo do contexto de uso, embora o mecanismo básico seja o mesmo.
EA = A + (R)
O endereçamento por deslocamento requer que a instrução tenha dois campos de endereço, pelo menos um dos quais é explícito.
O outro campo de endereço, ou uma referência implícita baseada no código de operação, especifica um registrador cujo conteúdo é
adicionado a A, para produzir o endereço efetivo.
Figura 10 - Endereçamento por deslocamento.
Os três usos mais comuns do endereçamento por deslocamento são:
Endereçamento relativo
Endereçamento via registrador-base
Endereçamento por deslocamento
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_135_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_135_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_136_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_136_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 10/18
Indexação
No modo de endereçamento relativo, o registrador referenciado implicitamente é o contador de programa. Isto é, o endereço da
instrução corrente é adicionado ao campo de endereço para produzir o endereço efetivo EA.
Nessa operação, o campo de endereço é tipicamente tratado como um número em complemento dois. Portanto, o endereço efetivo é
um deslocamento relativo ao endereço da instrução.
Neste modo de endereçamento, o registrador referenciado contém um endereço de memória, e o campo de endereço contém um
deslocamento em relação a este endereço.
A referência ao registrador pode ser explícita ou implícita.
Exemplo no ARM:
LDR.W R0,[R1, #offset]! ; Read memory[R1+offset], with R1
; update to R1+offset
LDR.W R0,[R1], #offset ; Read memory[R1], with R1
; updated to R1+offset
No modo indexado, o campo deendereço contém um endereço de memória principal e o registrador especificado conterá um
deslocamento positivo, relativo a este endereço.
Um uso importante da indexação é como um mecanismo eficiente para implementar operações interativas.
Considere, por exemplo, uma lista de números armazenados a partir de um endereço A. Suponha que queiramos adicionar 1 a cada
elemento da lista. É necessário buscar cada valor da memória, adicionar 1 ao mesmo e armazená-lo de volta na memória.
Isto pode ser feito mais facilmente utilizando-se indexação. O valor A é armazenado no campo de endereço da instrução e o
registrador escolhido, denominado registrador índice, é inicializado com valor 0.
Depois de cada operação, o registrador índice é incrementado de 1.
Como este tipo de operação é bastante comum, ela é feita automaticamente em algumas plataformas, como no caso do Arm, como
parte da própria instrução. Esta técnica é conhecida como auto-indexação:
EA = A + (R)
R ← R + 1
É uma forma de endereçamento implícito.
As instruções de máquina não precisam incluir uma referência à memória, operando implicitamente sobre o topo da pilha.
Endereçamento Relativo
Endereçamento via registrador-base
Endereçamento por indexação
Endereçamento a pilha
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_137_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_137_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 11/18
Figura 11 - Endereçamento a pilha.
Existem nove formatos utilizados para calcular o endereço para uma instrução LOAD ou STORE, para palavra ou byte sem sinal.
A sintaxe geral é:
 LDR|STR{<cond>}{B}{T} <Rd>, <addressing_mode>
onde
<Rd> é um dos registradores R0 a R15,
<Rn> e <offset> são valores ou um dos registradores R0 a R12, além de R14 (R13 é o SP e R15 é o PC).
<addressing_mode> é uma das nove opções listadas abaixo:
1. Offset imediato
[<Rn>, #+/-<offset_12>]
2. Offset por registrador
[<Rn>, +/-<Rm>]
3. Offset escalonado por registrador
[<Rn>, +/-<Rm>, <shift> #<shift_imm>]
4. Pré-indexado imediato
[<Rn>, #+/-<offset_12>]!
5. Registrador pré-indexado
[<Rn>, +/-<Rm>]!
6. Pré-indexado por registrador escalonado
[<Rn>, +/-<Rm>, <shift> #<shift_imm>]!
7. Pós-indexado imediato
[<Rn>], #+/-<offset_12>
8. Registrador pós-indexado
[<Rn>], +/-<Rm>
9. Pós-indexado por registrador escalonado
[<Rn>], +/-<Rm>, <shift> #<shift_imm>
Mais informações
Clique aqui (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489h/CIHGJHED.html)
EXERCÍCIOS
Teste os exemplos abaixo, com R0 = 30d, R1 = 1200d, R2 = 100d e R5 = 16d:
STR R0, [R1, #4]
STR R0, [R1, -R5]!
Modos de Endereçamento do ARM
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489h/CIHGJHED.html
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 12/18
STR R0, [R1], #8
STR R0, [R1, -R2, LSL #1]!
Conjunto de instruções inicialmente simples
Avanços tecnológicos permitiram a fabricação de computadores com mais transistores e menor custo
Projetistas optaram por conjuntos de instruções cada vez mais complexos
⇒ Intenção: reduzir a distância semântica entre Assembly e linguagens de alto nível
Instruções com elevado grau semântico
Elevado número de modos de endereçamento (ex: endereçamento indireto em memória)
Elevado número de ciclos de clock por instrução → redução da frequência de clock
Menor número de instruções por programa → menor uso de memória de código
Decodificação através de microcódigo → dificulta/impossibilita o uso de pipeline
Instruções simples que executam rápido
Elevado número de registradores de uso geral
Decodificação de instruções com lógica combinacional (tabela)
Execução utilizando pipeline → um ciclo de clock por instrução
Regularidade de tempo de execução
Regularidade de tamanho de instrução
Redução da área de silício e tempo de projeto
Efeito final: melhor desempenho, apesar do número de instruções por programa ser maior
Figura 12 - Quadro comparativo RISC x CISC.
Processadores ARM
São processadores de 32 bits (alguns 64 bits) de arquitetura RISC.
Algumas famílias ARM:
Máquinas CISC x RISC
Paradigma CISC - Complex Instruction Set Computer
Paradigma RISC - Reduced Instruction Set Computer
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_138_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_138_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 13/18
Existem hoje aproximadamente 18 famílias, dentre elas as mais utilizadas são: ARM7, ARM7TDMI, ARM9TDMI, ARM11, Cortex-M,
Cortex-A, Cortex-R.
Cada família tem uma especialização.
Exemplo:
O Cortex-A tem foco na área de processadores para computadores e Smartfones poderosos.
O ARM7 abrange uma grande faixa, desde alguns microcontroladores até processadores de videogames portáteis.
A família Cortex-M (em especial os Cortex-M0+) são arquiteturas focadas para microcontroladores.
A Arquitetura de von Neumann é uma arquitetura de computador que se caracteriza pela possibilidade de uma máquina digital
armazenar os programas no mesmo espaço de memória que os dados, podendo assim manipular programas.
Figura 13 - Arquitetura de von Neumann.
A Arquitetura de Harvard é uma arquitetura de computador que se distingue das outras por possuir duas memórias diferentes e
independentes em termos de barramento e ligação ao processador.
Baseia-se na separação de barramentos de dados das memórias onde estão as instruções de programa e das memórias de dados,
permitindo que um processador possa acessar as duas simultaneamente, obtendo um desempenho melhor do que a da Arquitetura
de von Neumann, pois pode buscar uma nova instrução enquanto executa outra.
A arquitetura Havard logicamente é mais complexa; permite pipelining, normalmente utilizada em arquiteturas RISC e também
possui um repertório com menos instruções que a de Von-Neumann, e essas são executadas apenas num único ciclo de relógio.
Figura 14 - Arquitetura de Havard.
A diferença entre a arquitetura Von Neunmann e a Harvard é que a Harvard separa o armazenamento e o comportamento das
instruções do CPU e os dados, enquanto a Von Neumann utiliza o mesmo espaço de memória para ambos.
Na arquitetura Von-Neumann, é processada uma única informação por vez, visto que nessa tecnologia, execução e dados percorrem
o mesmo barramento, o que torna o processo lento em relação à arquitetura Harvard.
A tecnologia Harvard mais utilizada nos PC's e microcontroladores, pois proporcionam maior velocidade de processamento, pois
enquanto a CPU processa uma informação, outra nova informação está sendo buscada, de forma sucessiva.
Arquiteturas Von Neumann x Harvard nas famílias ARM
Os processadores ARM mais modernos podem ser encontrados nas duas arquiteturas.
São Von Neumann (Não existe separação entre barramentos de dados e o barramento da memória de programa):
Arquiteturas de Von Neumann x Harvard
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_139_MI1022806.jpeg
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_139_MI1022806.jpeg
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_140_MI1022806.jpeg
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_140_MI1022806.jpeg
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 14/18
ARM 7TDMI
Cortex-M0 -->Microcontroladores mais simples, suportam somente o set de instruções Thumb com algumas instruções do
Thumb2 (sempre executam no modo Thumb);
Cortex-M0+ -->Apresentam algumas melhorias em relação ao M0, além de ter suporte opcional à proteção de memória (MPU);
Cortex-M1 -->São utilizados juntos com FPGAs;
São Harvard (Possuem barramentos separados para dados e instruções):
Cortex-M3 -->São microcontroladores mais poderosos, suportam completamente os sets Thumbe Thumb2, além de
multiplicação têm divisão por hardware;
Coxtex-M4 -->Têm instruções para processamento de sinais (DSP), têm uma unidade de ponto flutuante opcional (Cortex-M4F).
Pipeline é uma técnica de hardware que permite que a CPU realize a busca de uma ou mais instruções além da próxima a ser
executada.
Estas instruções são colocadas em uma fila de memória dentro do processador (CPU) onde aguardam o momento de serem
executadas: assim que uma instrução termina o primeiro estágio e parte para o segundo, a próxima instrução já ocupa o primeiro
estágio.
Em resumo, é o processo pelo qual uma instrução de processamento é subdividido em etapas, uma vez que cada uma destas etapas
é executada por uma porção especializada da CPU, podendo colocar mais de uma instrução em execução simultânea.
Figura 15 - Exemplo de busca de uma ou mais instruções sem e com Pipelines.
Isto traz um uso mais racional da capacidade computacional com ganho substancial de velocidade.
Entre os problemas enfrentados estão a dependência de instruções anteriores e desvios que dificultam o processo, bem como a
diferença de complexidade de instruções que fazem com que as mesmas possam levar um tempo variável para execução.
A técnica de pipeline é utilizada para acelerar a velocidade de operação da CPU, uma vez que a próxima instrução a ser executada
está normalmente armazenada nos registradores da CPU e não precisa ser buscada da memória principal que é muito mais lenta.
Pipelines
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_141_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_141_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 15/18
É semelhante a uma linha de produção de fábrica. Cada instrução de um microprocessador passa por diversas fases até sua execução.
Estas fases podem ser:
Busca da instrução
Decodificação da instrução
Cálculo de endereço de operandos
Busca de operandos
Execução da instrução
Escrita de operandos
Se conseguirmos separar todas estas fases de forma independente, e separar cada fase por ciclo de relógio teríamos (neste exemplo) 6
ciclos por instrução.
Se usarmos uma técnica de pipeline poderíamos colocar 6 instruções ao mesmo tempo no microprocessador (cada uma numa fase
distinta) e termos 6 instruções executadas em 6 ciclos (1 instrução por ciclo, idealmente).
Outros problemas advém desta técnica, como desvios (como saber as próximas instruções), e dependência de instruções (a próxima
depende da anterior).
Na prática todos os microprocessadores modernos utilizam-se de várias (dezenas) fases no processamento para usufruir de clocks
maiores (quanto menor a fase, mais rápido pode ser o ciclo).
Figura 16 - Estágios do Pipeline da arquitetura x86 do Pentium 4.
O tempo gasto no processamento de M instruções em um pipeline com K estágios e ciclo de máquina igual a t é dado por:
T = [ K + (M –1 )] * t
Quando M >> K (caso comum), T é aproximadamente M * t
Exemplo:
Se um programa tem 10.001 instruções, quanto tempo leva para ser executado em um processador com pipeline de 5 estágios e
relógio de 100 ns? E sem o pipeline?
T= (5 + (10.000))*100x10-9 =~ 1 ms (com pipeline)
T = 500 ns * 10.000 =~ 5ms (sem pipeline)
PROBLEMAS
Estágios podem ter tempos de execução diferentes:
Tempo de processamento
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_142_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_142_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 16/18
Solução 1: Implementar esses estágios como um pipeline onde cada sub-estágio possui tempo de execução semelhante aos
demais estágios do pipeline principal.
Solução 2: Replicar esse estágio, colocando réplicas em paralelo no estágio principal. O número de réplicas é
dado pela razão entre o tempo do estágio mais lento e os demais.
O sistema de memória é incapaz de manter o fluxo de instruções no pipeline
O uso de memória cache com alta taxa de acerto e tempo de acesso compatível com o tempo de ciclo do pipeline.
Dependências ou Conflitos (“Hazards”)
Conflitos Estruturais - Pode haver acessos simultâneos à memória feitos por 2 ou mais estágios.
Dependências de Dados - As instruções dependem de resultados de instruções anteriores, ainda não completadas.
Dependências de Controle - A próxima instrução não está no endereço subseqüente ao da instrução anterior.
Tratamento de Exceções
São normalmente Pipelines de 3 a 6 Estágios:
1. Busca (Fetch) – Busca da instrução na memória
2. Decodificação (Decode) – Decodificação dos registradores usados na
instrução
1. Execução (Execute)
1. Leitura de registradores
2. Operações lógicas, aritméticas e de deslocamento;
3. Escrita em registradores, etc
Figura 17 - Operações realizadas em registradores numa situação ideal.
⇒ Todas as operações realizadas em registradores → 6 instruções em 6 ciclos de clock (ARM Cortex-M3)
Pipeline na família ARM
Pipeline: Situação Ideal
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_143_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_143_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 17/18
Figura 18 - Operações realizadas em registradores com 6 instruções em 6 ciclos de clock.
PIOR CASO
Salto indireto (instrução BX), 3 ciclos de clock para completar o salto (ARM Cortex-M3).
Arquitetura = documento de especificação
Instruções
Exceções
Registradores
Memória
Ex: ARMv4, ARMv7, etc.
Não tem custo, pode ser obtido diretamente do website da ARM
Organização = implementação física (silício)
Ex: ARM7TDMI, ARM Cortex-M3, etc.
ARM vende a implementação de núcleos em VHDL ou máscara de difusão para empresas licenciadas
Outras característicaS
18 registradores de 32 bits
• Tratamento muito eficiente de interrupções
• Gerenciamento de consumo de energia
• Projetado para ser programado em C (completamente, até mesmo tratamento de reset, interrupções e exceções)
• Permite uso de sistemas operacionais (RTOS)
– Modelo Usuário/Supervisor
Arquitetura ARMv7M
• Sem memória cache ou Unidade de Gerenciamento de Memória (MMU)
• Tabela de vetores contém endereços, não instruções
• Instrução DIV
• Interrupções salvam e recuperam automaticamente o estado do processador
Controlador de Interrupções é parte da macrocélula Cortex-M3
• Mapa de memória fixo
• Registrador único de estado do processador
Arquitetura x Organização de computadores
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_144_MI1022806.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:Fig_144_MI1022806.png
28/11/2023, 08:26 MI1022806 2023 2 AULA07 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA07 18/18
• Núcleo de processamento Thumb-2
– Mistura de instruções de 16 e 32 bits (alta densidade de código), mas não requer alinhamento para instruções de 32 bits
Exercícios
1. Faça um programa em código assembler do ARM que compare 3 variáveis (que podem estar em registradores ou na memória)
e verifique qual é o maior valor entre elas. Admita não haver valores iguais (se a>b e a>c então a; se b>a e b>c então b; senão
c). Teste no simulador (Visual) e entregue o código fonte inteiramente comentado.
2. Faça um programa em código assembler do ARM que descubra qual é o enésimo número da sequencia Fibonnaci. Sabendo
que na matemática, a Sucessão de Fibonacci, é uma sequência de números inteiros, começando normalmente por 0 e 1, na
qual, cada termo subsequente corresponde à soma dos dois anteriores. Exemplo o décimo termo da sequência é o número 34
(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,...). Teste no simulador (Visual) e entregue o código
fonte inteiramente comentado.
3. Faça um programa em código assembler do ARM que receba 100 valores (armazenados na memória) everifique qual é a média
dos 10 maiores valores. Teste no simulador (Visual) e entregue o código fonte inteiramente comentado.
 
Disponível em “https://wiki.sj.ifsc.edu.br/index.php?title=MI1022806_2023_2_AULA07&oldid=191467”
Esta página foi modificada pela última vez em 26 de setembro de 2023, às 13h46min.
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA06
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA06
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2#Aulas
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2#Aulas
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA08
https://wiki.sj.ifsc.edu.br/index.php/MI1022806_2023_2_AULA08
https://wiki.sj.ifsc.edu.br/index.php?title=MI1022806_2023_2_AULA07&oldid=191467