MIPS阵列故障 [英] Trouble with MIPS array

查看:125
本文介绍了MIPS阵列故障的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一些将整数和字符串作为输入的代码,将它们存储到数组中,然后按顺序打印它们(int-string,int-string等).当我开始使用该整数时,我最终将为该整数添加一些排序代码.问题是我无法正确执行代码,无法正确输出输出.我假设问题出在数组中,因为我不确定它应该如何工作(MIPS绝对不是我的强项).代码如下:

i'm trying to write some code that take as input integers and strings, stores them into an array and then prints them in order (int-string, int-string etc.). I will eventually add some sorting code for the integer, when i get this to work. The problem is i can't get the code to work right, i can't manage to have the output come out correctly. I'm assuming the problem lies in the array, since i'm not sure how it is supposed to work (MIPS is definitely not my forte). The code is the following:

.data
 array:         .space  400 #array


 in_name:
   .asciiz "\nInsert name: "
 in_date:
   .asciiz "\nInsert date (mmdd): "
 appt:
   .asciiz "\nList: "
 spaz:      .asciiz " "

 .text
 main:      

    la  $s0, array      #load array in s0
    addi    $t0, $zero, 0       #t0=0 counter
    addi    $s1, $zero, 0       #s1=0 array size counter
            j    Input

 Input:
        li  $v0, 4           
    la  $a0, in_date
    syscall             #ask date 
    li  $v0, 5          
    syscall             #read date
    add     $t1, $zero, $t0                #offset in t1
    add     $t1, $t1, $t1           #t1*2
    add     $t1, $t1, $t1           #t1*4
    add     $s2, $t1, $s0           #array with offset in s2
    sw  $v0, 0($s2)     #save date
    addi    $t0, $t0, 1     #t0++
    addi    $s1, $s1, 1     #array size counter +1
    li      $v0, 4
    la      $a0, in_name          
    syscall                         #ask name
        li      $a0, 4                 
    li      $v0, 9
    syscall                         #space for new word (4bytes)
            la      $a0, array
            li      $a1, 4
    li      $v0, 8
    syscall                         #read name
    add     $t1, $zero, $t0                #offset in t1
    add     $t1, $t1, $t1           #t1*2
    add     $t1, $t1, $t1           #t1*4
    add     $s2, $t1, $s0           #array with offset in s2
    sw  $v0, 0($s2)     #save name
    addi    $s1, $s1, 1     #array size counter +1
    addi    $t0, $t0, 1     #t0++
    beq $s1, 10, print          #if array size=10 go to print
    j   Input               #start over until s1=10



  print:
    la  $a0, appt           
    li  $v0, 4          
    syscall             #print list
    addi    $t0, $zero, 0       #t0=0 counter

res:
    add     $t1, $zero, $t0                #offset in t1
    add     $t1, $t1, $t1           #t1*2
    add     $t1, $t1, $t1           #t1*4
    add     $s2, $t1, $s0           #array with offset in s2
    lw  $a0, 0($s2)     #load date
    li  $v0, 1          
    syscall             #print data
    addi    $t0, $t0, 1             #t0++
    la  $a0, spaz               #load space
    li  $v0, 4          
    syscall             #print space
    add     $t1, $zero, $t0                #offset in t1
    add     $t1, $t1, $t1           #t1*2
    add     $t1, $t1, $t1           #t1*4
    add     $s2, $t1, $s0           #array with offset in s2
    lw  $a0, 0($s2)     #load name
    li      $v0, 4
    syscall                         #print name
    addi    $t0, $t0, 1             #t0++
    la      $a0, spaz             
    syscall                         #print space
    addi    $t0, $t0, 1     #t0++ counter
    bne $t0, $s1, res           #start over until t0=s1
    j   end         
 end:
    li  $v0, 10         
    syscall             #the end

取决于我用来测试该程序的程序,会出现错误或程序正确结束,但输出错误(只是一些数字). 有人可以指出我如何纠正它以使其正常工作吗? 谢谢

Depending on which program i use to test it i get an error or the program ends correctly but with a wrong output (just some numbers). Can someone point out to me how should i correct it to make it work properly? Thanks

推荐答案

我对程序做了一些改动.我为数字和字符串创建了2个数组.当我读取日期和名称时,将它们分别保存到num_arraystr_array中.这使处理地址变得更容易,并且以后可能更容易处理.代码中的注释应该会有所帮助.

I changed the program a little. I created 2 arrays for numbers and strings. As I read date and name I save them to num_array and str_array respectively. This makes it easier to deal with addressing, and might be easier for processing later. Comments in the code should be helpful.

.data
    num_array:   .space 400 #array
    str_array:   .space 400
    in_name: .asciiz "\nInsert name: "
    in_date: .asciiz "\nInsert date (mmdd): "
    appt:    .asciiz "\nList: "
    spaz:    .asciiz " "
 .text
 main:      
    la $s0, num_array        #load array in s0
    la $s1, str_array
    addi $t0, $zero, 0       #t0=0 counter
    addi $s2, $zero, 0       #s1=0 array size counter
    j    Input

 Input:
    # prompt for date
    li  $v0, 4           
    la  $a0, in_date
    syscall

    # read date
    li  $v0, 5          
    syscall

    # store date in the num_array
    sw $v0, 0($s0)

    # increment counter and move to next position in the array
    addi $t0, $t0, 1
    addi $s2, $s2, 1
    addi $s0, $s0, 4

    # prompt for name
    li      $v0, 4
    la      $a0, in_name          
    syscall                         #ask name

    # store name (max 4 bytes) to str_array ($s1)  
    move $a0, $s1
    li      $a1, 4
    li      $v0, 8
    syscall                         #read name

    # move to the beginnig of next string in $s1
    # increment by 4 because length of each input word is 4
    addi $s1, $s1, 4

    beq $s2, 10, print          #if array size=10 go to print
    j   Input               #start over until s1=10



print:
    # print "List:"
    la  $a0, appt           
    li  $v0, 4          
    syscall             #print list

    addi    $t0, $zero, 0       #t0=0 counter    
    la $s0, num_array # address of num_array
    la $s1, str_array # address of str_array
res:
    # get number from num_array and print it
    lw $a0, 0($s0)
    li $v0, 1
    syscall

    # move to the next element, increment by 4 because numbers take 1 word = 4 bytes
    addi $s0, $s0, 4 

    # get string from str_array and print it
    la $a0, 0($s1)
    li $v0, 4
    syscall

    # print space
    la $a0, 32
    li $v0, 11
    syscall

    # move to the next element, increment by 4 because strs have 4 bytes length (in your case)
    addi $s1, $s1, 4

    # increment loop counter
    addi $t0, $t0, 1
    blt $t0, $s2, res # $s2 is size of the array
end:
    li  $v0, 10         
    syscall             #the end

以下是输出:

Insert date (mmdd): 1201

Insert name: aaa
Insert date (mmdd): 1202

Insert name: bbb
Insert date (mmdd): 1203

Insert name: ccc
Insert date (mmdd): 1204

Insert name: ddd
Insert date (mmdd): 1205

Insert name: eee
Insert date (mmdd): 1206

Insert name: fff
Insert date (mmdd): 1207

Insert name: ggg
Insert date (mmdd): 1208

Insert name: hhh
Insert date (mmdd): 1209

Insert name: iii
Insert date (mmdd): 1210

Insert name: jjj
List: 1201aaa 1202bbb 1203ccc 1204ddd 1205eee 1206fff 1207ggg 1208hhh 1209iii 1210jjj 
-- program is finished running --

这篇关于MIPS阵列故障的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆