DEC VAX:
3.3. Tipos de Instrução
Instruções de Transferência de Dados
♦ Transferência de dados significa a cópia de dados de um lugar para outro, e é a mais fundamental de todas as operações.
♦ A transferência neste contexto significa a criação de um novo objeto com o mesmo padrão de bits do original, deixando a cópia original intacta.
♦ Locais possíveis de armazenamento de dados: • palavra na memória
• registrador
• pilha (pode ser implementada em registradores ou na
memória, mas a forma de acessá-la é particular).
♦ Devem especificar implicitamente ou explicitamente o operando fonte (original) e destino (onde será guardada a cópia).
♦ Exemplos:
• Motorola (680x0):
Operações Diádicas
♦ Operações diádicas são aquelas que combinam dois operandos para produzir um resultado.
♦ Encontramos neste grupo as operações aritméticas e lógicas.
♦ Instruções Aritméticas:
• Adição, subtração, multiplicação e divisão. ♦ Instruções Lógicas:
• AND, OR, XOR.
• AND: calcula o produto booleano bit a bit de dois argumentos de uma palavra cada, gerando como resultado também uma palavra.
∗ Uso importante: extração de bits de uma palavra, através de uma máscara. A operação AND tende a remover os bits iguais a 1.
∗ Exemplo: extração do segundo caractere de uma palavra de 4 bytes para ser imprimido.
◊ Solução: isolá-lo dos demais bytes e justificá-lo à direita. ◊ Extração:
10110111 10111100 11011011 10001011 A
00000000 11111111 00000000 00000000 B (máscara)
00000000 10111100 00000000 00000000 A AND B
• OR: calcula a operação booleana OR bit a bit de dois argumentos de uma palavra cada, gerando como
∗ Uso importante: empacotamento de bits em uma palavra, que significa o inverso da extração. A operação OR tende a inserir bits 1 no resultado. ∗ Exemplo: trocar os 8 bits mais à direita de uma
palavra de 4 bytes, sem alterar os demais bits. ◊ Solução: limpar o byte a ser alterado, mantendo os
demais, e incluir o novo byte.
◊ Empacotamento: 10110111 10111100 11011011 10001011 A 11111111 11111111 11111111 00000000 B (máscara) 10110111 10111100 11011011 00000000 A AND B 00000000 00000000 00000000 01010111 C 10110111 10111100 11011011 01010111 (A AND B) OR C
• XOR: calcula a operação booleana XOR bit a bit de dois argumentos de uma palavra cada, gerando como
resultado também uma palavra.
∗ Uso importante: permite a inversão de
determinados bits de uma palavra, aplicando a operação XOR com um operando que possua 1s nestes bits. A operação XOR com um bits iguais a 0 não altera o resultado.
∗ Exemplo: inverter os 8 bits do segundo caractere de uma palavra de 4 bytes, sem alterar os demais bits.
◊ Inversão de bits:
10110111 10111100 11011011 10001011 A
00000000 11111111 00000000 00000000 B (máscara)
10110111 01000011 11011011 10001011 A XOR B
♦ Operações aritméticas em ponto-flutuante:
• Antigamente eram implemantada via software.
• Atualmente muitas máquinas possuem instruções de
máquina que implementam operações em ponto-flutuante diretamente por hardware (maior velocidade).
∗ Tamanho menor dos operandos: maior velocidade. ∗ Tamanho maior dos operandos: maior precisão. • Em muitos casos estas operações são realizadas por
processadores numéricos, também chamados de co- processadores. Tais processadores realizam também outras operações que não sejam de ponto-flutuante.
Operações Monádicas
♦ Operações monádicas são aquelas que têm um operando e produzem um resultado.
♦ Em geral são mais curtas que as operações diádicas, pois só necessitam da especificação de um operando.
♦ Encontramos neste grupo as operações para deslocar e rodar o conteúdo de uma palavra.
♦ Deslocamentos: são operações nas quais os bits do operando são movidos para a esquerda ou direita, perdendo os bits deslocados para fora da palavra, formando o resultado.
• As posições vagas são preenchidas com 0.
• Um deslocamento para a direita de k bits significa uma divisão do operando por 2k.
• Um deslocamento para a esquerda de k bits significa uma multiplicação do operando por 2k.
• Exemplo: deslocamento de 2 bits de uma palavra para a
direita.
00000000 00000000 00000000 01110011 A
♦ Rotações: são operações nas quais os bits do operando são movidos para a esquerda ou direita, sendo que os bits que saem da palavra reaparecem do outro lado, formando o resultado.
• Exemplo: rotação de 2 bits de uma palavra para a direita. 00000000 00000000 00000000 01110011 A
11000000 00000000 00000000 00011100 A rodado de 2 bits para a direita
• Propriedade: “Se uma palavra de n bits é rodada k bits para um lado, o resultado é o mesmo caso tivesse sido rodada n-k bits para o outro lado”.
♦ Deslocamentos com sinal: são operações de deslocamentos para a direita que mantêm o sinal do operando para gerar o resultado.
• Na prática, isso significa que as posições vagas do lado
esquerdo são preenchidas com o bit de sinal original, 0 ou 1. Logo, um número negativo permanecerá negativo.
• Exemplo: deslocamento de 2 bits de uma palavra para a
direita, sem a extensão do sinal e com a extensão do sinal. 11111111 11111111 11111111 11110000 A
00111111 11111111 11111111 11111100 A deslocado de 2 bits para a direita sem
extensão do sinal
11111111 11111111 11111111 11111100 A deslocado de 2 bits para a direita com
extensão do sinal
♦ Certas operações diádicas muito utilizadas com operandos específicos podem ser fornecidas na forma monoádica.
• Exemplos:
∗ Mover o valor 0 para uma palavra de memória ou registrador:
◊ Instrução CLEAR.
∗ Somar/subtrair 1 a/de uma palavra de memória ou registrador:
◊ Instrução INC/DEC.
∗ Negar o valor de X (significa fazer a operação
0 - X):
◊ Instrução NEGATE.
Comparações e Desvios Condicionais
♦ Praticamente todos os programas precisam da capacidade de testar seus dados e alterar a seqüência de instruções a serem executadas.
• Exemplo: x
∗ Se x é negativo, retorna mensagem de erro; caso contrário, calcular a raiz quadrada de x.
♦ Solução: a máquina deve possuir instruções de salto condicional (desvio condicional).
♦ As instruções de desvio condicional testam alguma condição e saltam para um determinado endereço se a condição é satisfeita, e continuam a seqüência normal do programa caso contrário.
• O desvio pode ocorrer se uma determinada condição for
satisfeita ou então se uma determinada condição não for satisfeita, de acordo com algum bit da instrução.
♦ A condição mais comum a ser testada é se um bit específico na máquina é 0 ou 1.
• Exemplo: teste do bit de sinal de um resultado.
∗ Se o bit de sinal é 1 (número negativo), o programa continua a partir do endereço Rótulo. Se o bit de sinal é 0, o programa continua a partir da instrução seguinte a instrução de salto.
JNEG REG1, Rótulo ; desvia se o registrador REG1 for negativo.
INSTR 1
; próxima instrução caso REG1 seja positivo.
INSTR 2 . . Rótulo: INSTR 3
; próxima instrução caso REG1 seja negativo.
INSTR 4
. .
♦ Muitas máquinas possuem bits que são utilizados para indicar condições específicas, denominados flags de
máquina. Os flags, de certa forma, indicam o estado atual do processador, e em geral refletem o ocorrido na ULA após a última operação lógica ou aritmética executada.
• Exemplo: vai-um do bit mais a esquerda de uma
operação, indicando o estouro numa operação aritmética.
♦ Comparação entre duas palavras: permite avaliar se elas são iguais ou qual é a maior.
• Instrução que a princípio precisa de três endereços: dois
para os operandos e um para o endereço de desvio.
• Se a máquina não permite instruções de três endereços,
uma solução é disponibilizar dois tipos de instruções:
∗ Instrução de comparação, que armazena alguns bits de condição a respeito do resultado.
∗ Instrução de desvio condicional, que consulta os bits de condição e eventualmente faz o desvio.
∗ Este tipo de solução é adotada pelas famílias Motorola e Intel.
♦ O resultado de uma comparação depende dos sinais dos operandos. Em geral, faz-se a comparação entre dois valores de mesmo sinal, ou precisa-se ter instruções
específicas para números sem sinal e números com sinal.
Sem sinal Com sinal
0 000 100 -4 1 001 101 -3 2 010 110 -2 3 011 111 -1 4 100 000 0 5 101 001 1 6 110 010 2 7 111 011 3 ♦ Outra forma de desvio condicional: pular a próxima
instrução.
Instruções de Chamada de Procedimentos
♦ Procedimento ou sub-rotina ou simplesmente rotina: é um grupo de instruções que realiza uma tarefa e que pode ser chamado de diversas partes do programa.
♦ Um procedimento, após ser executado, deve retornar para o comando após a sua chamada.
• O procedimento deve receber de alguma forma o endereço
para onde ele deve retornar após realizar a sua tarefa (endereço de retorno).
• Formas de se armazenar o endereço de retorno: ∗ Memória:
◊ Posição Fixa: não permite encadeamentos de sub-
rotinas.
◊ Primeira palavra da sub-rotina: cada sub-rotina sabe
onde buscar o endereço de retorno. Não permite recursão
direta ou indireta.
∗ Registrador:
◊ A instrução de chamada de sub-rotina armazena o
endereço de retorno num registrador, deixando a cargo da sub-rotina armazenar o endereço num local seguro.
∗ Pilha:
Controle de Loop
♦ Um programa em geral necessita executar um grupo de instruções um número fixo de vezes - loop.
♦ O controle de loop pode ser implementado através das instruções elementares, devendo:
• Ter um contador, que é decrementado ou incrementado de
uma constante a cada interação.
• Testar o contador a cada interação, terminando o loop se
uma condição for atingida.
♦ Tipos de loop:
• Loop com teste no final
∗ Sempre será executado ao menos uma vez. Falha para n igual a zero.
• Loop com teste no início ♦ Exemplos de controles de loops:
i:=1; i:=1;
1: {primeiro comando} 1: if i > n then goto 2;
{segundo comando} {primeiro comando}
. {segundo comando}
. .
{último comando} .
i := i + 1; {último comando}
if i <= n then goto 1; i := i + 1;
2: {primeiro comando após o loop} goto 1;
2: {primeiro comando após o loop}
(a) teste no final (b) teste no início
♦ Algumas máquinas podem disponibilizar instruções
especiais que fazem o controle de contagem de interações, teste de condição e desvio numa única instrução.
• Intel:
∗ 8088/80286: Instrução LOOP, que decrementa o registrador CX de 1 e salta para um dado rótulo se o resultado não for 0. Se for 0, a execução continua a partir da próxima instrução.
∗ 80386: Idem para o registrador ECX. • Motorola:
∗ Instrução para uma solução mais geral:
◊ Primeiro testa uma determinada condição, que se não
satisfeita, encerra o loop.
◊ Decrementa um registrador D, que se resultar num valor
maior ou igual a 0, repete o loop; caso contrário, encerra o loop.
Entrada e Saída
♦ Apresentam grande variação de máquina para máquina. ♦ Se o espaço de endereçamento de entrada e saída (E/S) não
estiver mapeado em memória (ou seja, os dispositivos de E/S também possuem endereços, da mesma forma que a memória), devem existir instruções especiais (mapeamento em E/S) que permitam:
• A leitura de um dado num dispositivo de entrada. ∗ Instrução: IN.
• A escrita de um dado num dispositivo saída. ∗ Instrução: OUT.
♦ Intel:
• Instruções específicas para E/S: IN e OUT:
∗ Especificam o endereço da porta de E/S de forma direta ou indireta via registrador DX.
∗ Utilizam o registrador AX / EAX como elemento de transferência entre o dispositivo e a CPU.
♦ Motorola:
• Registradores dos dispositivos são endereçados via