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.
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.asmAs chamadas (environment calls) respondidas pelo emulator são as seguintes. Consulte a documentação da arquitetura para realizá-las:
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.
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.
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.
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!%0aO 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.
A implementação de MIPS32 para o EGG usa a sintaxe de Assembly padrão.
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.
O programa montado é carregado no endereço 0 e o
pc é inicializado em 0.
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.
REDUX-V is a 8-bit version of RISC-V.
It uses the standard Assembly syntax of EGG.