AULA 5 - Microprocessadores - Graduação: mudanças entre as edições
imported>Fargoud |
imported>Fargoud Sem resumo de edição |
||
| (160 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
| Linha 1: | Linha 1: | ||
= | =CONJUNTOS DE INSTRUÇÕES GENÉRICAS DE MICROPROCESSADORES= | ||
Um programador de linguagem de alto nível normalmente conhece muito pouco acerca da arquitetura da máquina que está usando. | Um programador de linguagem de alto nível normalmente conhece muito pouco acerca da arquitetura da máquina que está usando. | ||
| Linha 26: | Linha 26: | ||
* Código de operação (''OPCODE'') - Especifica a operação a ser efetuada (por exemplo, ADD, ou E/S, etc). A operação é especificada por um código binário. | * Código de operação (''OPCODE'') - Especifica a operação a ser efetuada (por exemplo, ADD, ou E/S, etc). A operação é especificada por um código binário. | ||
Ex: [https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_13_-_Eletr%C3%B4nica_Digital_1_-_Gradua%C3%A7%C3%A3o#Unidade_L.C3.B3gico-Aritm.C3.A9tica_.28ULA.29 Palavra de seleção (SMCn) em uma ULA de 4 bits] | |||
* Referência a operando fonte - a operação pode envolver um ou mais operandos fonte, ou seja, que constituem dados de entrada para a operação. | * Referência a operando fonte - a operação pode envolver um ou mais operandos fonte, ou seja, que constituem dados de entrada para a operação. '''Exemplos:''' | ||
'''Exemplos:''' | |||
** operação com um único operando: INV(A) | ** operação com um único operando: INV(A) | ||
** operação com dois operandos: ADD(A,B) | ** operação com dois operandos: ADD(A,B) | ||
| Linha 83: | Linha 83: | ||
pode significar adicionar o valor contido na posição Y, com o valor contido no registrador R. | pode significar adicionar o valor contido na posição Y, com o valor contido no registrador R. | ||
Neste caso, Y é um endereço de memória e R, um registrador da própria CPU. | Neste caso, Y é um endereço de memória e R, um registrador da própria CPU. | ||
====Exercício==== | |||
Em uma [https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_13_-_Eletr%C3%B4nica_Digital_1_-_Gradua%C3%A7%C3%A3o#Unidade_L.C3.B3gico-Aritm.C3.A9tica_.28ULA.29 ULA de inteiros de 4 bits], com formato de instrução '''''[OPCODE(5) A(4) B(4)]''''', qual seria a instrução correspondente, se a intenção fosse executar a operação lógica ''Y = OR(A', B) '', com ''A = 0001b'' e ''B = 1010''? | |||
==NÚMERO DE ENDEREÇOS== | ==NÚMERO DE ENDEREÇOS== | ||
| Linha 173: | Linha 178: | ||
Caso contrário, o programa segue com a próxima instrução adjacente, sem alterações no PC além do incremento normal. | Caso contrário, o programa segue com a próxima instrução adjacente, sem alterações no PC além do incremento normal. | ||
Estas instruções normalmente têm o nome de ''BRANCH'' ou ''JUMP'' e podem depender de uma condição, ou ser incondicionais. | |||
'''Exemplo:''' | |||
[[imagem: MIPbranch.png|center]] | |||
===Instruções de Chamada de procedimento=== | |||
Um procedimento, ou função, ou ainda subrotina é um trecho de código independente que modulariza um programa. | |||
O mecanismo de controle de procedimentos envolve duas instruções básicas: uma instrução de '''chamada''', que desvia a instrução corrente para o início do procedimento, e uma instrução de '''retorno''', que provoca o retorno da execução para o endereço onde ocorreu a chamada. Ambas são condições de desvio. | |||
A figura abaixo ilustra o uso de procedimentos na execução de um programa. | |||
[[imagem: MIPproceds.png|center]] | |||
==INSTRUÇÕES DO PENTIUM II E DO POWERPC== | |||
Para exemplificar, apresentamos o caso especial de conjunto de instruções de um processador de propósito geral que foi muito utilizado até o início da década de (20)00. | |||
[[imagem: MIPconjp21.png|center]] | |||
[[imagem: MIPconjp22.png|center]] | |||
[[imagem: MIPconjp23.png|center]] | |||
------------- | |||
{| border="1" cellpadding="5" cellspacing="0" | |||
! style="background: #00ff00;" | [[MIP| << Página da disciplina ]] | |||
! style="background: #cdc5bf;" | [[AULA 4 - Microprocessadores - Graduação | Aritmética computacional < ]] | |||
! style="background: #cdc5bf;" | Aula 5 - Conjunto de instruções genéricas de microprocessador | |||
! style="background: #cdc5bf;" | [[AULA 5-2 - Microprocessadores - Graduação | Conjunto de instruções do ARM > ]] | |||
|} | |||
Edição atual tal como às 12h26min de 7 de outubro de 2025
CONJUNTOS DE INSTRUÇÕES GENÉRICAS DE MICROPROCESSADORES
Um programador de linguagem de alto nível normalmente conhece muito pouco acerca da arquitetura da máquina que está usando.
O conjunto de instruções da máquina é o limite em que o projetista de CPU e o programador de baixo nível enxergam, da mesma máquina.
Implementar uma CPU é uma tarefa que envolve, em grande parte, implementar um conjunto de instruções de máquina.
Já programar em linguagem de máquina (na verdade, em linguagem de montagem, Assembly) exige um conhecimento acerca do conjunto de registradores da CPU, a estrutura de memória, os tipos de dados disponíveis na máquina e o funcionamento da ULA.
Porém, da descrição do conjunto de instruções à uma compreensão sobre o funcionamento da CPU, há um longo caminho.
CARACTERÍSTICAS DE INSTRUÇÕES DE MÁQUINA
A operação de uma CPU é determinada pelas instruções que ela executa, conhecidas como instruções de máquina.
A coleção de instruções que uma determinada CPU é capaz de executar é conhecida como conjunto de instruções da CPU.
Elementos de instrução de máquina
Cada instrução deve conter toda a informação necessária para que a CPU possa executá-la.
A figura acima ajuda a definir os elementos da instrução:
- Código de operação (OPCODE) - Especifica a operação a ser efetuada (por exemplo, ADD, ou E/S, etc). A operação é especificada por um código binário.
Ex: Palavra de seleção (SMCn) em uma ULA de 4 bits
- Referência a operando fonte - a operação pode envolver um ou mais operandos fonte, ou seja, que constituem dados de entrada para a operação. Exemplos:
- operação com um único operando: INV(A)
- operação com dois operandos: ADD(A,B)
- operação com três ou mais operandos: DEV(GE(A,B),C,D)
- Referência a um operando de destino - a operação pode eventualmente produzir um resultado, que deverá ser enviado a um endereço de memória, ou registrador
- Endereço da próxima instrução - indica aonde a CPU deve buscar a próxima instrução (memória principal ou virtual), depois que a instrução corrente for completada, quando for o caso.
Os operandos fonte e destino podem estar localizados em:
- Memória principal ou virtual - implica em busca na memória RAM, ou no HD (quando virtual)
- Registrador da CPU - se houver apenas um registrador, a referência a ele poderá ser implícita. Quando há acumulador, a referência a ele é default. Caso hajam vários registradores, normalmente a referência a cada um, individualmente, é feita por um número inteiro correspondente.
- Dispositivo de E/S - indicado diretamente na instrução. Se for usada a E/S mapeada na memória, esta informação se resumirá a um endereço de memória, como os demais. Pode ser também um registrador específico (Ex: porta serial).
REPRESENTAÇÃO DE INSTRUÇÕES
Internamente, cada instrução é representada por uma sequência de bits.
É dividida em campos, correspondentes aos elementos da instrução.
Exemplos:
A maioria das CPUs têm mais de um formato de instrução.
Durante a execução, uma instrução é lida em um registrador de instruções (IR) da CPU. A CPU extrai os dados dos vários campos da instrução e efetua a operação correspondente.
Os códigos de operação normalmente são representados por abreviações, chamadas mnemônicos, que evitam que os programadores tenham que trabalhar diretamente com valores binários.
Alguns exemplos mais comuns são:
ADD ------------- Adição SUB ------------- Subtração MPY ------------- Multiplição DIV ------------- Divisão GT ------------- Operação > LT ------------- Operação < GE ------------- Operação ≥ LE ------------- Operação ≤
Os operandos também são representados por símbolos.
Por exemplo:
ADD R, Y
pode significar adicionar o valor contido na posição Y, com o valor contido no registrador R. Neste caso, Y é um endereço de memória e R, um registrador da própria CPU.
Exercício
Em uma ULA de inteiros de 4 bits, com formato de instrução [OPCODE(5) A(4) B(4)], qual seria a instrução correspondente, se a intenção fosse executar a operação lógica Y = OR(A', B) , com A = 0001b e B = 1010?
NÚMERO DE ENDEREÇOS
Uma das maneiras tradicionais de se descrever uma arquitetura é em termos do número de endereços contidos em cada instrução.
Obviamente, instruções aritméticas e lógicas requerem um número maior de operandos (e de endereços, por conseguinte). Normalmente, precisam de dois operandos que serão submetidos a um cálculo ou comparação, e de um terceiro, pra armazenar o resultado.
O endereço da próxima instrução normalmente é implícito, armazenado no registrador PC.
A figura abaixo compara o que seriam instruções típicas de um, dois ou três endereços, para computar a mesma linha de programação:
Y = (A - B) / (C + D x E)
Note que as instruções com 3 endereços implementaram o comando com apenas 4 instruções de máquina. Porém, instruções de 3 endereços não são muito comuns, porque implicam em instruções grandes.
No caso das instruções de 2 endereços, foram necessárias 6 linhas de código, duas a mais, portanto. Nestas instruções é típico que um dos endereços referencie tanto o operando, quanto o resultado. Gera opcodes menores, porém gera códigos maiores e exige maior habilidade do programador.
As instruções de 1 único endereço exigem que um segundo endereço seja sempre implícito (normalmente, o Acumulador - AC). Neste caso, foram necessárias 8 instruções para resolver o problema.
É possível também usar-se em expressões aritméticas uma instrução com ZERO endereço. Neste caso, é necessária uma organização de memória especial, chamada pilha. As instruções com zero endereço sempre referenciam os valores nas duas posições no topo da pilha.
| NÚMERO DE ENDEREÇOS | Representação simbólica | Interpretação |
|---|---|---|
| 3 | OP A, B, C | A ← B OP C |
| 2 | OP A, B | A ← A OP B |
| 1 | OP A | AC ← AC OP A |
| 0 | OP | T ← (T-1) OP T |
Além de tudo que foi citado, as instruções podem variar muito de tamanho porque o endereço em questão de cada operando pode se referir à memória física ou a um dos registradores da CPU. Como as memórias são muito maiores que o número de registradores, vão utilizar endereços muito mais longos.
Assim, existem máquinas que, quando vão endereçar um valor NA MEMÓRIA externa (RAM) utilizam mais de uma instrução para acessar o dado.
Tudo sempre vai depender da arquitetura da máquina.
TIPO DE INSTRUÇÃO
Como já vimos, uma única instrução escrita em linguagem de alto nível pode requerer várias instruções de máquina.
Os tipos de instrução de máquina que existem são:
- Processamento de dados - instruções aritméticas e lógicas
- Armazenamento/transferência de dados - instruções de memória
- Movimentação de dados - instruções de E/S
- Controle - instruções de teste e de desvio
Na maioria das vezes, as instruções são auto-explicativas.
As instruções do tipo transferência de controle, no entanto, podem ser muito complexas. Em todos os casos, exceto com elas a próxima instrução a ser executada é aquele que segue imediatamente a atual, na memória.
Nas instruções de transferência de controle, a CPU atualiza o PC com o endereço de alguma outra instrução, armazenada na memória de programa.
As instruções de transferência de controle são aquelas utilizadas quando há loops no código, ou comandos de decisão ou ainda quando o código teve que ser segmentado em vários arquivos, normalmente porque estava muito extenso.
Instruções de desvio
Nestas, um dos operandos é o endereço da próxima instrução a ser executada.
Com frequência, essa instrução é do tipo desvio condicional, isto é, o desvio só ocorrerá se uma determinada condição for satisfeita. Caso contrário, o programa segue com a próxima instrução adjacente, sem alterações no PC além do incremento normal.
Estas instruções normalmente têm o nome de BRANCH ou JUMP e podem depender de uma condição, ou ser incondicionais.
Exemplo:
Instruções de Chamada de procedimento
Um procedimento, ou função, ou ainda subrotina é um trecho de código independente que modulariza um programa.
O mecanismo de controle de procedimentos envolve duas instruções básicas: uma instrução de chamada, que desvia a instrução corrente para o início do procedimento, e uma instrução de retorno, que provoca o retorno da execução para o endereço onde ocorreu a chamada. Ambas são condições de desvio.
A figura abaixo ilustra o uso de procedimentos na execução de um programa.
INSTRUÇÕES DO PENTIUM II E DO POWERPC
Para exemplificar, apresentamos o caso especial de conjunto de instruções de um processador de propósito geral que foi muito utilizado até o início da década de (20)00.
| << Página da disciplina | Aritmética computacional < | Aula 5 - Conjunto de instruções genéricas de microprocessador | Conjunto de instruções do ARM > |
|---|











