在if语句中苦苦挣扎

时间:2015-10-18 01:30:30

标签: assembly mips

所以我试图找到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。

1 个答案:

答案 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;
}