Apêndices
A
Montador para LEG
Função
FT
O montador lasm é um montador simples de dois passos para o processador
didático LEG, que gera um arquivo executável, ou seja, não há necessidade
de ligador. Um símbolo é uma sequência de letras, dígitos ou o caractere
‘_’, que se inicia com uma letra. Comentários se iniciam com o caractere
‘@’ e se estendem ao final da linha corrente.
O montador aceita as diretivas descritas na Seção 3.1.1:
Diretiva
nome
RA
Definição de constante
Reserva de espaço
Reserva e inicialização de bytes
Reserva e inicialização de palavras
.equ
.skip
.byte
.word
expressão_inteira
expressão_inteira
lista_de_valores
lista_de_valores
onde nome é um símbolo definido pelo usuário, expressão_inteira é uma
expressão cujo resultado deve ser um número inteiro e lista_de_valores é
uma lista, separada por vírgulas, de expressões inteiras, caracteres ou cadeia
de caracteres (caracteres e cadeias de caracteres devem ser colocados entre
aspas simples).
O montador lasm deve ser utilizado usando seguinte a linha de comando
em uma janela de tipo Terminal (ou Console):
D
$ lasm [-o arq_exec] [-p arq_form] [-l arq_list] arq_fonte
onde arq_fonte é o arquivo com o texto do programa. Os argumentos
opcionais são:
• -o arq_exec
nomeia o arquivo executável arq_exec. Se não fornecido, o arquivo
executável é nomeado a.out.
• -p arq_form
formata o arquivo fonte e coloca o resultado no arquivo de nome
arq_form.
297
APÊNDICES
298
D
RA
FT
• -l arq_list
gera um arquivo de listagem, contendo o código gerado em hexadecimal, juntamente com o arquivo fonte, e coloca o resultado no
arquivo de nome arq_list.
B. SIMULADORES PARA LEG E ARM
B
299
Simuladores para LEG e Arm
Este apêndice apresenta brevemente 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:
[-l arq_exec] [-lc arq_com] [-nw]
FT
$ xxxsim [-c] [-d arq_disp]
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.
RA
• -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.
D
• -lc arq_com
lê um arquivo de comandos arq_com e executa os comandos especificados.
B.1
Convenções
Durante a execução, qualquer comando pode ser interrompido pressionando <CTRL>-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.
APÊNDICES
300
B.2
Ajuda
Digite ‘?’ na linha de comando do simulador para listar os comandos
disponíveis. Uma saída como a abaixo é mostrada:
CARACTERES ESPECIAIS
.
encerra entrada de dados
(ctr-c) interrompe execução de qualquer comando
COMANDOS DISPONÍVEIS:
b
breakpoints
| l
carrega arquivo
constantes e símbolos
mostra memória
preenche memória
go
inspeciona memória
jornal
k
mostra ciclos
|
|
|
|
|
|
q
r
s
t
u
x
termina execução
inspeciona registradores
passo a passo
trace
unassemble
mostra estado
FT
c
d
f
g
i
j
|
RA
Para saber mais sobre cada comando, digite a letra correspondente ao
comando seguida de ‘?’.
B.3
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.
D
• 1000 - 1fa
mostra o resultado da subtração 0x1000 - 0x1fa.
B.4
Comandos
Comando b (breakpoint)
• b
mostra breakpoints correntes.
• br ender_ini ender_fim [contador]
associa um breakpoint para cada contador acessos para leitura no
B. SIMULADORES PARA LEG E ARM
301
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.
FT
• 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.
RA
• b ~
remove todos os breakpoints.
Exemplos:
• br
mostra breakpoints de acesso de leitura correntes.
D
• 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.
APÊNDICES
302
B.5
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.
FT
• 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:
RA
• c inicio
mostra o endereço do rótulo inicio.
• c volta 2020
associa o símbolo volta ao valor 0x2020.
B.6
Comando d (display memory)
D
• 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.
B. SIMULADORES PARA LEG E ARM
B.7
303
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.
Exemplos:
FT
• fw ender_ini ender_fim valor_palavra
preenche a memória de ender_ini até ender_fim com palavras de
valor valor_palavra.
• fw 2200 2400 0aa55
preenche a memória do endereço 0x2200 até 0x2400 com o valor
0xaa55.
RA
• f tabela tabela+4 0
zera bytes do endereço tabela até o endereço tabela+4, onde tabela
é uma constante conhecida.
B.8
Comando g (go)
O comando g inicia a simulação a partir de um endereço dado.
D
• 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 é
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.
APÊNDICES
304
• 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.
B.9
Comando i (inspect memory)
FT
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.
RA
• 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 ’.’
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)
D
B.10
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 zera o número
de ciclos antes de uma execução).
Exemplos:
B. SIMULADORES PARA LEG E ARM
305
• k
mostra o número de ciclos executados.
• k 0
zera o número de ciclos executados.
B.11
Comando j (journal)
FT
O comando j permite armazenar os comandos digitados em um arquivo
texto (jornal), que pode ser posteriormente utilizado para re-executar os
comandos automaticamente.
RA
• j ome_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.
Exemplos:
• j teste1.sh
inicia o jornal, armazenando as teclas digitadas no arquivo teste1.sh.
Comando l (load program)
D
B.12
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.
Exemplos:
• l roteador.out
carrega arquivo roteador.out na memória.
APÊNDICES
306
B.13
Comando lc (load commands file)
O comando lc carrega um arquivo de comandos e executa cada comando do
arquivo. O arquivo pode ser gerado manualmente ou através do comando
j.
Exemplos:
FT
• lc nome_arquivo_comandos
Carrega e executa arquivo arquivo de comandos de nome
nome_arquivo_comandos.
• lc teste1.sh
carrega e executa o arquivo de comandos teste1.sh.
B.14
Comando q (quit)
O comando q termina a sessão de simulação.
RA
• q
Termina a simulação.
B.15
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.
D
• 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.
B. SIMULADORES PARA LEG E ARM
B.16
307
Comando s (single step)
O comando s permite a execução passo-a-passo (uma instrução por vez).
FT
• 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).
RA
• 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.
D
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.
B.17
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
APÊNDICES
308
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:
FT
• u 500 20
desmonta 32 instruções a partir do endereço 0x500.
D
RA
• u inicio
desmonta 16 instruções a partir do endereço definido pelo símbolo
inicio.
C. DISPOSITIVOS DE E/S PARA OS SIMULADORES
C
309
Dispositivos de E/S para os simuladores
C.1
FT
Os simuladores legsim e armsim permitem o uso de alguns dispositivos
de entrada e saída, como botões e leds, para implementação de sistemas
simulados.
A menos do dispositivo Console, que é instalado com a opção “-c” da
linha de comando, os dispositivos são instalados para uma dada simulação
carregando um arquivo texto de descrição de dispositivos, usando a opção
“-d” da linha de comando. No arquivo de descrição, linhas que se iniciam
com o caractere ‘#’ são ignoradas, e cada dispositivo é declarado em
duas ou mais linhas, conforme descrito abaixo. Para cada dispositivo, a
primeira linha indica o tipo dispositivo e o nome da janela em que ele será
visualizado. As demais linhas indicam características do dispositivo, como
portas e tipo de interrupção associados ao dispositivo.
Console
RA
A Console emula uma console (um terminal tty) de um sistema operacional,
e permite ler e escrever cadeias de caracteres. Para carregar a console, o
simulador deve ser executado com a opção “-c” na linha de comando. A
comunicação do processador com a console utiliza a convenção EABI para
chamadas a sistema. São definidas três chamadas a sistema, read, write e
exit.
D
• read, para ler uma cadeia de caracteres da entrada.
r0 deve conter o valor 0 (descritor stdin)
r1 deve conter o endereço inicial de um vetor onde deve ser armazenados os bytes lidos
r2 deve conter o número de bytes a serem lidos
r7 deve conter o valor 3 (tipo read)
• write, para escrever uma cadeia de caracteres na saída
r0 deve conter o valor 1 (descritor stdout)
r1 deve conter o endereço inicial da cadeia
r2 deve conter o número de bytes a serem escritos
r7 deve conter o valor 4 (tipo write)
• exit, para terminar a execução do programa
r0 deve conter o valor 1 (descritor stdout)
APÊNDICES
310
r7
deve conter o valor 1 (tipo exit)
As instruções de chamadas a sistema devem ser executadas com valores
especiais para serem interceptadas pelo simulador. No LEG, deve ser
utilizada a instrução
sys
0x55
svc
0x55
FT
e no ARM deve ser utilizado
Essas instruções não disparam o mecanismo de interrupção, mas executam
os serviços de console. Elas não podem ser utilizadas para simular interrupções de usuário, já que são tratadas de forma especial pelo simulador.
C.2
Botões
RA
Botões são dispositivos de leitura apenas. Existem dois tipos de botões
disponíveis:
• liga/desliga, que fisicamente tem duas posições, e inverte de posição
a cada vez que é pressionado.
• tecla, que também tem duas posições, mas normalmente fica em uma
única posição (desligado), mudando para a outra posição (ligado)
apenas enquanto pressionado.
D
Um botão tem apenas uma porta de entrada. Uma leitura na porta do
botão retorna um byte de estado, com o bit menos significativo igual a 1 se
o botão está ligado, ou 0 caso contrário. Botões são definidos em um painel
de botões no arquivo de dispositivos. Até oito botões podem ser criados
em um painel de botões. O formato da descrição de um painel de botões é
%buttons NOME_PAINEL
NOME PORTA INTERRUPÇÃO TIPO
onde
• NOME_PAINEL é um nome que será usado na janela do painel.
• NOME é o nome do botão.
C. DISPOSITIVOS DE E/S PARA OS SIMULADORES
311
• PORTA é o endereço da porta do botão.
• INTERRUPÇÃO é o tipo da interrupção associada ao botão, gerada a
cada vez que o botão é pressionado. Se não o dispositivo não usa
interrupção este valor deve ser zero.
• TIPO é o tipo de botão, devendo ser a letra T (do inglês toggle para o
tipo liga/desliga ou P (do inglês push) para o tipo tecla.
FT
A Figura 3 mostra um exemplo de arquivo de configuração de dispositivos com um painel de botões, e o painel de botões correspondente.
Controle
%buttons Controle
Conta 0x8000 0x10 P
Liga
Conta
Liga
0x8001 0x00 T
RA
(a) Arquivo de configuração.
(b) Painel criado.
Figura 3: Arquivo de configuração de dispositivos para painel contendo
dois botões.
C.3
Teclado
D
O dispositivo teclado tem doze teclas, com dígitos de 0 a 9, mais os símbolos
‘*’ e ‘#’. Ele tem duas portas de leitura, a porta de estado e a porta de
dados. O formato da descrição de um painel de botões é
%keyboard NOME_PAINEL
PORTA_DADOS PORTA_ESTADO INTERRUPÇÃO TIPO
onde
• NOME_PAINEL é um nome que será usado na janela do painel.
• PORTA_DADOS é o endereço da porta de dados do botão, de leitura
apenas. Uma leitura retorna um byte com o valor da última tecla
pressionada. O valor retornado é um inteiro entre 0 e 11 (valor 10
indica a tecla ‘*’, valor 11 indica a tecla ‘#’).
APÊNDICES
312
FT
• PORTA_ESTADO é o endereço da porta de estado do botão, de leitura
apenas. Uma leitura nessa porta retorna um byte de estado. O bit
0 (bit menos significativo) do byte de estado indica se uma tecla
foi pressionada e não foi ainda lida (valor 1 indica que tecla foi
pressionada). O bit 1 do byte de estado indica se houve erro de
atropelamento (em inglês, overrun), ou seja um dado foi perdido
porque antes que tenha sido lido outra tecla foi pressionada (valor 1
indica que houve erro). O estado do teclado é zerado a cada leitura
na porta de dados ou de estado.
• INTERRUPÇÃO é o tipo da interrupção associada ao teclado, gerada a
cada tecla pressionada. Se não o dispositivo não usa interrupção este
valor deve ser zero.
RA
Um único teclado pode ser colocado em cada painel de teclado.
A Figura 4 mostra um exemplo de arquivo de configuração de dispositivos com um painel de teclado, e a janela correspondente.
Teclado
D
%keyboard Teclado
0x8000 0x8001 0x09
(a) Arquivo de configuração.
1
2
3
4
5
6
7
8
9
*
0
#
(b) Painel criado.
Figura 4: Arquivo de configuração de dispositivos para painel de teclado.
C.4
Temporizador
O temporizador é um dispositivo que gera uma interrupção a cada intervalo
de tempo programado. O temporizador tem apenas uma porta de dados,
que é usada para programar o intervalo de tempo.
O formato de descrição de um temporizador é:
C. DISPOSITIVOS DE E/S PARA OS SIMULADORES
313
%timer
PORTA INTERRUPÇÃO
onde
FT
• PORTA é o endereço da porta de dados do temporizador, usada para
programar o intervalo de tempo. O intervalo de tempo é dado como
um valor inteiro, de 32 bits, em milisegundos. Se o intervalo de
tempo é zero, o temporizador é desativado. Caso contrário uma
interrupção é gerada a cada vez que o temporizador expira. O temporizador é automaticamente reinicializado com o valor programado
a cada vez que expira.
• INTERRUPÇÃO é o tipo da interrupção associada ao temporizador.
A Figura 3 mostra um exemplo de arquivo de configuração do temporizador.
%timer
RA
0x90 0x20
Figura 5: Arquivo de configuração para um temporizador.
C.5
LEDs
Leds podem ser de três cores, vermelho, amarelo e verde, e são definidos
em um painel de leds. O formato da descrição de um painel de leds é
D
%leds NOME_PAINEL
LEDS PORTA_DADOS
onde
• NOME_PAINEL é um nome que será usado na janela do painel.
• LEDS é uma sequência de letras que especifica os leds do painel. Cada
letra corresponde a um led, e pode ser r (vermelho), g (verde) ou y
(amarelo). Cada led é associado a um bit na palavra de dados. O
led descrito pela letra mais à esquerda em LEDS corresponde ao led
mais significativo do valor, que aparecerá mais à esquerda no painel
de leds.
APÊNDICES
314
• PORTA_DADOS é o endereço da porta de dados do painel de leds, de
escrita apenas. A escrita de um valor na porta de dados liga ou
desliga os leds correspondentes.
Até oito leds podem ser colocados em cada painel de leds. A Figura 6
mostra um exemplo de arquivo de configuração de dispositivos com um
painel de leds, e a janela correspondente.
Sinais
FT
%leds Sinais
rrygg 0x81
(a) Arquivo de configuração.
(b) Painel criado.
Figura 6: Arquivo de configuração de painel de leds com cinco leds.
Mostrador de sete segmentos
RA
C.6
O mostrador de sete segmentos é um dispositivo de escrita apenas que
permite visualizar um dígito decimal ou outros símbolos simples, conforme
a Figura 7a. Os segmentos do mostrador, mais o ponto decimal, podem
ser individualmente ligados ou desligados escrevendo um byte de dados na
porta do mostrador. Cada segmento corresponde a um bit no byte de dados,
como indicado na Figura 7b.
a
f
b
D
g
e
7
6
5
4
3
2
1
0
p
a
b
c
d
e
f
g
c
d
p
(a)
(b)
Figura 7: Mostrador de sete segmentos (a) e os bits correspondentes no
byte de controle (b).
O formato da descrição de um painel mostradores de sete segmentos é
%7seg NOME_PAINEL
C. DISPOSITIVOS DE E/S PARA OS SIMULADORES
315
PORTA_DADOS1
PORTA_DADOS2
PORTA_DADOS3
PORTA_DADOS4
onde
• NOME_PAINEL é um nome que será usado na janela do painel.
FT
• PORTA_DADOS1 a PORTA_DADOS4 são os endereços das portas de dados
dos mostradores de sete segmentos, de escrita apenas. A escrita de
um byte na porta de dados liga os segmentos correspondentes do
mostrador. Até quatro mostradores podem ser colocados num painel
de mostradores.
RA
A Figura 8 mostra um exemplo de arquivo de configuração de dispositivos para um painel com dois mostradores, e a janela correspondente.
Relógio
%7segdisplays Relógio
0x81
0x82
(a) Arquivo de configuração.
(b) Painel criado.
D
Figura 8: Arquivo de configuração de painel com dois mostradores de sete
segmentos.
APÊNDICES
316
D
Exemplos de uso das ferramentas
Este apêndice apresenta exemplos de uso das ferramentas de desenvolvimento, usando programas apresentados nos capítulos do livro.
D.1
Processador LEG
Programa conta_segundos
# arquivo de configuração de dispositivos para o programa
# conta_segundos.leg
# definição de um painel com um mostrador (porta 0x30)
%7segdisplays Contador
RA
1
2
3
4
5
6
7
8
9
10
11
FT
Considere que o programa do Exemplo 8.8, que usa um mostrador de sete
segmentos e um temporizador para contar continuamente segundos de 0
a 9, esteja armazenado em um arquivo de nome conta_segundos.leg.
Considere ainda que o arquivo texto de nome disp_conta_segundos.txt
contém a descrição dos dispositivos usados, com o seguinte conteúdo:
#port
0x30
# definição de um temporizador (porta 0x20, interrupção de tipo 0x12)
%timer timer
0x20 0x12
D
O Exemplo a seguir mostra a sequência de comandos, digitados em
uma janela de terminal, para montar o programa usando o montador lasm
e executar o programa no simulador legsim:
1
2
3
4
5
6
7
$ lasm conta_segundos.leg
$ legsim -d disp_conta_segundos.txt -l a.out
legsim - LEG simulator (v1.1)
R. Anido/IC-Unicamp
legsim> g inicio
Na linha 1 o montador lasm é acionado para montar o programa fonte
conta_segundos.leg; como a linha de comando não especifica o nome do
arquivo executável, o montador nomeia o executável como a.out. Na linha
D. EXEMPLOS DE USO DAS FERRAMENTAS
317
D.2
FT
2 o simulador legsim é acionado, especificando que deve ser utilizado o
arquivo de dispositivos disp_conta_segundos.txt e que o código executável a ser carregado está no arquivo a.out. O simulador inicia a sessão de
simulação, instancia os dispositivos (que aparecem em janelas na tela do
computador), carrega o código executável e imprime um prompt no formato
“legsim>”, esperando um comando. Na linha 7 o comando “g inicio” é
então digitado, fazendo com que o simulador inicie a simulação a partir do
rótulo inicio, definido no programa.
Processador ARM
Programa botao_leds
RA
Considere que o programa do Exemplo 13.4, que usa um botão e um painel
com quatro leds, esteja armazenado em um arquivo de nome botao_leds.s.
Considere ainda que o arquivo texto de nome disp_botao_leds.txt contém a descrição dos dispositivos usados, com o seguinte conteúdo:
# arquivo de configuração de dispositivos para o programa
# botao_leds.s
# definição de um painel com um botão (porta 0x30, int. 6, tipo tecla)
%buttons Controle
Conta 0x90030 0x06 P
# definição de um painel de leds (quatro leds vermelhos, porta 0x90050)
%leds Contador
#colors port
rrrr 0x90050
D
1
2
3
4
5
6
7
8
9
10
11
O Exemplo a seguir mostra a sequência de comandos, digitados em uma
janela de terminal, para montar o programa usando o montador gnu-arm-as
e executar o programa no simulador armsim:
1
2
3
4
5
6
7
$ gnu-arm-as botao_leds.s
$ armsim -d disp_conta_segundos.txt -l a.out
armsim - ARM simulator (v0.6d)
R. Anido/IC-Unicamp
armsim> g inicio
APÊNDICES
318
D
RA
FT
Na linha 1 o montador gnu-arm-as é acionado para montar o programa
fonte botao_leds.leg; como a linha de comando não especifica o nome
do arquivo objeto, o montador nomeia o arquivo objeto como a.out 2.
Na linha 2 o simulador armsim é acionado, especificando que deve ser
utilizado o arquivo de dispositivos disp_botao_leds.txt e que o código
executável a ser carregado está no arquivo a.out. O simulador inicia a
sessão de simulação, instancia os dispositivos (que aparecem em janelas
na tela do computador), carrega o código executável e imprime um prompt
no formato “armsim>”, esperando um comando. Na linha 7 o comando
“g inicio” é então digitado, fazendo com que o simulador inicie a simulação a partir do rótulo inicio, definido no programa.
2Observe que não é necessário ligar o arquivo objeto com o ligador para executá-lo no
simulador. Como o programa não define seções .DATA ou .TEXT, o montador cria uma
única seção, e como o formato do arquivo ELF é o mesmo para arquivo objeto intermediário
e arquivo objeto executável, o simulador consegue simular o programa corretamente usando
o arquivo objeto a.out. Observe ainda que se o programa contém mais de uma seção, ou é
composto por mais de um arquivo objeto, será necessário usar o ligador.