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