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.