Pervinca: processador de instrução única

Quero falar sobre o processador que desenvolvi em 2016. É implementado em C como uma máquina virtual. Meu amigo Björn escreveu assembler para ele em F #.

A pervinca é um processador OISC (um computador com conjunto de instruções), ao contrário do RISC e do CISC. Não possui canalização. De fato, a produtividade não é o objetivo principal do projeto, ele foi criado mais por prazer e por fins educacionais.

Minha amiga Alena surgiu com o nome Pervinca, ou seja, pervinca (essa flor incrivelmente tenaz é considerada um símbolo de vitalidade - aprox. Per.)

Existem muitos tipos de instruções para o OISC. Mas na Periwinkle, essa é uma declaração de movimento. Basta mover o literal para um registro ou valor de um registro para outro. Operações lógicas e aritméticas, ramificação, etc. realizada usando registradores.

O comprimento da instrução Periwinkle é estavelmente de 40 bits. Barramento de dados de 32 bits.



A pervinca possui um total de 64 registros.



Aqui está uma descrição de alguns:

Contador de software (PC)

  • Contador de até 32 bits
  • O tamanho da memória do programa é de 255 palavras de 40 bits (depende da implementação)
  • Mover -1 para o registro do PC faz com que o contador pare explicitamente

Pilha de uso geral (STK)
  • Empilhe para qualquer coisa (16 níveis de profundidade)
  • Nenhum sinal de estouro e pilha incompleta
  • Ler uma pilha vazia retorna 0
  • Mover valores aqui é uma operação push
  • Movendo-se daqui - operação pop

Gerador de número aleatório (RNG)

  • Quando chamado, gera um número aleatório de 32 bits
  • Mover valores aqui parece inútil

Ignorar se zero (SIZ)
  • Ignora a seguinte instrução se você mover zero para ela

Ignorar se diferente de zero (SINZ)
  • Ignora a instrução a seguir se você mover um valor diferente de zero para ele

Referência (REF)

  • Usado para indicar um endereço com base em um valor movido
  • Valores grandes são truncados para números de 6 bits.

Desreferência (DEF)
  • Desreferenciação após REF

Registros reservados (RSV)
  • Mover-se aqui não importa. O registro ainda conterá zero.
  • Pode ser usado para qualquer tarefa ao transferir uma máquina virtual para um microcontrolador ou outra coisa
  • Para registros futuros / adicionais
  • Pode ser usado para remover um item da pilha de uso geral e dos registros operacionais movendo o item aqui (não recomendado)
  • Ao ler, retorna 0

Registradores de uso geral (GPR0-GPR31)

  • Pode conter números de 32 bits

Registro zero

  • Pode ser usado para remover um item da pilha de uso geral e dos registros operacionais movendo este item aqui
  • Retorna 0 na leitura

Registro de status:

  • 0000 0000 0000 0000 0000 0000 000P ZVNC
  • Contém cinco sinalizadores (C, N, V, Z, P)
  • Transportar
  • Negativo
  • Estouro
  • Zero
  • O registro PLUS afeta os sinalizadores C, N, V, Z, P
  • Os registradores AND, OR, XOR afetam os sinalizadores N, Z, P
  • A última operação em execução afetará o registro de status
  • Mover o significado para cá parece inútil.

Mas como os registros PLUS, AND, OR, XOR funcionam? Esses quatro registradores têm uma pilha peculiar, que na verdade é uma pilha computacional. Quando existem dois números na pilha de cálculo, a operação é iniciada.



Aqui está um exemplo para o registro PLUS. O esquema funciona da mesma forma para os outros três registros.

Mas como executar operações aritméticas com apenas quatro operadores? Como eu disse, o objetivo deste projeto é entretenimento e educação. Portanto, você pode sintetizar independentemente as ações ausentes.

A subtração é feita adicionando um código adicional que representa números negativos. Um código adicional é formado pela inversão de bits, ou seja, pressionando o número 0xFFFFFFFF (2³²-1) através de XOR. E adicionando um através do registro PLUS. No entanto, o assembler suporta números negativos, portanto, não é necessário fazer tudo isso.

A multiplicação é apenas várias adições.

Divisão é o número de vezes que um único número é colocado em um número. Isso pode ser calculado através do contador de subtrações seqüenciais.

A troca de bits é feita multiplicando por 2 ou dividindo por 2.

Pense em como sintetizar outras operações você mesmo.

Se estiver interessado, aqui está o repositório github de alguns programas assembler que escrevi para o Periwinkle. A instrução de movimento funciona da esquerda para a direita:

#50 gpr0 //  50(base-10)  gpr0 gpr0 gpr1 //  gpr0  gpr1 

Além disso, tentarei fazer upload do arquivo executável da máquina virtual Periwinkle VM. Para qual plataforma fazer a máquina virtual? (Windows (x86? X86-64?), Linux (x86? X86-64? ARM?, ARM64 ?, Etc.?), Etc.?) Como o assembler é escrito em F #, provavelmente pode funcionar em qualquer lugar , você só precisa da estrutura .NET , pode dar uma olhada no Mono .

Se você conhece a arquitetura do PIC16 , poderá observar algumas semelhanças com a Pervinca (STATUS, SIZ, SINZ, REF, DEF). De fato, isso me inspirou a trabalhar como a primeira arquitetura com a qual comecei a programar em linguagem assembly.

Source: https://habr.com/ru/post/pt480024/


All Articles