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.
, zero, 2
addi t0
; 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.
, ra, 3
sb t0
; Imediatos hexadecimais, octais e binários também são suportados.
, zero, 0xff
addi t1, zero, 0b010110
addi t1, zero, 0o644
addi t1, zero, 0755 ; Um zero à esquerda também define um octal.
addi t1
; # 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:
, World!%0a
#Hello
; Algumas diretivas são suportadas. As diretivas "bitsxx" criam números literais
; no código, com o tamanho em bits especificado:
0xca 0xfe 0xba 0xbe 0xde 0xad 0xbe 0xef
.bits8 0xcafe 0xbabe 0xdead 0xbeef
.bits16 0xcafebabe 0xdeadbeef
.bits32 0xcafebabedeadbeef
.bits64 ; A diretiva "space" adiciona alguns bytes de espaço vazio no código:
16
.space ; A diretiva "include" faz um "copia-cola" de outro arquivo no código:
include other-asm.asm .
As 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):
, zero, 3
addi a7, zero, msg
addi a0, zero, 14
addi a1
ecall
ebreak
msg:
, World!%0a #Hello
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.
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.