2.O CONJUNTO DE INSTRUÇÕES DO PROCESSADOR DA MÁQUINA 2002

O conjunto de instruções empregado por esse processador é formado por 256 instruções, sendo que os códigos das instruções são sempre formados por 8 bits. A figura 1 apresenta um resumo de todo o conjunto de instruções. A Tabela 1 relaciona todas instruções em ordem crescente de código de operação e a Tabela 2 relaciona todas instruções na ordem alfabética dos mnemônicos e operandos.

A grande maioria das instruções opera sobre dados de 8 bits e produz resultados também de 8 bits. Existem, porém, algumas instruções que empregam operandos de 16 bits e produzem resultados de 16 bits, duas instruções que empregam dois operandos de 8 bits e geram resultados de 16 bits e duas instruções que empregam um operando de 16 bits e um operando de 8 bits e geram dois resultados de 8 bits.

O conjunto de instruções desta máquina pode ser dividido em quatro grandes sub-conjuntos:


 

2.1. AS 96 INSTRUÇÕES DE MOVIMENTAÇÃO DE DADOS

As instruções de movimentação de dados geralmente não interferem no estado dos indicadores (exceto no caso da instrução "POP F"). Essas instruções geralmente podem empregar operandos que estão na memória ou armazenar resultados na memória. Em ambos os casos a posição de memória que será referenciada geralmente pode ser selecionada empregando qualquer um dos modos de endereçamento disponíveis nesse processador. As instruções de movimentação de dados são divididas em oito sub-conjuntos:

    Movimentações de dados de 8 bits para registradores (36 instruções com mnemônico "MOV"): O primeiro operando indica o registrador para onde o dado será copiado e pode ser qualquer um dos quatro registradores de 8 bits de uso geral. O segundo operando indica a fonte do dado a ser copiado. Existem nove possibilidades para o segundo operando: operando imediado de 8 bits (uma única possibilidade), um registrador de uso geral diferente daquele que está recebendo o valor (3 possibilidades) ou o valor armazenado em uma posição de memória que pode ser endereçada usando quaquer uma das cinco formas de endereçamento disponíveis no processador da máquina 2002 (5 possibilidades);

    Movimentação de dados de 8 bits para uma posição da memória (13 instruções com mnemônico "MOV"): O primeiro operando especifica a forma de endereçamento da posição de memória que receberá o valor e pode assumir qualquer uma das cinco formas de endereçamento disponíveis no processador da máquina 2002. O segumdo operando pode ser qualquer registrador de uso geral que não esteja envolvido na geração do endereço da posição de memória especificada pelo primeiro operando (4 possibilidades no caso do modo de endereçamento imediato e 2 possibilidades no casos das formas de endereçamento que empregem os modos de endereçamento implícito ou indexado) ou ainda, apenas no caso do primeiro operando empregar o modo de endereçamento imediato, um operando imediato;

    Movimentação de dados para pares de registradores de uso geral (16 instruções com mnemônico "MOV"): O primeiro operando indica o par de registradores ("AB" ou "CD") que receberá o valor de 16 bits que será copiado pela instrução. O segundo operando indica a fonte do dado que será copiado e pode ser um operando imediato de 16 bits, uma posição de memória endereçada de alguma das cinco formas de endereçamento disponíveis no processador da máquina 2002, o par de registradores que não foi especificado como primeiro operando da instrução ou o registrador "SP";

    Movimentação de dados de 16 bits para o registrador "SP" (4 instruções com mnemônico "MOV" ): O primeiro operando é "SP" indicando que este registrador receberá o dado que será copiado pela instrução. O segundo operando pode ser um operando imediato de 16 bits, um par de posições de memória endereçada empregando o modo de endereçamento imediato ou um dos pares de registradores de uso geral;

    Movimentação de dados de 16 bits para pares de posições de memória (7 instruções com mnemônico "MOV"): O primeiro operando indica a forma de endereçamento da primeira posição do par de posições de memória que receberão o valor de 16 bits e pode assumir qualquer uma das cinco formas de endereçamento disponíveis no processador da máquina 2002. O segundo operando pode ser qualquer par de registradores de uso geral que não esteja envolvido na geração do endereço da posição de memória especificada pelo primeiro operando (duas possibilidades no caso de endereçamento imediato e apenas uma única possibilidade para cada uma das demais formas de endereçamento) ou o registrador "SP", no caso do primeiro operando empregar o modo de endereçamento imediato;

    Entrada e saída (4 instruções: 2 com mnemônico "IN" e 2 com mnemônico "OUT"): O único operando indica o destino do dado lido do periférico, no caso das instruções de entrada (mnemônico "IN") ou a fonte do dado a ser escrito no periférico, no caso das instruções de saída(mnemônico "OUT"). Esse único operando pode ser o registrador "A" ou o registrador "B";

    Operações na pilha com dados de 8 bits (12 instruções: 6 com mnemônico "PUSH" e 6 com mnemônico "POP"): O único operando especifica o dado que será colocado no topo da pilha, no caso das instruções com mnemônico "PUSH", ou para onde vai o dado que será buscado do topo da pilha, no caso das instruções com mnemônico POP". Esse único operando pode ser um registrador de 8 bits de uso geral ("A", "B", "C" ou "D"), o registrador de indicadores ou uma posição de memória cujo endereço é especificado empregando o modo de endereçamento imediato;

    Operações na pilha com dados de 16 bits (4 instruções: 2 com mnemônico "PUSH" e 2 com mnemônico "POP"): O único operando especifica o dado que será colocado no topo da pilha, no caso das instruções com mnemônico "PUSH", ou para onde vai o dado que será buscado do topo da pilha, no caso das instruções com mnemônico "POP". Esse único operando pode ser qualquer um dos dois pares de registradores de uso geral ("AB" ou "CD").

2.2. AS 117 INSTRUÇÕES ARITMÉTICAS E LÓGICAS

As instruções aritméticas e lógicas geralmente só podem empregar operandos imediatos ou operandos que estejam armazenados em registradores do processador e armazenam seus resultados também em registradores da máquina (só existe exceção: as operações de decrementação e incrementação podem ser realizadas sobre o conteúdo de uma posição de memória cujo endereço é especificado empregando o modo de endereçamento imediato).

As instruções aritméticas e lógicas geralmente alteram o estado dos indicadores e podem ser divididas em oito sub-conjuntos, sendo que os quatro primeiros correspondem às operações que empregam apenas um operando (que especifica tanto a fonte do dado como o local onde será colocado o resultado) e os outros quatro sub-conjuntos correspondem às operações que empregam dois operandos.

Nas operações de dois operandos, o primeiro operando geralmente armazenará o valor obtido como resultado da operação aritmética ou lógica (exceto no caso das instruções de menmônico "CMP", que não produzem resultados e nas instruções de multiplicação, cujos resultados de 16 bits são sempre colocados no par de registradores "AB").

A seguir são descritos os oito sub-conjuntos de intruções aritméticas e lógicas:

    Instruções de decrementação e incrementação sobre operandos de 8 bits (10 instruções: 5 com mnemônico "DEC" e 5 com mnemônico "INC"): O único operando pode ser qualquer um dos quatro registradores de 8 bits de uso geral ("A", "B", "C" ou "D") ou uma posição de memória cujo endereço é especificado usando o modo de endereçamento imediato;

    Instruções de decrementação e incrementação sobre operandos de 16 bits (6 instruções: 3 com mnemônico "DEC" e 3 com mnemônico "INC"): O único operando pode ser um dos dois pares de registradores de uso geral ("AB" ou "CD") ou o registrador "SP";

    Instruções que realizam as demais operações unárias sobre operandods de 8 bits (12 instruções: duas com cada um dos seis seguintes mnemônicos: "NOT", "NEG", "SHL", "SHR", "RL", "RR"): O único pode ser o registrador "A" ou o registrador "B";

    Instruções que realizam as demais operações unárias sobre operandos de 16 bits (6 instruções: cada uma com um dos seis seguintes mnemônios: "NOT", "NEG", "SHL", "SHR", "RL", "RR"): O único operando só pode ser o par de registradores "AB";

    Instruções que realizam operações binárias sobre operandos de 8 bits (64 instruções: oito com cada um dos oito seguintes mnemônicos: "SUB", "ADD", "SBB", "ADC", "CMP", "AND", "XOR", "OR"): O primeiro operando geralmente especifica tanto o registrador que fornece o valor a ser usado como primeiro operando como o local onde será colocado o resultado da operação (exceto no caso das instruções de mnemônico "CMP", que não gera resultados) e só pode ser o registrador "A" ou o registrador "B". O segundo operando pode ser um operando imediato ou um registrador de uso geral (que sempre será diferente daquele usado como primeiro operando);

    Instruções que realizam operações binárias sobre operandos de 16 bits (14 instruções: 7 com mnemônico "ADD" e 7 com mnemônico "SUB"): O primeiro operando pode ser um dos pares de registradores ("AB" ou "CD") ou o registrador "SP". Esse operando fornece a primeira parcela ou o minuendo usado na subtração e também armazenará o resultado obtido. O segundo operando pode ser um operando imediato de 16 bits ou um dos pares de registradores (que sempre será diferente daquele usado como primeiro operando);

    Instruções de multiplicação e divisão (4 instruções: cada uma com um dos quatro seguintes mnemônicos: "MUL", "IMUL", "DIV" e "IDIV"): Nas instruções de multiplicação (instruções com mnemônicos "MUL" e "IMUL"), o primeiro operando fornecerá o primeiro fator e será o registrador "A" enquanto que o segundo operando fornecerá o segundo fator e será o registrador "D". O produto será colocado no par de registradores "AB". Nas instruções de divisão (instruções com mnemônicos "DIV" e "IDIV"), o primeiro operando fornecerá o dividendo e será o par de registradores "AB" e o segundo operando fornecerá o divisor e será o registrador "D". O resto obtido na divisão é colocado no registrador "A" e o quociente no registrador "B".

    Instrução que realiza a expansão com preservação do sinal (uma instrução com mnemônico "EXP"): O primeiro operando é o registrador "A" e o segundo é o registrador "B". Se o valor do registrador "B" for positivo ou nulo, o registrador "A" recebe o valor zero. Se o valor do registrador "B" for negativo, todos os bits do registrador "A" receberão o valor um. Desta forma, esta instrução expande o valor de 8 bits com sinal que está no registrador "B" de forma a que ele passe a ocupar os 16 bits do par de registradores "AB", preservando o sinal;

2.3. AS 38 INSTRUÇÕES DE DESVIO

As instruções de desvio nunca interferem no estado dos indicadores e podem ser divididas em oito sub-conjuntos. Nas instruções dos cinco primeiros sub-conjuntos o alvo do desvio é especificado de forma relativa, empregando um operando de 8 bits com sinal.

Para realizar o desvio relativo, o valor do operando de 8 bits com sinal é expandido para 16 bits preservando o sinal e adicionado ao conteúdo atual do registrador "IP". Nos outros três sub-conjuntos o alvo do desvio é especificado de forma absoluta por um valor de 16 bits que será simplesmente copiado para o registrador "IP". A seguir estão descritos os sete sub-conjuntos de instruções de desvio:

    Desvios incondicionais relativos (3 instruções com mnemônico "JR"): O único operando fornece um valor de 8 bits que será expandido para 16 bits preservando o sinal e adicionado ao conteúdo do registrador "IP". Este operando pode ser um operando imediato, o registrador "A" ou o registrador "B";

    Desvios condicionais dependentes do valor de apenas um indicador (10 instruções: cada uma com um dos dez seguintes mnemônicos: "JS", "JP", "JO", "JC", "JZ", "JNS", "JNP", "JNO", "JNC" e "JNZ"): O único operando é sempre um valor imediato de 8 bits que é usado para especificar de forma relativa o alvo do desvio. Cada uma das instruções de mnemônico "JS", "JP", "JO", "JC" e "JZ" testa apenas um dos indicadores do processador da máquina 2002 (respectivamente, sinal, paridade, transbordamento, vai um e zero). Cada uma dessas instruções realizará o desvio se o indicador testado estiver com valor um. As instruções com mnemômicos "JNS", "JNP", "JNO", "JNC" e "JNZ" também testam apenas um indicador mas realizarão o desvio se o indicador testado estiver com valor zero.

    Desvios condicionais dependentes do valor de mais de um indicador (6 instruções: cada uma com um dos seis seguintes mnemônicos: "JZC", "JSO", "JSONZ", "JNZC", "JNSO" e "JZNSO"): O único operando é sempre um valor imediato de 8 bits que é usado para especificar de forma relativa o alvo do desvio. Nas instruções de mnemônico "JZC" e "JNZC" os indicadores de vai um e zero são testados, sendo que a instrução cujo mnemônico é "JZC" realizará o desvio se um destes indicadores estiver com valor igual a um enquanto que a instrução cujo mnemônico é "JNZC" realizará o desvio se ambos indicadores estiverem com valores iguais a zero. Nas instruções com mnemônicos "JSO" e "JNSO" os indicadores de sinal e transbordamento são comparados, sendo que a instrução cujo mnemônico é "JSO" realizará o desvio se esses indicadores estiverem com valores iguais enquanto que a instrução de mnemônico "JNSO" realizará o desvio se estes indicadores estiverem com valores diferentes. Nas instruções com mnemônicos "JNSO" e "JSONZ" os indicadores de sinal e transbordamento são comparados e o estado indicador de zero também é levado em conta: No caso da instrução cujo mnemônico é "JSONZ", o desvio será realizado se o indicador de zero estiver com valor igual a zero e os outros dois indicadores testados estiverem com valores iguais enquanto que no caso da instrução cujo mnemônico é "JZNSO" o desvio será realizado se o indicador de zero estiver com valor igual a um ou se os outros dois indicadores testados estiverem com valores diferentes.

    Desvios condicionais dependentes dos valores armazenados em registradores (12 instruções: quatro com cada um dos três seguintes mnemônicos: "JEQZ", "JNEQZ" e "LOOP"): O primeiro operando dessas instruções esprecifica um dos registradores de 8 bits de uso geral ("A", "B", "C" ou "D"). O conteúdo do registrador especificado pelo primeiro operando será comparado com zero, sem alterar o estado dos indicadores do processador, sendo que, no caso das instruções cujo mnemônico é "LOOP", este valor é decrementado, também sem alterar os indicadores, antes de ser comparado com zero. Se a condição selecionada pela operação estiver atendida (valor do registrador especificado igual a zero no caso das instruções de mnemônico "JEQZ" ou valor do registrador especificado diferente de zero no caso das instruções cujos mnemônicos são "JNEQZ" ou "LOOP"), o valor do segundo operando, que é sempre um operando imediato de 8 bits, é expandido preservando o sinal para 16 bits e somado ao registrador "IP";

    Desvios incondicionais absolutos (3 instruções com mnemônico "JMP"): O único operando fornece um valor de 16 bits que será copiado para o registrador "IP" e pode ser um operando imediato de 16 bits ou um dos pares de registradores ("AB" ou "CD");

    Chamadas de sub-rotinas (3 instruções com mnemônico "CALL"): O único operando fornece um valor de 16 bits que será copiado pata o registrador "IP" depois que o conteúdo desse registrador tiver sido colocado na pilha. Esse operando pode ser um operando imediato de 16 bits ou um dos pares de registradores ("AB" ou "CD"). O valor que é colocado na pilha é o valor que o registrador "IP" teria ao final da execução da instrução se o desvio especificado não tivesse sido realizado.

    Retorno de sub-rotinas (uma instrução com mnemônico "RET"): Não emprega operandos. Um valor de 16 bits é lido do topo da pilha e colocado no registrador "IP";

2.4. AS 5 INSTRUÇÕES DE CONTROLE

As instruções de controle não empregam operandos e podem interferir no estado do indicador de vai um. Essas instruções podem ser divididas em dois sub-conjuntos:

    Manipulação do indicador de vai um (3 instruções: cada uma com um dos três seguintes mnemônicos: "CLC", "CMC" e "STC"): A instrução cujo mnemônico é "CLC" zera o indicador de vai um. A instrução cujo mnemônico é "CMC" inverte o estado do indicador de vai um. A instrução cujo mnemônico é "STC" coloca o valor um no indicador de vai um;

    Instruções de controle propriamente ditas (2 instruções: uma com mnemônico "HALT" e uma com mnemônico "NOP"): A instrução cujo mnemônico é "HALT" para o processador e a instrução cujo mnemônico é "NOP" não faz nada.