Fiz um curso sobre compiladores em meus estudos de graduação, nos quais escrevemos um compilador que compila programas de origem em uma linguagem semelhante a Java de brinquedo a uma linguagem de montagem de brinquedos (para a qual tínhamos um intérprete). No projeto, fizemos algumas suposições sobre a máquina de destino intimamente relacionada aos executáveis nativos "reais", incluindo:
- uma pilha de tempo de execução, rastreada por um registro apontador de pilha dedicado ("SP")
- um heap para alocação dinâmica de objetos, rastreado por um registro dedicado de heap pointer ("HP")
- um registro de contador de programa dedicado ("PC")
- a máquina de destino possui 16 registros
- operações em dados (em oposição a, por exemplo, saltos) são operações de registro a registro
Quando chegamos à unidade usando a alocação de registros como uma otimização, fiquei me perguntando: qual é o número mínimo teórico de registros para uma máquina dessas? Você pode ver pelas nossas suposições que usamos cinco registradores (SP, HP, PC, mais dois para armazenamento como operações binárias) em nosso compilador. Embora otimizações como a alocação de registros certamente possam fazer uso de mais registros, existe uma maneira de sobreviver com menos, mantendo estruturas como a pilha e a pilha? Suponho que, com o endereçamento de registro (operações de registro para registro), precisamos de pelo menos dois registros, mas precisamos de mais de dois?
fonte
Respostas:
Se você permitir o acesso direto à memória por endereço de memória, não precisará de "registros", pois poderá usar os locais de memória. Por exemplo, a memória no local 0 pode ser o contador do programa, no local 1 temos o ponteiro da pilha, etc. Mas isso é trapaça.
Portanto, para nos impedir de trapacear, suponhamos que não haja acesso direto à memória, pois poderíamos usar locais fixos de memória como registradores. Em seguida, podemos obter dois registros, um contador de programa e um ponteiro de pilha, conforme explicado no artigo da Wikipedia sobre máquinas de pilha . A pilha é acessível apenas através do ponteiro da pilha e o programa é acessível apenas através do contador de programas.
Outra possibilidade é usar máquinas de balcão. Uma máquina de dois contadores é Turing completa, ou seja, pode calcular o que a máquina Turing puder. Isso novamente é bem explicado no artigo da Wikipedia sobre máquinas de balcão .
fonte
A arquitetura PIC, introduzida pela General Instruments na década de 1970 e ainda hoje em uso, possuía os seguintes registros:
Uma instrução típica lê um registro, executa uma computação usando o valor lido e W e, em seguida, armazena o resultado da computação em W ou no registro que foi lido. Um dos cálculos disponíveis gera "o valor lido, ignorando W"; outro é "pegue W, ignorando o valor lido". Os padrões de bits que corresponderiam a "leia XX, depois use W, ignorando o valor lido e armazene o resultado em W" são usados para NOP, bem como para uma variedade de instruções especiais.
Para permitir cálculos de endereços, a unidade de execução do processador observará as instruções que codificam um endereço 00 e substitui o conteúdo do Registro de Seleção de Arquivos pelo endereço.
Embora ter que alimentar todos os valores através do registro W possa ser um gargalo, a arquitetura PIC tem um conjunto de trabalho maior que outras arquiteturas, usando a mesma palavra de instrução de comprimento. No PIC16C54 (ainda hoje fabricado e muito semelhante aos PICs da década de 1970), as instruções têm 12 bits. Em muitas outras partes 16Cxx ou 16Fxx, as instruções têm 14 bits e podem acessar diretamente um espaço de endereço de 128 bytes. Se o conjunto de trabalho de um programa se encaixa bem com o conjunto de trabalho do conjunto de instruções, uma declaração como "total + = valor", em que "total" e "valor" são do tipo
unsigned char
, será compilada para:Em algo como o ARM, mesmo que alguém tenha um registro pré-carregado com o endereço base de suas variáveis, o código seria mais como:
Em muitos casos, um compilador poderia evitar fazer cargas e armazenamentos a cada operação, mas em algo como o PIC, os benefícios de um conjunto de trabalho maior às vezes superam as limitações de ter que passar por W o tempo todo.
fonte