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.