Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MIPS-存储整数,对其进行排列,然后将整数添加到总和中_Arrays_Sorting_Mips - Fatal编程技术网

Arrays MIPS-存储整数,对其进行排列,然后将整数添加到总和中

Arrays MIPS-存储整数,对其进行排列,然后将整数添加到总和中,arrays,sorting,mips,Arrays,Sorting,Mips,因此,任务是制作一个“计算器”,可以将10个输入存储到一个数组中,从最小值到最大值排序,然后将它们全部相加,但无论我如何尝试,输出都不会打印出数字和总和。我不确定我哪里出了问题,所以如果有人能看一下,我将不胜感激 .data array: .space 40 #space for array msg1: .asciiz "Welcome to sorting calculator!\n" msg2: .asciiz &q

因此,任务是制作一个“计算器”,可以将10个输入存储到一个数组中,从最小值到最大值排序,然后将它们全部相加,但无论我如何尝试,输出都不会打印出数字和总和。我不确定我哪里出了问题,所以如果有人能看一下,我将不胜感激

        .data 
array:  .space 40               #space for array
msg1:   .asciiz "Welcome to sorting calculator!\n"
msg2:   .asciiz "Please enter 10 random numbers:\n" 
msg3:   .asciiz "Sorting your inputs...\n" 
msg4:   .asciiz "Numbers in ascending order\n"
msg5:   .asciiz "Total sum of your input:"

    .text
    .globl main
main:
    #Print string msg1 
    li  $v0,4               # print_string syscall code = 4
    la  $a0, msg1           # load the address of msg1
    syscall 

    #Print string msg2 
    li  $v0,4               # print_string syscall code = 4
    la  $a0, msg2           # load the address of msg2
    syscall     

    li  $t0, 0              #counter for i 

loop1:                      #First loop
    beq $t0, 10, sort           #end loop when equal to 10
    li  $v0, 5              #get input of integer from user 
    syscall         
    sw  $v0, array($t1)         #Store the result in array
    addi    $t0, $t0, 1         #++i
    j loop1         

sort: 
    #Print string msg3 
    li  $v0,4               # print_string syscall code = 4
    la  $a0, msg3           # load the address of msg3
    syscall

    li  $t0, 0              #counter for i 
            
loop2:                      #for(int i = 0; i < 10;i++)
    li  $t1, 1              #counter for k
    beq     $t0, 10, end_loop2      #end loop when equal to 10

loop3:                      #for(k=i+1; k<11; k++)
    beq     $t1, 11, end_loop3      #end loop when equal to 11 (10+1)
    lb  $t6, array($t0)         #load numbers[i] into t6
    lb  $t7, array($t1)         #load numbers[k] into t7
    bgt     $t6,$t7,if          #jump to if when $t6>$t7
    addi    $t1, $t1, 1         #increment k by 1
    j   loop3               #jump back to loop3

if:                     
    lb  $t2, array($t0)         #store numbers[i]
    lb  $t3, array($t1)         #store numbers[k]
    sb  $t3, array($t0)         #numbers[i] = numbers[k]
    sb  $t2, array($t1)         #numbers[k] = temp
    j   loop3               #jump back to loop3

end_loop3:
    addi    $t0, $t0, 1         #increment i by 1

end_loop2:
    #Print string msg4 
    li  $v0,4               # print_string syscall code = 4
    la  $a0, msg4           # load the address of msg4
    syscall 
    
    li $t0,0                #initialize i
loop4:
    beq $t0, 10, sec5           #end loop when equal to 10
    lb  $t5, array($t0)         #load numbers[i]
    li  $v0,1               #print_integer syscall code = 1 
    addi    $a0, $5,0       
    addi    $t0, $t0, 1         #increment t0 by 1
    j   loop4

sec5:
    #Print string msg5 
    li  $v0,4               # print_string syscall code = 4
    la  $a0, msg5           # load the address of msg5
    syscall 
    li  $t0, 0              #counter for i 
    
loopsum:                    #loop to calculate sum
    beq $t0, 10, printsum       #end loop when equal to 10
    lb  $t8, array($t0)         #load numbers[i]
    add     $s7, $s7, $t8           #sum+=numbers[i]
    addi    $t0, $t0, 1         #increment t0 by 1
    j   loopsum
    
printsum:
    li  $v0,1               # print_integer syscall code = 1 
    addi    $a0, $t4,0
    syscall 

end:
    li $v0, 10
    syscall
.data
数组:。空间40#用于数组的空间
msg1:.asciiz“欢迎使用排序计算器!\n”
msg2:.asciiz“请输入10个随机数:\n”
msg3:.asciiz“对输入进行排序…\n”
msg4:.asciiz“升序数字\n”
msg5:.asciiz“您输入的总和:”
.文本
格洛博梅因酒店
主要内容:
#打印字符串msg1
li$v0,4#打印字符串系统调用代码=4
la$a0,msg1#加载msg1的地址
系统调用
#打印字符串msg2
li$v0,4#打印字符串系统调用代码=4
la$a0,msg2#加载msg2的地址
系统调用
李$t0,0#我的柜台
循环1:#第一个循环
beq$t0,10,排序#当等于10时结束循环
li$v0,5#从用户处获取整数的输入
系统调用
sw$v0,数组($t1)#将结果存储在数组中
addi$t0,$t0,1#++i
j循环1
排序:
#打印字符串msg3
li$v0,4#打印字符串系统调用代码=4
la$a0,msg3#加载msg3的地址
系统调用
李$t0,0#我的柜台
loop2:#for(int i=0;i<10;i++)
李$t1,1#k的柜台
beq$t0,10,结束循环2,当等于10时结束循环
循环3:#for(k=i+1;k$t7
加上$t1,$t1,1#增加k乘以1
j loop3#跳回loop3
如果:
lb$t2,数组($t0)#存储编号[i]
lb$t3,阵列($t1)#门店编号[k]
sb$t3,数组($t0)#数字[i]=数字[k]
sb$t2,数组($t1)#数字[k]=temp
j loop3#跳回loop3
完(三)
加上$t0,$t0,1#增量i乘以1
完(二)
#打印字符串msg4
li$v0,4#打印字符串系统调用代码=4
la$a0,msg4#加载msg4的地址
系统调用
li$t0,0#初始化i
第四条:
beq$t0,10,秒5#等于10时结束循环
lb$t5,阵列($t0)#负载编号[i]
li$v0,1#打印_整数系统调用代码=1
addi$a0,$5,0
增加$t0,$t0,1#增加t0 1
j循环4
第5条:
#打印字符串msg5
li$v0,4#打印字符串系统调用代码=4
la$a0,msg5#加载msg5的地址
系统调用
李$t0,0#我的柜台
loopsum:#循环以计算和
beq$t0,10,打印和#等于10时结束循环
lb$t8,阵列($t0)#加载编号[i]
加上$s7、$s7、$t8#总和+=数字[i]
增加$t0,$t0,1#增加t0 1
j环和
打印金额:
li$v0,1#打印_整数系统调用代码=1
addi$a0,$t4,0
系统调用
完:
李$v0,10
系统调用
基本调试技能 静态调试技巧 用C语言编写伪代码,并确保其正常工作。这听起来像是可行的,但实际上是一种简化——当您第一次学习汇编时,很难发现汇编语言中的算法和设计缺陷。伪代码中的小设计修复也会导致汇编语言中的较大更改

严格地将你的伪代码翻译成汇编。在翻译成汇编的过程中不要“优化”——如果你想优化,就在伪代码中进行优化。例如,这里我要说的是,将算法从使用索引转换成指针(在C中的伪代码中进行翻译,并确保它工作正常),或将while循环更改为repeat,直到

阅读汇编代码并查找缺陷。将寄存器源和目标与伪代码中的变量名进行比较——输入错误非常容易。在头脑中运行部分代码。逐个查找错误;确保循环具有正确的退出条件,并为每次迭代保持正确的状态。与伪代码,并确保每件物品都在正确的位置

动态调试技巧 任何编写汇编语言的人都应该能够单步观察/验证代码的执行

单步执行并验证每条指令是否达到预期效果。大多数指令都有一个主要效果:更改寄存器的值或更改内存的值。所有指令都会告诉处理器下一步要运行的指令。因此,我们需要验证主效果和控制流(下一步是什么指令)。(系统调用可以更改多个内存位置,并提供返回结果。)

当您调试从未测试过的新代码时,请使用尽可能小的输入使调试变得简单。您的代码中可能存在键入错误,例如错误的寄存器源、错误的寄存器目标等

当您开发您的程序时,使用断点跳过您已经知道正在工作的代码,然后单步执行新代码

如果可以,请使用尽可能小的输入,并尝试先调试该输入,然后再将其调大。在这种情况下,您可以将10改为1或2,以便于单步执行并查找最基本的错误


我从一开始就用不到30条指令单步执行后发现了您的第一个bug。您应该能够做到这一点

用户输入的数据存储在数组的第一个字中。由于您既不初始化索引
$t1也不递增索引
,因此所有字都是st