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
editarmove $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
editarla $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