**已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
3天前关闭。
Improve this question
我需要把一段代码从java转换成assembly,但是它只打印了第一条消息.但是最后两条消息dosent既不打印消息也不打印结果的数字. java和assembly中的两段代码是我写的如下:
java中的代码:
/**
* this program count how many 10s can be in a givin number the return the extra or the remain that less than 10
*/
Scanner input=new Scanner(System.in);
System.out.println("enter num: ");//print input message
int num=input.nextInt();// user input
int numOf10=0;//counter
while(num>9){ //start of while loop
num-=10;//subtruct 10 from the input number
numOf10++;//add one to the counter
}
System.out.println("number of 10 is: "+numOf10);//print message contain
System.out.println("the remain: "+num);//print message contain
///////////////////////
.data
EnterMessage: .asciiz"Enter the number:\n "
ResultMessage: .asciiz"number of 10 is:\n"
remainMessage: .asciiz"the remain:\n "
.text
main:
#ask user to enter input
li $v0,4
la $a0,EnterMessage
syscall
#read user input
li $v0,5
syscall
#save input
move $t0,$v0
#creat variables
#$t2=9
addi $t2,$zero,9
#counter=$t3=0
addi $t3,$zero,0
#jal loop
#while loop
loop:
ble $t1,$t2,exit
subi $t0,$t0,10
addi $t3,$t3,1
j loop
print:
#print ResultMessage num
li $v0,1
move $a0,$t3
syscall
#print ResultMessage
li $v0,4
la $a0,ResultMessage
syscall
#print remainMessage num
li $v0,1
move $a0,$t0
syscall
#print remainMessage
li $v0,4
la $a0,remainMessage
syscall
#close the program
exit:
#end
li $v0,10
syscall
1条答案
按热度按时间f4t66c6m1#
你的问题就在这里:
这里有两个问题。首先,
exit
导致:所以你什么都没做就跳到了最后。
其次,您选择了
$t1
作为比较寄存器之一,但您从未设置过它,因此它的值目前未知(很可能是内核或操作系统或其他什么东西在main
之前将所有寄存器清零,但假设这一点并不好)。让我们想想他们问了什么:
当把一个高级语言翻译成汇编语言时,我们不需要按照源语言编写的方式来做所有的事情。对于
goto
,我们可以这样想:在大多数情况下,你的想法是正确的。MIPS的好处是分支语法不像其他汇编语言那样迟钝,因为你不必记住进位清除是指小于还是大于等等。