Principal > Documentos > Manual dos simuladores LEG e ARM

Manual dos simuladores LEG e ARM

Esta página apresenta as funcionalidades dos simuladores LEG (legsim) e ARM (armsim), com uma descrição sucinta dos comandos disponíveis ao usuário.

O simulador deve ser iniciado em uma janela de tipo Terminal (ou Console), com a seguinte linha de comando: $ xxxsim [-c] [-d arq_disp] [-l arq_exec] [-lc arq_com] [-nw] onde xxxsim pode ser armsim ou legsim, respectivamente os simuladores para os processadores ARM e LEG. Os argumentos opcionais são:

  • -c
    inicia também um painel de console, para entrada e saída de dados, descrito a seguir.
  • -d arq_disp
    usa o arquivo arq_disp para instalar os dispositivos de E/S especificados.
  • -l arq_exec
    carrega na memória o arquivo arq_exec.
  • -lc arq_com
    lê um arquivo de comandos arq_com e executa os comandos especificados.
  • -nw
    não utiliza recursos gráficos do Terminal (para terminais sem esses recursos; apenas a forma de visualização de comandos para execução passo-a-passo é alterada).

Memória

Os simuladores legsim e armsim têm 512 KiB de memória disponível, do endereço 0 ao endereço 0x7ffff. No simulador armsim, qualquer endereço maior ou igual a 0x80000 pode ser alocado para uma porta de E/S.

Convenções

Durante a execução, qualquer comando pode ser interrompido pressionando -C (tecla Control e tecla C do teclado pressionadas ao mesmo tempo). O símbolo `.' (ponto) é usado para indicar encerramento do comando em comandos de entrada de dados. Todos os números são interpretados como hexadecimais; por exemplo o valor 100 indica 0x100. Além disso, na entrada de dados para o simulador, os números devem iniciar-se com um dígito entre 0 e 9; por exemplo deve-se usar 0ff, e não simplesmente ff, para representar o valor 0xff.

Ajuda

Digite `?' na linha de comando do simulador para listar os comandos disponíveis. Uma saída como a abaixo é mostrada: armsim - ARM simulator(v1.0) R. Anido/IC-Unicamp armsim> ? CARACTERES ESPECIAIS . encerra entrada de dados (ctr-c) interrompe execução de qualquer comando COMANDOS DISPONÍVEIS: b breakpoints | l carrega arquivo c constantes e símbolos | q termina execução d mostra memória | r inspeciona registradores f preenche memória | s passo a passo g go | t trace i inspeciona memória | u unassemble j jornal | x mostra estado k mostra ciclos | Para saber mais sobre cada comando, digite a letra correspondente ao comando seguida de `?'.

Aritmética simples

Além dos comandos descritos a seguir, o simulador também permite realizar somas e subtrações entre dois números hexadecimais, digitando a operação desejada diretamente na linha de comando do simulador.

Exemplos:

  • 1000 + 1fa
    mostra o resultado da adição 0x1000 + 0x1fa.
  • 1000 - 1fa
    mostra o resultado da subtração 0x1000 - 0x1fa.

Comando b (breakpoint)

O comando b permite definir pontos de parada (breakpoints) para endereços específicos da memória.

  • b
    mostra breakpoints correntes.
  • br ender_ini ender_fim [contador]
    associa um breakpoint para cada contador acessos para leitura no intervalo de endereços ender_ini a ender_fim. contador é um número hexadecimal; se não especificado o valor é 1.
  • bw ender_ini ender_fim [contador]
    associa um breakpoint para cada contador acessos para escrita no intervalo de endereços ender_ini a ender_fim. contador é um número hexadecimal; se não especificado o valor é 1.
  • bx ender_ini ender_fim [contador]
    associa um breakpoint para cada contador acessos para execução no intervalo de endereços ender_ini a ender_fim. contador é um número hexadecimal; se não especificado o valor é 1.
  • br ~ender
    bw ~ender
    bx ~ender
    remove breakpoint do endereço ender.
  • b ~
    remove todos os breakpoints.

Exemplos:

  • br
    mostra breakpoints de acesso de leitura correntes.
  • bx 2af2
    define breakpoint de execução no endereço 0x2af2, para cada execução.
  • bw tabela tabela+4 10
    define breakpoint no intervalo de endereços tabela até tabela+4, para cada 10 acessos de escrita.
  • bw ~1000
    remove breakpoint de acesso de escrita no endereço 0x1000.
  • br ~
    remove todos os breakpoints.

Comando c (examina constantes)

O comando c permite examinar as constantes importadas do arquivo executável (em geral, rótulos do programa, repassados pelo montador), ou definir e modificar novas constantes.

  • c
    mostra todas as constantes e símbolos conhecidos.
  • c nome
    mostra o endereço associado à constante ou símbolo nome.
  • c nome ender
    atribui o endereço ender à constante ou símbolo nome.

Exemplos:

  • c inicio
    mostra o endereço do rótulo inicio.
  • c volta 2020
    associa o símbolo volta ao valor 0x2020.

Comando d (display memory)

O comando d permite examinar o conteúdo da memória.

  • d ender_ini [contador]
    mostra o conteúdo de contador posições de memória a partir de ender_ini; contador é um número hexadecimal, cujo default é 0x80 (128 decimal).

Exemplos:

  • d 2100 300
    mostra a memória a partir do endereço 0x2100 até o endereço 0x2400 (0x2100+0x300).
  • d tabela
    mostra 128 bytes a partir do endereço tabela, onde tabela é uma constante conhecida.

Comando f (fill memory)

O comando f é útil para preencher extensas regiões de memória com um dado valor (por exemplo, zerar uma região de memória).

  • f ender_ini ender_fim valor_byte
    preenche a memória de ender_ini até ender_fim com bytes de valor valor_byte.
  • fw ender_ini ender_fim valor_palavra
    preenche a memória de ender_ini até ender_fim com palavras de valor valor_palavra.

Exemplos:

  • fw 2200 2400 0aa55
    preenche a memória do endereço 0x2200 até 0x2400 com o valor 0xaa55.
  • f tabela tabela+4 0
    zera bytes do endereço tabela até o endereço tabela+4, onde tabela é uma constante conhecida.

Comando g (go)

O comando g inicia a simulação a partir de um endereço dado.

  • g [ender_ini [ender_fim]]
    executa de ender_ini até ender_fim ou até que alguma outra condição de parada ocorra. Se ender_fim não está presente, executa a partir de ender_ini até alguma condição de parada. Se ender_ini não está presente, executa a partir do endereço de execução corrente até alguma condição de parada. O endereço de execução corrente é o valor do registrador contador de programa, ou seja, ip no caso do LEG ou pc no caso do ARM. Condições de parada possíveis são breakpoints, violações de memória ou execução de instrução inválida.

Exemplos:

  • g 4000 4100
    executa a partir do endereço 0x4000 até o endereço 0x4100, ou até alguma condição de parada.
  • g inicio
    executa a partir do endereço definido pelo símbolo inicio até alguma condição de parada.
  • g
    executa a partir do endereço de execução corrente até alguma condição de parada.

Comando i (inspect memory)

O comando i permite alterar e verificar o conteúdo da memória.
  • i ender_ini

    Inspeciona e permite alteração do conteúdo de bytes na memória sequencialmente a partir do endereço ender_ini.

  • iw ender_ini
    Inspeciona e permite alteração do conteúdo de palavras na memória sequencialmente a partir do endereço ender_ini.

Para terminar a inspeção, digite o caractere ’.’ (ponto). Exemplos:

  • i 4000
    inspeciona bytes a partir do endereço 0x4000
  • iw inicio
    inspeciona palavras a partir do endereço definido pelo símbolo inicio.

Comando k (mostra ciclos)

O comando k permite examinar ou alterar o número de ciclos (instruções) executados.

  • k
    mostra o número de ciclos correntes.
  • k valor
    atribui valor ao número de ciclos (pode ser usado para zerar o número de ciclos antes de uma execução).

Exemplos:

  • k
    mostra o número de ciclos executados.
  • k 0
    zera o número de ciclos executados.

Comando j (journal)

O comando j permite armazenar os comandos digitados em um arquivo texto (jornal), que pode ser posteriormente utilizado para re-executar os comandos automaticamente.

  • j nome_arquivo
    Inicia o jornal, armazenando os comandos no arquivo de nome nome_arquivo. A partir desse ponto, todos as teclas digitadas pelo usuário são armazenadas, possibilitando a re-execução automática dos comandos através do comando lc.
  • j ~
    Termina o jornal, fechando o arquivo corrente.

Exemplo:

  • j teste1.sh
    inicia o jornal, armazenando as teclas digitadas no arquivo teste1.sh.

Comando l (load program)

O comando l carrega um arquivo executável preparado pelo montador na memória do simulador.

  • l nome_arquivo
    Carrega arquivo executável nome_arquivo na memória do simulador.

Exemplo:

  • l roteador.out
    carrega arquivo roteador.out na memória.

Comando lc (load commands file)

O comando lc carrega um arquivo de comandos e executa cada comando do arquivo. O arquivo de comandos pode ser gerado manualmente ou através do comando j.

  • lc nome_arquivo_comandos
    Carrega e executa o arquivo de comandos de nome
    nome_arquivo_comandos.

Exemplo:

  • lc teste1.sh
    carrega e executa o arquivo de comandos teste1.sh.

Comando q (quit)

O comando q termina a sessão de simulação.

  • q
    Termina a simulação.

Comando r (inspeciona registradores)

O comando r permite verificar e alterar o conteúdo de registradores.

  • r
    Mostra os valores de todos os registradores e flags, sem permitir alterações.
  • r reg_nome
    Mostra o valor corrente e permite alteração do registrador de nome reg_nome. Os nomes válidos são r1 a r15, sp e fp, além de ip (para o legsim) ou pc (para o armsim).

Exemplos:

  • r
    Mostra o valor corrente de todos os registradores.
  • r r5
    Mostra o valor corrente e permite alteração do registrador r5.

Comando s (single step)

O comando s permite a execução passo-a-passo (uma instrução por vez).

  • s [ender_ini]
    Executa a instrução do programa presente no endereço ender_ini. Se ender_ini não é dado, executa a instrução presente no endereço dado pelo valor corrente do registrador contador de programa. Se a instrução é chamada de procedimento, o procedimento é executado inteiramente dentro desse passo.
  • si [ender_ini]
    Executa uma instrução do programa a partir do endereço ender_ini. Se ender_ini não é dado, executa a instrução presente no endereço dado pelo valor corrente do registrador contador de programa. Se a instrução é chamada de procedimento, a próxima instrução a ser executada é a primeira instrução do procedimento chamado (step into procedure).
  • so [ender_ini]
    Executa a partir do endereço ender_ini até retornar do procedimento corrente, ou seja, até executar uma instrução de retorno de procedimento (step out procedure). Se ender_ini não é dado, executa a partir da instrução presente no endereço dado pelo valor corrente do registrador contador de programa.

Imediatamente após um comando s, si ou so, pode-se simplesmente pressionar a tecla ENTER, e o comando anterior (s, si ou so) será repetido.

Exemplos:

  • s 1000
    Executa uma instrução, no endereço 0x1000 e retorna o controle ao usuário.
  • so
    Executa até retornar do procedimento corrente.

Comando u (unassemble)

O comando u permite visualizar um trecho de memória como uma sequência de comandos em linguagem de montagem. Em outras palavras, o comando desmonta uma sequência de instruções, onde desmontar significa executar o processo inverso do montador, ou seja, transformar o código binário em comandos da linguagem de montagem.

  • u ender_ini [num]
    desmonta num instruções a partir do endereço ender_ini. Se num não é dado, desmonta 16 instruções.

Exemplos:

  • u 500 20
    desmonta 32 instruções a partir do endereço 0x500.
  • u inicio
    desmonta 16 instruções a partir do endereço definido pelo símbolo inicio.

Acesso aos simuladores

Os simuladores legsim e armsim podem ser encontrados na página Ferramentas.