2016-10-25 27 views
0

下にMIPSコードを掲載しました。私は上にそれをオフに基づかていたJavaコードがある...MIPS入力された数字より下のすべての素数を見つけるためのアセンブリコード

Javaコード...

for (int i=2;i<n;i++){ 
    p = 0; 
    for (int j=2;j<i;j++){ 
    if (i % j == 0) 
    p = 1; 
    } 
    if (p = 0) System.out.println(i); 
} 

私は、pがあるときL4にスキップするライン "BEQの$ t3の、1、L4" を追加しました時間を節約するために1に設定します。しかし、このコード行を追加すると、プログラムは何も出力しません。この行を追加する前に、2〜nの整数をすべて出力します。

MIPSコード...

# The number is read through the keyboard 
.text 
.globl main 

main: 
# Display message to user for a number 
li $v0, 4 
la $a0, prompt1 
syscall 

# read keyboard into $v0 (number x is upper bound number to find primes) 
li $v0, 5 
syscall 

# move the number from $v0 to $t0 
move $t0, $v0 # $t0 = n 

# store 2 in $t1 and $t2 
li $t1, 2 # i 
li $t2, 2 # j 

L3: # for (int i=2; i<n; i++) 
# store 0 in $t3 
li $t3, 0 # p = 0; 

L2: # for (int j=2; j<i; j++) 
# do div of two numbers 
div $t2, $t1 

# store the remainder in $t4 
mfhi $t4 

# branch if remainder is not 0 to L1 
bne $t4, 0, L1 # if (i % j == 0) 

# set $t3 as 1 
li $t3, 1 # p = 1 

# if p=1 break to next i 
beq $t3, 1, L4 

L1: # if (i % j == 0) 
# add 1 to t2 
addi $t2, $t2, 1 # j++ 

# repeat code while j < i 
ble $t2, $t1, L2 

# print integer function call 1 
# put the answer into $a0 
li $v0, 1 
move $a0, $t1 
syscall # System.out.println(i) 
#print comma 
li $v0, 4 
la $a0, comma 
syscall 

L4: 
# add 1 to t1 
addi $t1, $t1, 1 # i++ 

# repeat code while i < n 
ble $t1, $t0, L3 # for (int i=2; i<n; i++) 

.data 
prompt1: 
.asciiz "Enter a number " 
comma: 
.asciiz "," 

は、私は私の組立・ロジックは、forループのJ < I部分を占めていないため、エラーが発生したと思います。正しい軌道にいるのですか?

答えて

2

は二つの問題があります。

  1. あなたはL3が1行上に移動されるべきバック2にJを設定するのを忘れ、私インクリメント

    。 MIPSでBLE

  2. あなたのコードが実際にJ < = I、ないJ <私をチェックしているので、以下に等しいです。これにより、コードが、0 = jのときにi%jにチェックされます。これは常に剰余が0であり、プライムではないと登録されます。 'ble'を 'blt'に変更するこれを修正する必要があります。同じことがi < nチェックになります。

    また

いくつかの追加建設的な批判:あなたは完全にPを削除し、Pを持つことの冗長性を取ることができ、P = 1

li $t3, 1 # p = 1 
beq $t3, 1, L4 # if p=1 break to next i 

場合は、すぐに参照するためのチェックを行い、その後、P = 1を設定しますこれらの2行をL4の無条件分岐で置き換えてください。

b L4 
+0

ありがとう、ありがとうございます。私は無条件の支店を見ていきます。それは何があってもジャンプすることを意味しますか? @ホシュアリー。正確には –

+0

です。実際には2つの方法があります:無条件分岐、すなわち「b L4」と無条件ジャンプ、すなわち「J L4」です。コーディングの観点からは同じですが、フードの下にはいくつかの違いがあります。違いの詳細はこちらをご覧ください:http://stackoverflow.com/questions/10981593/what-is-the-difference-between-unconditional-branch-and-unconditional-jump-inst – theKunz

関連する問題