當我運行程式時,我嘗試將我的數字添加到 mips 中的陣列中,但陣列中唯一被填充的索引是當我的索引值 = 0 時,其他數字都顯示為 0。
編輯:這是我完整的 mips 代碼和我用來翻譯的代碼
import java.util.Scanner;
public class PrimeDivisors {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter n: ");
int n = input.nextInt();
int factorial = 1;
for (int i = 1; i <= n; i ) {
factorial *= i;
}
System.out.println(n "! = " factorial);
int[] primes = findPrimeDivisors(factorial);
largestPower(primes, n);
}
public static void largestPower(int[] primes, int n) {
System.out.println("Prime divisor\tLargest Power");
int largestPower = 0;
for (int i = 0; i < primes.length; i ) {
if (primes[i] == 0) {
break;
}
int primeNum = primes[i];
System.out.print("\t" primeNum);
int hold = n;
while (hold > 0) {
hold /= primeNum;
largestPower = hold;
}
System.out.print("\t\t\t\t" largestPower "\n");
largestPower = 0;
}
}
public static int[] findPrimeDivisors(int factorial) {
int[] primes = new int[1000000];
int index = 0;
System.out.print("Prime Divisors of " factorial " = ");
for (int i = 2; i < factorial; i ) {
while (factorial % i == 0) {
primes[index] = i;
factorial /= i;
}
index ;
}
if(factorial > 2){
primes[index-1] = factorial;
}
for(int i = 0; i < primes.length; i ){
if(primes[i 1] == 0){
System.out.print(primes[i]);
break;
} else {
System.out.print(primes[i] ", ");
}
}
System.out.println();
return primes;
}
}
.data
primeArray: .space 120
prompt: .asciiz "Enter n: "
prompt2: .asciiz "Prime Divisor\tLarges Power"
prompt3: .asciiz "Prime Divisors of "
comma: .asciiz ", "
equals: .asciiz " = "
period: .asciiz ".\n"
exclamation: .asciiz "! = "
tab: .asciiz "\t"
tabs: .asciiz "\t\t\t\t"
newLine: .asciiz "\n"
input_number: .space 32 #Space for user input
.text
.globl main
main:
#Print the prompt
li $v0, 4
la $a0, prompt #Address of prompt
syscall
#User Input
li $v0, 5
syscall
#Store user input into $t0
move $t0, $v0
li $t1, 0 #int i = 1
li $t2, 1 #factorial = 1
jal calculateFactorial
#print user input
li $v0, 1
move $a0, $t0
syscall
#print exclamation and equals
li $v0, 4
la $a0, exclamation
syscall
#print factorial value
li $v0, 1
move $a0, $t2
syscall
#print period
li $v0, 4
la $a0, period
syscall
jal findPrimeDivisors
#print factorial value
li $v0, 1
move $a0, $t2
syscall
#exit program
li $v0, 10
syscall
findPrimeDivisors:
#Print prompt3
li $v0, 4
la $a0, prompt3
syscall
#print factorial value
li $v0, 1
move $a0, $t2
syscall
#Print equals
li $v0, 4
la $a0, equals
syscall
addi $t3, $zero, 0 #Array index = 0
li $t1, 2 #Index I=2
la $s1, primeArray
jal findPrimes
#exit program
li $v0, 10
syscall
#input={$t0} i={$t1}, factorial={$t2}, arrayIndex={$t3}
findPrimes: #outer loop
bgt $t1, $t2 exitLoop
sw $ra, ($sp)
jal innerLoop #innerLoop
lw $ra, ($sp)
addi $t1, $t1, 2 #increment outer loop by 2
addi $t3, $t3, 4 #increment array index in outside loop
j findPrimes
#remainder = ${t4}
innerLoop:
bne $t4, 0, exitLoop #Break if remainder is not equal
sw $t1, primeArray($t3) #Store value of I into array
div $t2, $t2, $t1 #Factorial = Factorial / I
mfhi $t4
j innerLoop
#input={$t0} i={$t1}, factorial={$t2}
calculateFactorial:
beq $t1, $t0, exitLoop
addi $t1, $t1, 1
mul $t2, $t1, $t2
j calculateFactorial
exitLoop:
jr $ra
對于為什么我無法訪問超過 0 的任何索引的任何幫助,我們將不勝感激。
uj5u.com熱心網友回復:
你永遠不會初始化$t4. 因此,第一次bne $t4, 0, exitLoop跌落時,因為$t4被模擬器初始化為零。此后,它被“初始化”為它所采用的最后一個值,該值故意為非零值,因為這是內部回圈退出的唯一方式。
該內部回圈也不會修改$t3,因此如果它出現多個值,它將把它們全部存盤到同一個地方。
從根本上說,您犯了一個錯誤,即您可能擁有可以作業的高級語言代碼,但在翻譯成匯編的程序中卻選擇了偏離該代碼。這始終是一個容易出錯的嘗試。如果您想進行更改(例如改進或優化),請先在您的高級代碼或偽代碼中進行更改,并對其進行測驗以確保其正常作業。然后忠實地將偽代碼轉錄為匯編。
在程式集中,您引入了一個附加函式,并將偽代碼回圈的部分內容移到了這些新函式中,同時將同一回圈的其他部分留在了外面。這不是基于邏輯等價的轉換。因此,沒有理由期望匯編代碼與偽/Java 代碼一樣作業。雖然您可能認為引入較小的函式來完成部分作業是一種邏輯轉換,但您錯誤地將主回圈的作業分配給了新函式及其呼叫者。
您有許多違反呼叫約定的行為,但如果它以其他方式起作用,那對您來說可能不是問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/459718.html
上一篇:RISC-V遞回函式除錯
