2014-12-12 2 views
0

У меня есть школьное задание, чтобы узнать сумму 1 + 2 + .. n на языке ассемблера MIPS (используя PC- Spim как виртуальная машина). Я написал простую программу, которая не имеет дело с большими числами (поэтому n * (n + 1) не должно превышать 2^32-1, чтобы она работала). Сегодня я слышал, что профессор, если вы не используете регистраторы привет и Ло, скажет вам использовать их и сделать программу для 64-битных чисел тоже!Как разделить большое число (64 бита) на два в PC-Spim (язык ассемблера MIPS)

Так это начальная программа:

.data 
n:.word 10 
s:.word 0 
.text 
main: 
lw $t0,n 
add $t1,$t0,1 
mulou $t1, $t0, $t1 
sra $t1,$t1,1 
sw $t1,s 
sfarsit: 
li $v0,10 
syscall 

и это моя попытка изменить его:

.data 
n:.word 1048576 
s:.word 0 
s2:.word 0 
.text 
main: 
lw $t0,n 
add $t1,$t0,1 
mult $t0, $t1 
mflo $t0 
mfhi $t1 
sra $t0,$t0,1 
sra $t1,$t1,1 
sw $t0,s 
sw $t1,s 
sfarsit: 
li $v0,10 
syscall 

«SRA» трюк не работает, если применить его к каждому 32 -битной части вашего результата. (Хотя я надеялся, что это будет лол) п: 1048576 ожидаемый результат: 549756338176 , что программа дает: 549755813888

a program result

Что я мог сделать, чтобы разделить большое число на два?

ответ

2

Вы разделив 2 32-битных чисел на 2 отдельно, а не 1 64-разрядного числа на 2.

mult $t0, $t1 
mflo $t0 
mfhi $t1 
sra $t0,$t0,1 
sra $t1,$t1,1 
sw $t0,s 
sw $t1,s 

Вы должны переместить целые 64-битные значения. Это означает, что сдвигаются бит верхней части должна быть сдвинута в нижнюю часть

sra $t1, $t1, 1 
srl $t0, $t0, 1 
sll $t2, $t1, 31 
or $t0, $t2, $t0 

Поскольку п всегда положительна, вам не нужно перекладывать арифметически в любом случае. Используйте его как неподписанный тип вместо

 Смежные вопросы

  • Нет связанных вопросов^_^