OISC do inglês "One instruction set computer", é uma máquina que possui apenas uma instrução, o que elimina a possibilidade de ter uma linguagem de máquina, ou seja,opcode. OISC pode ser comparada tanto um computador universal quanto uma máquina tradicional que trabalha com mais de uma instrução, então sendo assim pode realizar as mesmas tarefas do que uma máquina padrão. Existe uma classe de computadores universais com uma instrução baseada na manipulação de bits. O modelo de memória OISC possui a mesma estrutura de memória usada em computadores tradicionais. Máquinas e aparelhos de manipulação de bits são equivalentes aos computadores tradicionais.Intended for researchers, computer system engineers, computational theorists and students, this book provides an in-depth examination of various OISCs, including SBN and MOVE. It attributes SBN to W. L. van der Poel (1956).This research paper focusses entirely on a SUBLEQ OISC and its associated assembly language, using the name SUBLEQ for "both the instruction and any language based upon it".

O objetivo da implementação de OISC foi inicialmente para ajudar na arquitetura de um computador de ensino e também utilizada como modelo computacional na pesquisa de computação estrutural.

Arquitetura de Máquina Atualmente OISCs são conhecidas por serem basicamente divididas em três grandes categorias:

Transport Triggered Architecture Machines. Bit Manipulating Machines. Arithmetic Based Turing-Complete Machines.

Transport Triggered Architecture Machines (TTA) tem como consequência a computação para transporte de dados. Normalmente alguns registros de memória com espaço de endereçamento em comum, executam uma operação quando a instrução faz referência a eles. Por exemplo, utilizando uma cópia de instruções de memória para memória em uma OISC, isto é feito pelas portas de troca de estado, que executam o cálculo e o ponteiro da instrução desvia para onde será escrito.

Bit Manipulating Machines é a parte mais simples, a cópia é chamada de BitBitJump, copia de um bit da memória e passa a execução incondicional para o endereço especificado por um dos operandos da instrução. Este processo pode ser considerado com computação universal(sendo capaz de executar qualquer algoritmo e de interpretar qualquer outra máquina universal). A cópia condicional de bits pode modificar o código que será posteriormente executado. Uma outra máquina, chamada de computador Toga, inverte o bit e passa a execução condicionalmente, dependendo do resultado da inversão.Ainda uma outra máquina que opera bits, semelhante ao BitBitJump, copia vários bits ao mesmo tempo. Neste caso o problema da universalidade computacional é resolvido, mantendo tabelas de pulos predefinidos na memória.

Arithmetic Based Turing-Complete Machines, esta usa uma operação aritmética e um pulo condicional, diferente das duas categorias anteriores, que são classificadas como computadores universais, esta é universal e também de Turing-Compete, cujo tem o mesmo poder de processamento de uma Máquina de Turing em sua representação abstrata. A instrução opera sobre número inteiros, que também podem ser endereços na memória. Atualmente existem várias OISCs conhecidas nesta categoria, com base em diferentes operações aritméticas como, adição (Addleq), decremento (DJN), incremento (Pleq) e subtração (Subleq). Esta é a mais antiga, mais popular e sem dúvida a mais eficiente.

Tipos de Instruções Opções mais utilizadas para uma única instrução:

Subtrai e desvia se for menor ou igual a zero. Subtrai e desvia se for negativo. Subtrai e inverte, pula se pegar emprestado. Mover(Usado na arquitetura de transporte disparado). Subtrai e desvia se não for zero (SBNZ, a,b,c, destino).

Apenas uma destas instruções é utilizada em uma determinada implementação, sendo assim não há a necessidade de se ter um opcode para identificar qual instrução irá executar. A escolha da instrução não tem nenhuma influência com relação ao projeto da máquina, uma OISC é normalmente chamada após usar uma instrução, por exemplo (na OISC SBN, SUBLEQ, etc...) Cada uma das instruções acima pode ser utilizada para construir uma Máquina de Turing OISC.

Este artigo apresenta apenas instruções baseadas em subtração, as que não são de transporte disparado não fazem parte. No entanto é possível construir uma Máquina de Turing utilizando uma instrução com base em outras operações aritméticas, como a adição. Por exemplo, uma variação conhecida como DLN (Diminuir e pular se não for igual a zero) tem apenas dois operandos e usa decremento como operação de base.

Subtrai e desvia se não for igual a zero A instrução SBNZ a, b, c, d, subtrai o conteúdo de um endereço a partir do conteúdo que está no endereço b e armazena o resultado no endereço c, em seguida de o resultado não for igual a zero, o controle transfere para resolver d e se o resultado for igual a zero a execução prossegue para a próxima instrução que está na sequência.

Subtrai e desvia se for menor ou igual a zero Subleq, subtrai o conteúdo que está no endereço a, do conteúdo que está no endereço b e armazena o resultado no endereço b e em seguida se o resultado não for positivo, o controle transfere para o endereço c, se for positivo a execução prossegue para próxima instrução que está na sequência.

Pseudocódigo:

Subleq a, b, c; Mem[b] = Mem[b] - Mem [a]; If (Mem[b] ≤ 0) goto c;

O desvio condicional, usa apenas dois operandos por instrução, mas para efetuar algumas outras operações lógicas, são necessárias mais instruções.

Instruções Sintetizadas É possível sintetizar muitas instruções de ordem superior usando apenas a instrução subleq.

Desvio Incondicional:

JMP c == subleq Z, Z, c

A adição pode ser realizada, com uma ou mais subtrações, sem o uso do desvio condicional. As seguintes instruções informadas abaixo resultam no conteúdo que está no endereço a que é adicionado ao conteúdo que está no endereço b.

ADD a, b == subleq a, Z == subleq Z, b == subleq Z, Z

A primeira instrução subtrai o conteúdo do endereço a do conteúdo que está no endereço Z (que é zero) e armazena o resultado no endereço Z. A segunda instrução subtrai este resultado de b e armazena em b, este resultado agora é a soma dos conteúdos originais de a e b. A terceira instrução repõe o valor zero em Z.

Uma instrução que faz a cópia pode ser implementada de forma semelhante, as próximas instruções informadas abaixo, resultam no conteúdo do endereço b que será substituído pelo que está no endereço a, novamente assumindo que o conteúdo do endereço Z é zero.

MOV a, b == subleq b, b == subleq a, Z == subleq Z, b == subleq Z, Z

Instrução com condição de desvio se for zero.

BEQ b, c == subleq b, Z, L1 == subleq Z, Z, OUT L1 subleq Z, Z subleq Z, b, c OUT:...

Subleq2, pode ser usado para sintetizar instruções mais complexas, mesmo que precise de mais operações para uma dada tarefa. No máximo dez instruções subleq2 para que se possa inverter todos os bits em um byte.

NOT a == subleq2 tmp; tmp = 0 (tmp = temporary register) subleq2 tmp subleq2 minus_one; acc = -1 subleq2 a; a' = a + 1 subleq2 Z; Z = Z - 1 subleq2 tmp; tmp = a + 1 subleq2 a; a' = 0 subleq2 tmp; load tmp into acc subleq2 a; a' = -a -1 (= ~a) subleq2 Z; set Z back to 0

Emulação O programa a seguir escrito em Pseudocódigo emula a execução de subleq em OISC:

integer memory, program_counter a, b, c, program_counter = 0 while (program counter >= 0): a = memory [program_counter] b = memory [program_counter + 1] c = memory[program_counter + 2] if (a < 0 or b < 0): program_counter = -1 else: memory[b] = memory[b] - memory[a] if (memory[b] > 0): program_counter = program_counter + 3 else: program_counter = c

Este programa, assume que a memória é indexada por números inteiros e positivos. Consequentemente para uma instrução subleq (a, b, c) o programa interpreta a< 0, b< 0, ou executa um desvio para c< 0 como uma condição de parada. Intérpretes similares escritos em uma linguagem baseada em subleq, ou seja, auto-intérpretes, que podem utilizar códigos auto-modificados conforme o permitido pela natureza da instrução.

Compilação Há um compilador chamado Higher Subleq escrito por Oleg Mazonka que compila um programa simplificado em C em um código Subleq.Oleg Mazonka A Simple Multi-Processor Computer Based on Subleq

Subtrai e desvia se for negativo A intrução subneg também chamada de SBN é definida de forma semelhante a subleq:

subneg a, b, c; Mem[b] = Mem[b] - Mem[a]; if (Mem[b] < 0) goto c

O desvio condicional pode ser suprimido ou configurado como o terceiro operando igual ao endereço da próxima instrução. Se o terceiro operando não está escrito, a supressão está implícita.

Intruções Sintetizadas É possível sintetizar vários tipos de instruções de ordem superior, usando apenas a instrução subneg. Para simplificar, uma situação é mostrada abaixo para ilustrar a diferença entre subleq e subneg.

Desvio Incondicional:

JMP c == subneg POS, Z, c ...

c: subneg Z, Z

Onde, Z e POS são posições previamente definidas para conter zero e um número inteiro positivo, respectivamente:

O desvio condicional só é garantido se o Z contém inicialmente o número zero, ou um valor menor e inteiro armazenado em POS. Uma instrução de acompanhamento é necessária para limpar Z depois do desvio, assumindo que o conteúdo de Z deve ser mantido como zero.

Subtrai e inverte, pula se pegar emprestado O acumulador é subtraído da posição de memória, e a próxima instrução é ignorada se a posição de memória for menor do que o acumulador, o resultado é armazenado em ambos, no acumulador e no endereço de memória. O Program Counter é mapeado para endereço de memória 0. O acumulador é mapeado para endereço de memória 1.

Exemplo Para definir o valor de x, y menos z:

Em primeiro lugar, move Z para endereço de destino x RSSB temp # Três instruções necessárias para limpar o acc, temporário RSSB temp RSSB temp RSSB x # Duas instruções limpam acc, x, desde que acc já esteja limpo RSSB x RSSB y # Coloca y no acc: não emprestar RSSB temp # Guarda - y em acc, temp: sempre pedir emprestado e pular RSSB temp # Pulados RSSB x # Guarda y em x, acc Em segundo lugar executa a operação RSSB temp # Três instruções necessárias para limpar o acc, temporário RSSB temp RSSB temp RSSB z # Carrega z RSSB x # x = y - z

Transport Triggered Architecture Machines Transport Triggered Architecture Machines, utiliza apenas mover instrução, foi originalmente chamado de "movimento de máquina". Esta instrução move o conteúdo de um endereço de memória para outro endereço de memória. "Reduced instruction set computer architectures have attracted considerable interest since 1980. The ultimate RISC architecture presented here is an extreme yet simple illustration of such an architecture. It has only one instruction, move memory to memory, yet it is useful."

move a to b; Mem[b]:= Mem [a]

As vezes escrito como:

a → b; Mem[b]:= Mem[a]

A aritmética é realizada através de uma Unidade lógica e aritmética que possui memória mapeada e pulos são realizados com "Program Counter"

Processador capaz de executar instruções subleq -Bibliotecas para programas escritos em Assembly, SUBLEQ e um programa para demonstração destes. -Intérprete subleq escrito em C. -Intérprete Jsubleq escrito em javascript.

CPU https://raw.githubusercontent.com/davidar/subleq/master/logisim/cpu.png

A versão atual do Logisim http://cburch.com/logisim/ é necessária para simular a CPU. Instruções de simulação são apresentadas abaixo:

Há três "bus" principais na CPU:

A bus: contém o endereço da localização da memória atual. B bus: contém a saída da ALU. D bus: contém os dados lidos da memória.

A CPU tem seis sinais de controle:

MAR: registro de endereços da memória devem ser atualizados com o valor do barramento D no fim deste clico. PC: Program counter deve ser atualizado no final deste ciclo.