Introdução à Arquitetura de Computadores/As Pseudo-Instruções

A linguagem Assembly de uma máquina costuma ser um reflexo direto de como são implementadas as instruções de um determinado processador. Entretanto, nem todas as instruções que temos à disposição quando programamos em Assembly são instruções verdadeiras para o processador. Algumas delas são na verdade pseudo-instruções.

Pseudo-instruções costumam ser substituídas pelo montador ao gerar instruções para o computador na forma de Lingüagem de Máquina. Pseudo-Instruções são na verdade combinações de mais de uma instrução. Vejamos agora alguns exemplos:

A Pseudo-Instrução move

editar
move $r1, $r2 # Copia o conteúdo do registrador $r2 para $r1

Ela é na verdade implementada da seguinte forma:

addu $r1, $r0, $r2 # Soma $r2 com zero e coloca o resultado em $r1

O registrador $r0 usado acima não é um registrador comum. Ele sempre possui o valor "0" e é um dos poucos registradores cujo valor nunca pode ser alterado pelo programador.

A Pseudo-Instrução Load Address

editar
la $r1, ENDEREÇO # Coloca o valor numérico de 32  bits "ENDEREÇO" em $r1

Esta instrução é muito útil para fazer registradores receberem o valor de ponteiros para outros locais de memória. De fato, usamos esta pseudo-instrução no Capítulo anterior quando convertemos um código em C para o Assembly do MIPS. Ela é na verdade implementada desta forma:

lui $r1, constHI      # Carrega-se os 16 bits mais significativos em $r1
ori $r1, $r0, constLO # Executa-se um OR bit-a-bit entre o registrador
                      # com os 16 bits mais significativos e os 16 bits
                      # menos significativos

O que a instrução lui, ou Load Upper Immediate faz é uma operação shift de 16 bits para a esquerda e coloca no registrador indicado. Este passo é necessário porque valores imediatos passados para instruções só podem ter 16 bits por causa da limitação de espaço das instruções do Tipo I.

Também existe a instrução li, ou Load Immediate que faz exatamente a mesma coisa que o la.

Note que o montador que remove as pseudo-instruções e as substitui por instruções que realmente existem no hardware sempre podem verificar se o valor que queremos carregar no registrador cabe em 16 bits. Neste caso, a instrução gerada fica bem mais simples e rápida:

addu $r1, $r0, $r2 # Soma $r2 com 0 e coloca em $r1