Assembly MIPS汇编代码,用于查找输入数字下面的所有素数
下面我已经发布了我的MIPS代码。我基于的java代码是 Java代码Assembly MIPS汇编代码,用于查找输入数字下面的所有素数,assembly,mips,primes,Assembly,Mips,Primes,下面我已经发布了我的MIPS代码。我基于的java代码是 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); } 对于(int i=2;i有两个问题: 当你增加i时,你忘了把j设置回2。L3应该向上移动1行 MIPS中的ble小于或等于,因此您的代码实际上正在检查j有两个
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);
}
对于(int i=2;i有两个问题:
当你增加i时,你忘了把j设置回2。L3应该向上移动1行
MIPS中的ble小于或等于,因此您的代码实际上正在检查j有两个问题:
当你增加i时,你忘了把j设置回2。L3应该向上移动1行
MIPS中的ble小于或等于,因此您的代码实际上正在检查打印两个输入数字之间的所有素数的MIPS程序,请修改此选项以将下限设置为1
.text
.globl main
main:
# put mssge 1
li $v0, 4
la $a0, msg1
syscall
# take n1
li $v0, 5
syscall
move $t1, $v0
# put mssge 2
li $v0, 4
la $a0, msg2
syscall
# take n2
li $v0, 5
syscall
move $t2, $v0
# if n1 == n2
bne $t1, $t2, continue1
li $v0, 4
la $a0, msg4
syscall
j exit
continue1:
blt $t1,$t2, continue2
li $v0, 4
la $a0, msg3
syscall
move $t4, $t1
move $t1, $t2
move $t2, $t4
continue2:
bgt $zero,$t1, negRange
j continue3
negRange:
li $v0, 4
la $a0, msg5
syscall
j exit
continue3:
addi $t1, $t1, 1
# n and n+1 handle
beq $t1, $t2, noRange
j loop
noRange:
li $v0, 4
la $a0, msg4
syscall
j exit
# for loop for printing primes
loop:
# put num in $a0
#checkPrime called with jal
move $a0, $t1
jal checkPrime
#if $v0 is yes print else dont
move $t8, $v0
beq $t8, $zero, continue
li $v0, 1
move $a0, $t1
syscall
li $v0, 4
la $a0, endline
syscall
continue:
#update n1
addi $t1, $t1, 1
#loop till _i < n2
beq $t1, $t2, end_loop
j loop
end_loop:
exit:
li $v0, 10
syscall
# function for checking a number prime
# a0 gets number, v0 gets the return yes/no
# without stack
checkPrime:
li $t0, 2
# loop
li $t6, 1
beq $a0, $t6, not_prime
loopCheck:
rem $t3, $a0, $t0
beq $t3, $zero, not_prime
addi $t0, $t0, 1
beq $t0, $a0, end_loop_yes
j loopCheck
# put yes/no in $v0
not_prime:
li $v0, 0
jr $ra
end_loop_yes:
li $v0, 1
jr $ra
.data
msg1: .asciiz "Enter first number: "
msg2: .asciiz "Enter second number: "
msg3: .asciiz "Second number is less than First, exchanging and finding\n"
msg4: .asciiz "no number in between the range!\n"
msg5: .asciiz "negative range!\n"
endline: .asciiz "\n"
.text
格洛博梅因酒店
主要内容:
#第1页付诸表决
李$v0,4
洛杉矶$a0,msg1
系统调用
#以n1为例
李$v0,5
系统调用
移动$t1,$v0
#第2页
李$v0,4
洛杉矶$a0,msg2
系统调用
#以n2为例
李$v0,5
系统调用
移动$t2,$v0
#如果n1==n2
bne$t1、$t2、续1
李$v0,4
la$a0,msg4
系统调用
j出口
续1:
blt$t1、$t2,续2
李$v0,4
la$a0,msg3
系统调用
移动$t4,$t1
移动$t1,$t2
移动$t2,$t4
续2:
bgt$0,$t1,内格罗格
j继续3
内格罗格:
李$v0,4
洛杉矶$a0,msg5
系统调用
j出口
继续3:
附加$t1,$t1,1
#n和n+1手柄
beq$t1、$t2、noRange
j环
诺朗格:
李$v0,4
la$a0,msg4
系统调用
j出口
#用于打印素数的for循环
循环:
#将num放入$a0
#打电话给日本航空公司
移动$a0,$t1
日航支票优惠
#如果$v0为“是”,则打印其他内容
移动$t8,$v0
beq$t8$零,继续
李$v0,1
移动$a0,$t1
系统调用
李$v0,4
洛杉矶$a0,终点线
系统调用
继续:
#更新n1
附加$t1,$t1,1
#循环至_i
打印两个输入数字之间的所有素数的Mips程序,修改此设置以将下限设置为1
.text
.globl main
main:
# put mssge 1
li $v0, 4
la $a0, msg1
syscall
# take n1
li $v0, 5
syscall
move $t1, $v0
# put mssge 2
li $v0, 4
la $a0, msg2
syscall
# take n2
li $v0, 5
syscall
move $t2, $v0
# if n1 == n2
bne $t1, $t2, continue1
li $v0, 4
la $a0, msg4
syscall
j exit
continue1:
blt $t1,$t2, continue2
li $v0, 4
la $a0, msg3
syscall
move $t4, $t1
move $t1, $t2
move $t2, $t4
continue2:
bgt $zero,$t1, negRange
j continue3
negRange:
li $v0, 4
la $a0, msg5
syscall
j exit
continue3:
addi $t1, $t1, 1
# n and n+1 handle
beq $t1, $t2, noRange
j loop
noRange:
li $v0, 4
la $a0, msg4
syscall
j exit
# for loop for printing primes
loop:
# put num in $a0
#checkPrime called with jal
move $a0, $t1
jal checkPrime
#if $v0 is yes print else dont
move $t8, $v0
beq $t8, $zero, continue
li $v0, 1
move $a0, $t1
syscall
li $v0, 4
la $a0, endline
syscall
continue:
#update n1
addi $t1, $t1, 1
#loop till _i < n2
beq $t1, $t2, end_loop
j loop
end_loop:
exit:
li $v0, 10
syscall
# function for checking a number prime
# a0 gets number, v0 gets the return yes/no
# without stack
checkPrime:
li $t0, 2
# loop
li $t6, 1
beq $a0, $t6, not_prime
loopCheck:
rem $t3, $a0, $t0
beq $t3, $zero, not_prime
addi $t0, $t0, 1
beq $t0, $a0, end_loop_yes
j loopCheck
# put yes/no in $v0
not_prime:
li $v0, 0
jr $ra
end_loop_yes:
li $v0, 1
jr $ra
.data
msg1: .asciiz "Enter first number: "
msg2: .asciiz "Enter second number: "
msg3: .asciiz "Second number is less than First, exchanging and finding\n"
msg4: .asciiz "no number in between the range!\n"
msg5: .asciiz "negative range!\n"
endline: .asciiz "\n"
.text
格洛博梅因酒店
主要内容:
#第1页付诸表决
李$v0,4
洛杉矶$a0,msg1
系统调用
#以n1为例
李$v0,5
系统调用
移动$t1,$v0
#第2页
李$v0,4
洛杉矶$a0,msg2
系统调用
#以n2为例
李$v0,5
系统调用
移动$t2,$v0
#如果n1==n2
bne$t1、$t2、续1
李$v0,4
la$a0,msg4
系统调用
j出口
续1:
blt$t1、$t2,续2
李$v0,4
la$a0,msg3
系统调用
移动$t4,$t1
移动$t1,$t2
移动$t2,$t4
续2:
bgt$0,$t1,内格罗格
j继续3
内格罗格:
李$v0,4
洛杉矶$a0,msg5
系统调用
j出口
继续3:
附加$t1,$t1,1
#n和n+1手柄
beq$t1、$t2、noRange
j环
诺朗格:
李$v0,4
la$a0,msg4
系统调用
j出口
#用于打印素数的for循环
循环:
#将num放入$a0
#打电话给日本航空公司
移动$a0,$t1
日航支票优惠
#如果$v0为“是”,则打印其他内容
移动$t8,$v0
beq$t8$零,继续
李$v0,1
移动$a0,$t1
系统调用
李$v0,4
洛杉矶$a0,终点线
系统调用
继续:
#更新n1
附加$t1,$t1,1
#循环至_i
非常感谢。我将研究无条件分支。这是否意味着无论发生什么,它都会跳转?@Joshua Lee准确地说。实际上有两种方法可以做到这一点:无条件分支,即“b L4”和无条件跳转,即“J L4”.从编码的角度来看,它们是相同的,但有一些隐藏的东西使它们不同。你可以在这里找到更多关于差异的信息:非常感谢。我将研究无条件分支。这是否意味着它无论如何都会跳转?@Joshua Lee确切地说。实际上有两种方法可以做到这一点:无条件branch,即“b L4”和无条件跳转,即“J L4”。从编码的角度来看,它们是相同的,但有一些隐藏的东西使它们不同。你可以在这里找到更多关于差异的信息:
b L4
.text
.globl main
main:
# put mssge 1
li $v0, 4
la $a0, msg1
syscall
# take n1
li $v0, 5
syscall
move $t1, $v0
# put mssge 2
li $v0, 4
la $a0, msg2
syscall
# take n2
li $v0, 5
syscall
move $t2, $v0
# if n1 == n2
bne $t1, $t2, continue1
li $v0, 4
la $a0, msg4
syscall
j exit
continue1:
blt $t1,$t2, continue2
li $v0, 4
la $a0, msg3
syscall
move $t4, $t1
move $t1, $t2
move $t2, $t4
continue2:
bgt $zero,$t1, negRange
j continue3
negRange:
li $v0, 4
la $a0, msg5
syscall
j exit
continue3:
addi $t1, $t1, 1
# n and n+1 handle
beq $t1, $t2, noRange
j loop
noRange:
li $v0, 4
la $a0, msg4
syscall
j exit
# for loop for printing primes
loop:
# put num in $a0
#checkPrime called with jal
move $a0, $t1
jal checkPrime
#if $v0 is yes print else dont
move $t8, $v0
beq $t8, $zero, continue
li $v0, 1
move $a0, $t1
syscall
li $v0, 4
la $a0, endline
syscall
continue:
#update n1
addi $t1, $t1, 1
#loop till _i < n2
beq $t1, $t2, end_loop
j loop
end_loop:
exit:
li $v0, 10
syscall
# function for checking a number prime
# a0 gets number, v0 gets the return yes/no
# without stack
checkPrime:
li $t0, 2
# loop
li $t6, 1
beq $a0, $t6, not_prime
loopCheck:
rem $t3, $a0, $t0
beq $t3, $zero, not_prime
addi $t0, $t0, 1
beq $t0, $a0, end_loop_yes
j loopCheck
# put yes/no in $v0
not_prime:
li $v0, 0
jr $ra
end_loop_yes:
li $v0, 1
jr $ra
.data
msg1: .asciiz "Enter first number: "
msg2: .asciiz "Enter second number: "
msg3: .asciiz "Second number is less than First, exchanging and finding\n"
msg4: .asciiz "no number in between the range!\n"
msg5: .asciiz "negative range!\n"
endline: .asciiz "\n"