assembly 简单while循环的从java到MIPS程序集[已关闭]

ee7vknir  于 2023-01-30  发布在  Java
关注(0)|答案(1)|浏览(122)

**已关闭。**此问题需要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
f4t66c6m

f4t66c6m1#

你的问题就在这里:

ble $t1,$t2,exit

这里有两个问题。首先,exit导致:

#close the program
exit:

#end 
li $v0,10
syscall

所以你什么都没做就跳到了最后。
其次,您选择了$t1作为比较寄存器之一,但您从未设置过它,因此它的值目前未知(很可能是内核或操作系统或其他什么东西在main之前将所有寄存器清零,但假设这一点并不好)。
让我们想想他们问了什么:

while(num>9){ //start of while loop
        num-=10;//subtruct 10 from the input number
        numOf10++;//add one to the counter 
       
    }

当把一个高级语言翻译成汇编语言时,我们不需要按照源语言编写的方式来做所有的事情。对于goto,我们可以这样想:

loop_begin:
   if (num <= 9) goto loop_exit;
   num -= 10;
   numOf10++;
   goto loop_begin;
loop_exit:

在大多数情况下,你的想法是正确的。MIPS的好处是分支语法不像其他汇编语言那样迟钝,因为你不必记住进位清除是指小于还是大于等等。

loop:
ble $t0,$t2,print  # if $t0 (num) > 9 goto print
subi $t0,$t0,10    # num = num - 10
addi $t3,$t3,1     # counter++
j loop             # goto loop

相关问题