Suponha que o MIPS não seja capaz de realizar subtrações. Implemente (com o simulador MARS) um algoritmo para realizar a adição ou subtração de dois números de 4 bits. Não é necessário identificar overflow ou underflow.
Considere que cada bit é um valor inteiro constante que será descrito em .data, juntamente com um inteiro (0 ou 1) sinal que indica se será feita adição (0) ou subtração (1).
Para implementar um algoritmo que realiza a adição ou subtração de dois números de 4 bits sem o uso da instrução SUB, podemos usar o conceito de complemento de dois. O complemento de dois é uma técnica usada para representar números negativos em sistemas de computação. Para representar um número negativo usando o complemento de dois, inverta todos os bits do número e adicione 1 ao resultado.
Aqui está um possível algoritmo que implementa a adição ou subtração de dois números de 4 bits em MIPS, sem usar a instrução SUB:
Para usar este algoritmo, basta definir as palavras na seção .data do seu arquivo .asm, carregar o arquivo no simulador MARS e executá-lo. O resultado será impresso
Lista de comentários
Para implementar um algoritmo que realiza a adição ou subtração de dois números de 4 bits sem o uso da instrução SUB, podemos usar o conceito de complemento de dois. O complemento de dois é uma técnica usada para representar números negativos em sistemas de computação. Para representar um número negativo usando o complemento de dois, inverta todos os bits do número e adicione 1 ao resultado.
Aqui está um possível algoritmo que implementa a adição ou subtração de dois números de 4 bits em MIPS, sem usar a instrução SUB:
**********************************************************************************************
# Carrega os valores dos números e da operação
lw $t0, x0($0) # Carrega x0
lw $t1, x1($0) # Carrega x1
lw $t2, x2($0) # Carrega x2
lw $t3, x3($0) # Carrega x3
lw $t4, y0($0) # Carrega y0
lw $t5, y1($0) # Carrega y1
lw $t6, y2($0) # Carrega y2
lw $t7, y3($0) # Carrega y3
lw $t8, subtracao($0) # Carrega a operação (0 para adição, 1 para subtração)
# Inverte os bits de y se a operação for subtração
beq $t8, $zero, adicao # Pula para adição se a operação for adição
not $t4, $t4
not $t5, $t5
not $t6, $t6
not $t7, $t7
addi $t7, $t7, 1
# Realiza a soma dos números
adiciona:
add $t0, $t0, $t4 # Soma x0 + y0
add $t1, $t1, $t5 # Soma x1 + y1
add $t2, $t2, $t6 # Soma x2 + y2
add $t3, $t3, $t7 # Soma x3 + y3
j fim
# Realiza a subtração dos números usando complemento de dois
subtrai:
not $t0, $t0 # Inverte os bits de x
not $t1, $t1
not $t2, $t2
not $t3, $t3
addi $t3, $t3, 1
add $t0, $t0, $t4 # Soma x + (~y + 1)
add $t1, $t1, $t5
add $t2, $t2, $t6
add $t3, $t3, $t7
j fim
# Imprime o resultado
fim:
add $a0, $t0, $zero # Copia o resultado para $a0
add $a1, $t1, $zero
add $a2, $t2, $zero
add $a3, $t3, $zero
li $v0, 1 # Prepara a syscall para imprimir inteiros
syscall # Imprime o resultado
********************************************************************************************
Para usar este algoritmo, basta definir as palavras na seção .data do seu arquivo .asm, carregar o arquivo no simulador MARS e executá-lo. O resultado será impresso