• Nenhum resultado encontrado

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

Documentos relacionados