- (1,0 pontos) Encontre a sequência mais curta de instruções MIPS para determinar o valor absoluto de um inteiro em complemento de dois. Converta esta instrução aceita pelo montador.
abs \(t2,\)t3 # cópia absoluto de \(t3 em\)t2
abs \(t2,\)t3 # cópia absoluto de \(t3 em\)t2
Passo 1
O enunciado pede para converter a pseudo-instrução
(nota: cópia do valor absoluto de em
) na sequência mais curta de instruções MIPS que o montador aceita.
Informações relevantes dadas pelo enunciado:
(nota: cópia do valor absoluto de
Informações relevantes dadas pelo enunciado:
- O valor original (um inteiro em complemento de dois) está em
. - O resultado (o valor absoluto) deve ficar em
. - Podemos usar registradores temporários adicionais se necessário (por exemplo
). - Queremos a sequência de instruções real (sem pseudo-instruções) e a mais curta possível.
Passo 2
Breve explicação sobre complemento de dois e negação (pra segurar a intuição):
- Em complemento de dois, o bit mais significativo é o bit de sinal: se ele for
o número é não negativo, se for o número é negativo. - A negação aritmética de um inteiro
em complemento de dois é dada por
onde
é o complemento bit-a-bit (bitwise NOT). Isso é importante porque o valor absoluto de
é
quando
e
quando
.
Passo 3
Ideia da solução (sem ainda colocar instruções): precisamos de uma forma de decidir, sem usar branch (pois branch + instruções costuma ser mais longo), se
ou seja,
para não-negativos e
para negativos. Usando essa máscara podemos escrever uma fórmula que dá o absoluto sem branches.
Passo 4
Como obter a máscara
com instruções MIPS: deslocamento aritmético à direita por
posições replica o bit de sinal por todos os bits. Em MIPS isso é feito por
. Se
está em
, então
produz
quando
e
quando
. Isso porque o deslocamento aritmético preserva o sinal.
Passo 5
Agora a fórmula mágica usando
que produz
sem branch é
onde
é XOR bit-a-bit. Vamos checar por casos:
- Se
(isto é, ): - Se
(isto é, ). Note que . Então que é exatamente o valor absoluto de . Portanto a expressão funciona.
Passo 6
Tradução direta para instruções MIPS (usando
como registrador temporário para
). A sequência mínima e típica é de três instruções:
- calcular
com deslocamento aritmético; - fazer XOR entre
e ; - subtrair
do resultado.
Escrevendo as instruções (cada registrador entre
conforme exigido):
sra
xor
subu
sra
xor
subu
Explicação rápida da escolha: usei
para obter a máscara de sinal,
para obter
quando necessário, e
(subtração sem overflow) para calcular
. São três instruções, e qualquer solução sem pseudo-instrução e sem branches em MIPS I exige pelo menos essas operações lógicas/aritméticas, então esta é a sequência mais curta prática e amplamente usada.
Passo 7
Exemplo numérico rápido para fixar (pega a intuição): seja
. Em complemento de dois,
tem bit de sinal
.
-
dá . -
. -
. Pronto: obtivemos .
Resposta
sra
xor
subu
xor
subu