2015-10-18 97 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; 
}