2015-10-18 83 views
0

所以我试图找出3个数字之间最大的共同点。我认为我的逻辑对于如何做到这一点非常合适,而且我目前没有得到正确的输出。用if语句中的逻辑奋斗

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的。

回答

2

你的逻辑是健全的,但你的div指令是不正确的。颠倒三者的论据。例如,你在做s1 = s0 % t0,你想s1 = t0 % s0

警告:你不能在mflo/mfhi之后的两条指令中进行乘/除,所以你需要在这里和那里添加一个nop。请参阅http://chortle.ccsu.edu/assemblytutorial/Chapter-14/ass14_5.html特别是,您的div在if2/if3在秋季通过大小写违反了此规定。

就个人而言,我会通过的MFHI而非前格之后,改变它解决这个问题。国际海事组织,这是更清洁,因为限制来自mfhi [不是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; 
}