EGG Docs

Uso

Rode o emulador com um arquivo de Assembly para montá-lo e iniciar uma máquina rodando o programa. O backend utilizado por padrão é uma máquina de RISC-V 32 bits. Use a opção -a ou -arch para mudar a arquitetura. A opção -h mostra todas as opções de linha de comando e a opção -l mostra todas as arquiteturas suportadas.

Assembly

A sintaxe de Assembly varia com a arquitetura, porém, como o projeto provém uma biblioteca para tal, os backends podem usar uma sintaxe bem semelhante (RISC-V e MIPS usam). Exemplo:

; Ponto e vírgula define comentários até o fim da linha.

; Labels são definidos com dois pontos.
label:
    ; Os argumentos começam sempre pelo destino.
    addi t0, zero, 2

    ; Também é possível colocar instruções logo após os labels.
label2: add t0, t0, t0

    ; Não há parênteses como no RARS e stores usam imediatos normais.
    sb t0, ra, 3

    ; Imediatos hexadecimais, octais e binários também são suportados.
    addi t1, zero, 0xff
    addi t1, zero, 0b010110
    addi t1, zero, 0o644
    addi t1, zero, 0755 ; Um zero à esquerda também define um octal.

; # define um literal até o final da linha.
; Literais são inseridos no binário (assim como 'db' em outros assemblers).
; Se uma % é seguida de dois digitos hexadecimais, o valor hexadecimal é
; inserido. Use %% para inserir um % (ou %25).
msg:
#Hello, World!%0a

; Algumas diretivas são suportadas. As diretivas "bitsxx" criam números literais 
; no código, com o tamanho em bits especificado:
.bits8 0xca 0xfe 0xba 0xbe 0xde 0xad 0xbe 0xef
.bits16 0xcafe 0xbabe 0xdead 0xbeef
.bits32 0xcafebabe 0xdeadbeef
.bits64 0xcafebabedeadbeef
; A diretiva "space" adiciona alguns bytes de espaço vazio no código:
.space 16
; A diretiva "include" faz um "copia-cola" de outro arquivo no código:
.include other-asm.asm

Chamadas

As chamadas (environment calls) respondidas pelo emulator são as seguintes. Consulte a documentação da arquitetura para realizá-las:

Debugger

A interface do debugger é semelhante à do gdb porém bem enxuta. Use a opção -d para entrar no debugger assim que iniciar o emulador. Não há comando run, como no gdb, pois não há necessidade de iniciar um processo do sistema. Os comandos next e continue podem ser utilizados para iniciar o programa normalmente. Use o comando help para ver todos os comandos disponíveis.

RISC-V IM 32

Sintaxe de Assembly

A implementação de RISC-V para o EGG usa a sintaxe de Assembly padrão. Ela implementa os registradores e instruções do conjunto base e da extensão de multiplicação descritos nesse documento.

Para consulta, também há uma cheatsheet mais abaixo.

Chamadas (environment call)

Para realizar uma chamada (environment call), o número dela é colocado no registrador a7 e os argumentos nos registradores a0 e a1.

Uma instrução ebreak realiza a chamada BREAK.

Exemplo

Código de exemplo (escreve “Hello, World!”, quebra a linha e sai):

    addi a7, zero, 3
    addi a0, zero, msg
    addi a1, zero, 14
    ecall
    ebreak

msg:
#Hello, World!%0a

Memória

O programa montado é carregado no endereço 0 e o pc é inicializado em 0. O ponteiro da stack não é inicializado. Caso o programa faça uso da stack, ela deve ser inicializada no programa.

MIPS32

Assembly

A implementação de MIPS32 para o EGG usa a sintaxe de Assembly padrão.

Chamadas (environment call)

Para realizar uma chamada (environment call), o número dela é colocado no registrador v0 e os argumentos nos registradores a0 e a1.

Uma instrução break realiza a chamada BREAK.

Memória

O programa montado é carregado no endereço 0 e o pc é inicializado em 0.

Sagui

Sagui é uma arquitetura fantasia de 8 bits RISC, criada pelo Dr. Marco Zanata, professor da Universidade Federal do Paraná. A implementação no EGG possui uma extensão: a instrução movr r0, r0 é interpretada como uma chamada BREAK.

Ela usa a sintaxe padrão de Assembly.

Instruções do Sagui

REDUX-V

REDUX-V is a 8-bit version of RISC-V.

It uses the standard Assembly syntax of EGG.

redux-v