Exemplo de código Assembly


O programa seguinte transforma uma string de caracteres numa nova string em que as letras minúsculas são substituídas pelas maiúsculas correspondentes.

Em C:

void toUpper(char* str){
    char *s = str;
    while(*s != 0){
        if(*s >= 97 && *s <= 122)
                *s = *s - 32;
        s++;
    }
}

Em assembly para a arquitectura implementada no trabalho prático:

1 add $1 $0 $0  % $1 = 0
2 addi $2 $0 97 % $2 = 97
3 addi $3 $0 122 % $3 = 122
4 lw $4 $1 64 % $4 = valor na posição da memória (64 + $1)
5 beq $4 $0 6 % Se $4 == $0 então PC = PC + 1 + 6
6 blt $4 $2 3 % Se $4 < 97 então PC = PC + 1 + 3
7 bgt $4 $3 2 % Se $4 > 122 então PC = PC + 1 + 2
8 addi $4 $4 -32 % Subtrai 32 ao valor em $4
9 sw $4 $1 64 % Guarda o valor em $4 na posição de memória (64 + $1)
10 addi $1 $1 1 % $1 = $1 + 1
12 j 4     % PC = 4
13 sys 0     % Fim de execução


Se apenas implementarem as instruções que estão no enunciado, o vosso CPU deve detectar as instruções que não sabe interpretar e terminar a execução do programa (sem estourar).

Se quiserem correr o programa até ao fim, têm de implementar as instruções blt (branch on lower than) e bgt (branch on greater than). Facilmente o conseguem a partir das instruções beq e bne. A instrução sys, implementa uma chamada ao sistema. Com o parâmetro 0 indica ao CPU para terminar a execução do programa.