我有一个问题如下:
给定内存中的一个 32 位有符号整数数组及其一个寄存器中的长度,编写一个 MIPS 程序来计算该数组包含多少个零。假设数组从 Ox12345678 开始,并且数组的长度已经存储在 $1 中。零的个数应该存储在$2中,这个mayor一开始可能不会用零初始化。有关 MIPS 组装说明,请参阅表 1。
这是我自己的想法,但我有一个主要问题:
1)我认为如果我有子例程,我需要使用sw $ra, 4($sp)
andaddi $sp,$sp,-8
和 and从堆栈中推送然后弹出数据sw $fp, 0($sp)
。但是,使用我的程序,我有一个 break 子句,它只在某个条件下移动到子程序(如果某物是 $0)。所以我不jal
给子程序,我beq
给子程序。我怎样才能修改我的代码来做到这一点?
这是我当前的代码:
Add $3, $0, $0 #Set a counter to 0, the start of the array
Lui $4, 0x1234
Ori $4, $4, 0x5678 #Store register $4 to start of the array so you can offset
Add $2, $0, $0 #Sets $2 to $0 which is the total number of zeros
Start_for: Beq $3, $1, end_for #If counter is equal to the array length, go to end
Lw $5, 0x0($4) Load the current value of array into temp register $5
Addi $4, $4, 4 #Increment array pointer to next value
Beq $5, $0, increment #Increment the sum by 1 if the array[i] is zero
Addi $3, $3, 1 #Increment counter by 1
J start_for
increment:
Addi $2, $2, 1 #Increment the number of zeros by 1 and add to sum
Jr $ra
End_for: Lui $8, 0xffff
Ori $8, $8, 0xf004 Load the outtray into $8
Lw $8, 0x0($2) Store the number of zeros in the array to the outtray