Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
27/02/2006

< Computadores XXVI: O conjunto de instruções, final >


Na coluna anterior, “O conjunto de instruções, primeira parte”, examinamos as dez primeiras instruções de nosso modesto conjunto de instruções de apenas dezesseis membros. Hoje examinaremos as seis restantes e veremos como usá-las para desenvolver um programa em linguagem de máquina.
Mas primeiro vejamos nossas últimas instruções:

INSTRUÇÕES MATEMÁTICAS E LÓGICAS: Instruções que efetuam operações com o valor contido no Acumulador (ACC; e neste caso não terá operando) ou com este valor e um segundo operando cujo valor está contido na posição de memória cujo endereço é [endereço] (e nesse caso o operando é um endereço, ou endereço da posição de memória que contém o valor).

Instrução 10; Formato: {[1010] [00000000]}; Descrição: Incrementa (soma um a) o valor contido no ACC. Esta instrução não tem operando. Os oito bits correspondentes ao operando são preenchidos com zeros.

Figura 1: Instrução [1010]

Instrução 11; Formato: {[1011] [00000000]}; Descrição: Decrementa (subtrai um de) o valor contido no ACC. Esta instrução não tem operando. Os oito bits correspondentes ao operando são preenchidos com zeros.

Figura 2: Instrução [1011]

Instrução 12; Formato: {[1100] [endereço]}; Descrição: Soma os valores contidos no ACC e na posição de memória cujo endereço é o número de oito bits [endereço] e escreve o resultado no ACC; Qualquer outro valor eventualmente contido no ACC será sobrescrito. O conteúdo da posição de memória cujo endereço é [endereço] permanece inalterado;

Figura 3: Instrução [1100]

Instrução 13; Formato: {[1101] [endereço]}; Descrição: Subtrai o valor contido na posição de memória cujo endereço é o número de oito bits [endereço] do valor contido no ACC e escreve o resultado no ACC; Qualquer outro valor eventualmente contido no ACC será sobrescrito. O conteúdo da posição de memória cujo endereço é [endereço] permanece inalterado;

Figura 4: Instrução [1101]

Instrução 14; Formato: {[1110] [endereço]}; Descrição: Multiplica o valor contido no ACC pelo valor contido na posição de memória cujo endereço é o número de oito bits [endereço] e escreve o resultado no ACC; Qualquer outro valor eventualmente contido no ACC será sobrescrito. O conteúdo da posição de memória cujo endereço é [endereço] permanece inalterado;

Figura 5: Instrução [1110]

Instrução 15; Formato: {[1111] [endereço]}; Descrição: Divide o valor contido no ACC pelo valor contido na posição de memória cujo endereço é o número de oito bits [endereço] e escreve o resultado no ACC; Qualquer outro valor eventualmente contido no ACC será sobrescrito. O conteúdo da posição de memória cujo endereço é [endereço] permanece inalterado;

Figura 6: Instrução [1111]

Um programa em linguagem de máquina
Pronto, terminamos. Esse é o nosso conjunto de instruções. Achou pouco? Bem, com quatro bits não se pode mesmo fazer muito mais que isso. Deu por falta de instruções essenciais, como as que implementam o conjunto de operações lógicas básicas “maior que”, “igual a” e “menor que”? Ora, meu amigo, você é um programador (e se não for e ainda assim está lendo este cartapácio, garanto que um dia será, e dos bons). E programadores não se apertam diante dessas pequenas vicissitudes. Quer comparar dois números? Pois subtraia um do outro e verifique se o resultado no ACC é positivo, nulo ou negativo. Isso combinado com as instruções de salto resolve qualquer problema de comparação. E assim, apenas com essas poucas instruções, um bom programador pode fazer milagres.
Não acredita? Pois vejamos como, com nosso pequeno e limitadíssimo conjunto de instruções, poderemos fazer algo de útil. Preste atenção na Figura 7.

Figura 7: Programa em linguagem de máquina

Na esquerda temos nossa velha conhecida CPU. Não há muita novidade aqui, exceto o fato do PI estar ocupado com um valor. Ora, quem leu as colunas anteriores está farto de saber que um valor no PI só pode significar uma coisa: o endereço da posição de memória que contém a próxima instrução a ser executada. E o valor contido no PI é (00000000b), zero em binário. Portanto o ponteiro de instruções “aponta” para o endereço (00000000b) da MP, o que significa que assim que nossa UCP for energizada será iniciado o primeiro ciclo de busca e execução, ou seja, o valor contido na posição de memória (00000000b) será transportado para o RI, o conteúdo do PI será incrementado e a instrução transportada para o RI será decodificada e executada. E prosseguirá assim sucessivamente, ciclo após ciclo, até que a UCP seja desligada ou que seja encontrada uma instrução que mande interromper o programa e devolver o controle para o sistema operacional.
Agora dedique alguma atenção ao lado direito da Figura 7. Ele é composto por duas colunas. A da esquerda é formada por vinte e seis endereços de posições da memória principal em binário, de zero a vinte e cinco, ordenados crescentemente de cima para baixo (já vimos o porquê desta aparente inversão de ordem na coluna anterior). E a da direita?
Bem, a da direita é formada pelos conteúdos dessas vinte e seis posições de memória. Que, na medida que forem se sucedendo os ciclos de busca e execução, terão seus conteúdos lidos, eventualmente alterados (se forem dados) ou executados (se forem instruções; afinal estamos trabalhando com uma máquina de Von Newmann, que armazena tanto dados quanto instruções no mesmo espaço de memória, lembra-se?).
Então, o que representa essa coluna de números expressos em binário?
Isso, meu amigo, muito bem, acertou: um programa em linguagem de máquina.
Um programinha de nada, apenas 26 posições de memória ocupadas com dados e instruções. No entanto, é um programa capaz de desempenhar uma tarefa útil. Limitada, é verdade, pelos valores que podem ser armazenados em posições de MP de apenas doze bits (números absolutos – sem sinal – de zero a 4.095, números relativos de -2.047 a +2.047, lembre-se da coluna anterior). Mas mesmo assim o programa pode ser útil (inclusive para mostrar como era dura a vida de um programador antes da Almirante Hopper desenvolver a linguagem Assembly).
Agora que você já sabe com que se parece um programa em linguagem de máquina e conhece cada uma das instruções do nosso conjunto de instruções, pergunto: você é capaz de deduzir qual o objetivo do programa da Figura 7? O que esse programa faz?
A resposta cabe em uma frase.
Quem se habilita?

B. Piropo