汇编 - 复制字节数组 - MIPS

时间:2014-10-30 23:10:09

标签: arrays assembly duplicates mips spim

首先,我已经检查了相关的问题,但我仍然无法克服这个程序的问题。

我要做的是,基本上,取一个byte []输入并将其复制到另一个byte [],并打印复制数组。我的代码如上:

.data
hello: .asciiz "hello"
inp: .byte 5
dup: .byte 5

.text

main:
    la $a0, inp #get input
    li $v0, 8
    syscall

    la $s0, dup #load arrays on s0 and s1
    la $s1, inp     

    li $t0, 0   #instantiate offsets as 0
    li $t2, 0
Load:
    lb $t1, 0($s1)      #load first byte
    sub $t1, $t1, 48    #test if it is <0   
    bltz, $t1, exit     #if so go to exit
    add $t1, $t1, 48

    sb $t1, 0($s0)      #else save the byte
    add $s1, $s1, 1     #increment offsets
    add $s0, $s0, 1

    j Load

    la $a0, hello
    li $v0, 4
    syscall

exit:
    li $t1, 0
    add $s0, $s0, 1
    sb $t1, 0($s0)  #add null to the end of dup
    la $a0, dup
    li $v0, 4
    syscall

    jr $ra

我是MIPS的新手,我无法识别出问题所在。

顺便说一句,我传递了123作为输入,我得到了无数的1作为输出,这告诉我,我陷入了循环,并且从未在$ s1(inp)中获得任何进一步的结果。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

首先,.byte 5不会为5个字节保留空间,它会声明一个值为5的单个字节。如果你想要5个字节,你应该说.space 5(字节将初始化为价值0 IIRC)。

其次,系统调用8再引用一个参数; $a1 = maximum number of characters to read,您尚未指定。如果缓冲区中有5个字节的空间,则应将$a1设置为5.请注意,“要读取的最大字符数”实际上意味着“要读取的最大字符数包括终止空字符“