Programação

O desenvolvimento de um programa depende da ferramenta utilizada. Para os códigos mostrados nesse texto será utilizado o padrão ARM assembly. Cabe ressaltar que atualmente os códigos em assembly são escritos seguindo o padrão UAL (do inglês, Unified Assembler Language). A seguir são apresentadas algumas convenções do montador.

Definindo o código que será executado: Lista de Instruções

Cada linha de código – que possui uma instrução – segue o seguinte formato:

label mnemônico operando1, operando2, . ; Comentários

  • label: é utilizado para referenciar o endereço que a instrução está. É opcional, e pode ser utilizado como referência em outras instruções (instruções de desvio). Também pode ser utilizado como referência para o endereço de um dado. É importante ressaltar que o label deve iniciar na primeira coluna da linha (sem espaço).

  • mnemônico: é utilizado para indicar a instrução. Dependendo da instrução é necessário indicar os operandos.

  • Para operações de escrita na memória, o primeiro operando indica a origem, isto é, o registrador que contém o dado que será gravado na memória.

  • Para operações de leitura da memória, o primeiro operando indica o destino, isto é, o registrador que que receberá a informação que está na memória.

  • Instruções no formato ARM usam o primeiro operando como destino da operação.

  • Por fim, os comentários do programa são precedidos do símbolo ‘;’.

Exemplos

Alguns exemplos são mostrados a seguir.

No padrão UAL o sufixo S deve ser utilizado nas instruções que alteram o conteúdo do registrador APSR.

Carregar um registrador com um valor constante (#constante) de 8 bits.

  • MOVS R0,#10 ; R0 = 10

  • MOVS R0,#0x0A ; R0 = 10

Movimentação de dados entre registradores

  • MOV R0,R1

Adição entre um registrador e uma constante de 3 bits

  • ADDS R0,R0,#1 ; R0 = R0 + 1

  • ADDS R1,R0,#1 ; R1 = R0 + 1

Adição entre um registrador e uma constante de 8 bits

  • ADDS R0,#10 ; R0 = R0 + 10

Adição entre registradores

  • ADD R0,R1 ; R0 = R0 + R1

Comparação entre registradores

  • CMP R0,R1 ;Z flag =1 se R0==R1

Desvio condicional

  • BEQ label ; salta para o endereço indicado se Z flag = 1

Desvio incondicional

  • B label ; salta para o endereço indicado

Para conferir todas operações realizadas na execução das instruções, consulte esta referência: The Cortex-M0+ Instruction Set.

Cabe, nesse ponto, apresentar o conteúdo do registrador APSR, em que N, Z, C e V representam, respectivamente: Valor negativo; Valor zero; Carry ou Borrow; Overflow.