所以我试图找到3个数字之间最大的共同点。我认为我的逻辑非常合理,如何做到这一点,我目前没有得到正确的输出。
li $s0, 1
whileloop:
bgt $s0, $t0, exit
bgt $s0, $t1, exit
bgt $s0, $t2, exit
IF1:
div $s0, $t0
mfhi $s1
bne $s1, $zero, else
IF2:
div $s0, $t1
mfhi $s2
bne $s2, $zero, else
IF3:
div $s0, $t2
mfhi $s3
bne $s3, $zero, else
sw $s0, 4($s4)
j else
else:
addi $s0, $s0, 1
j whileloop
exit:
la $a0, answer
syscall
move $a0, $s4
li $v0, 1
syscall
li $v0, 10
syscall
这三个数字是用户输入$ t0,$ t1和$ t2。
答案 0 :(得分:2)
你的逻辑是合理的但你的div指令不正确。颠倒所有三个论点。例如,您正在执行s1 = s0 % t0
,并且您需要s1 = t0 % s0
警告:在mflo / mfhi之后,你不能在两个指令中进行乘法/除法,所以你需要在这里和那里添加一个nop。请参阅http://chortle.ccsu.edu/assemblytutorial/Chapter-14/ass14_5.html特别是,if2 / if3中的div在秋季案例中违反了这一点。
就个人而言,我通过在 mfhi之后更改而不是之前来修复此问题。 IMO,那是更清洁,因为限制来自mfhi [not div],所以将补偿与它联系起来。而且,为了规律起见,我会把它放在所有三个mfhi上,即使实际上并不需要它。
变化:
mfhi ...
bne ...
ifX:
div ...
分为:
mfhi ...
nop
bne ...
ifX:
div ...
只是为了好玩,这是你的程序翻译回C:
int
gcd(int t0,int t1,int t2)
{
int s0;
int s1;
int s2;
int s3;
int rtn;
rtn = -1;
s0 = 1;
Lloop:
if (s0 > t0) goto Lexit;
if (s0 > t1) goto Lexit;
if (s0 > t2) goto Lexit;
Lif1:
#if 0
s1 = s0 % t0;
#else
s1 = t0 % s0;
#endif
if (s1 != 0) goto Lelse;
Lif2:
#if 0
s2 = s0 % t1;
#else
s2 = t1 % s0;
#endif
if (s2 != 0) goto Lelse;
Lif3:
#if 0
s3 = s0 % t2;
#else
s3 = t2 % s0;
#endif
rtn = s0;
if (s3 != 0) goto Lelse;
Lelse:
s0 += 1;
goto Lloop;
Lexit:
return rtn;
}