Compilador de C para o processador do ICMC.
Executáveis pré-compilados estão disponíveis na página de lançamentos.
Instale o Rust e execute:
git clone https://github.com/Thitav/icmc-cc
cd icmc-cc
cargo buildO compilador segue todas as regras comuns do C99, exceto nos seguintes casos:
- Variáveis globais não podem ser inicializadas.
- Apenas os tipos
void,chareintsão suportados, sendo que os tiposchareintsão iguais (inteiros de 16 bits).
O compilador também suporta os operadores especiais inchar e outchar:
_inchar(): retorna o código da tecla pressionada no instante em que o operador foi chamado, retornando 255 caso nenhuma tecla tenha sido pressionada._outchar(<char>, <pos>): imprime o caracterecharna posição da tela especificada porpos.
O compilador suporta as seguintes diretivas:
#include: inclui outros arquivos para a compilação.#define: define macros.__LINE__: macro especial que expande para o número da linha no arquivo (expandindo para um número inteiro)./* */: comenta um bloco.//: comenta uma linha.
O compilador oferece uma coleção de bibliotecas padrão otimizadas:
io.h: funções de entrada e saída.string.h: funções de manipulação de arrays.
Confira os cabeçalhos das bibliotecas para uma documentação aprofundada.
- Em casos onde performance é necessária, prefira o uso de variáveis globais em vez de variáveis locais e argumentos.
- No momento, há um limite de 6 argumentos por função.
O compilador opera com as seguintes convenções:
- O registrador
r0é reservado e armazena o endereço da base da stack da função atual. - O registrador
r7é reservado para operações com valores imediatos, operações com a base da stack e retorno de funções. - Funções recebem argumentos através de registradores, indo do
r1atér6. - Funções usam
r7para o valor de retorno.