将字符数组内容复制到另一个数组[MIPS]

时间:2014-10-26 23:53:36

标签: arrays character mips character-arrays

这是课堂上的家庭作业。该项目的目标是在某个枢轴点分割2个数组,并从中创建一个“子”数组。因此,如果你的支点是11,你的两个数组是:

1111111111111111
abcdefghijklmnop

然后子输出将是:

111111111111mnop

现在我在打印孩子方面遇到了麻烦。这是我到目前为止的源代码:

.globl main

.data
parentOne: .space 17
parentTwo: .space 17
split: .word 0
childOne: .space 17
childTwo: .space 17
space: .asciiz "\n"

.text
main:
jal getInputOne
jal getInputTwo
jal getIndex
jal makeChildren
jal printChildOne

j endMain

##############################################################################################################
getInputOne:
li $v0, 8
la $a0, parentOne
li $a1, 17
syscall

addi $v0, $zero, 4  # print_string syscall
la $a0, space       # load address of the string
syscall
jr $ra
##############################################################################################################
getInputTwo:
li $v0, 8
la $a0, parentTwo
li $a1, 17
syscall
addi $v0, $zero, 4  # print_string syscall
la $a0, space       # load address of the string
syscall
jr $ra
##############################################################################################################
getIndex:
li $v0, 5
syscall
sw $v0, split
jr $ra
##############################################################################################################
makeChildren:
la $s0, parentOne
la $s1, parentTwo
la $a0, childOne
la $a1, childTwo

li $s2, 0       #intial counter
li $s3, 17      #end counter
lw $s4, split       #split point

childLoop:
    slt $t1, $s2, $s3
    beq $t1, $0, endChildLoop
    if:
        slt $t1, $s2, $s4   # i<pivot
        beq $t1, $0, else   # not less than pivot
        lb $a0, ($s0)       #load childOne[i] <-- parentOne[i]
        lb $a1, ($s1)       #load childTwo[i] <-- parentTwo[i]
        j endif
    else:
        lb $a0, ($s1)       #load childOne[i] <-- parentTwo[i]
        lb $a1, ($s0)       #load childTwo[i] <-- parentOne[i]
    endif:
    #li $v0, 11     #print character       
    #syscall

    addi $s0, $s0, 1    #increment parent1 array
    addi $s1, $s1, 1    #increment parent2 array
    addi $a0, $a0, 1    #increment child array
    addi $a1, $a1, 1    #increment child2 array
    addi $s2, $s2, 1    #counter++
    j childLoop
endChildLoop:
la $a0, childOne
li $v0, 1
syscall
jr $ra

##############################################################################################################
printChildTwo:
la $a0, childOne
li $v0, 4
syscall
jr $ra

endMain:

我认为发生的事情是没有任何东西实际上被保存到childOne寄存器,但我不确定为什么。我将childOne地址加载到$ a0寄存器,但是一旦程序进入printChildOne函数,就不会打印任何内容。

1 个答案:

答案 0 :(得分:0)

此处的评论与指令的实际内容不符:

lb $a0, ($s0)   #load childOne[i] <-- parentOne[i]

该指令仅为$a0设置新值,它不会向$a0指向的内存位置写入任何内容。

如果您在C中执行此操作:

char *a0 = childOne;
...
a0 = (char*) parentOne[i];

这显然不同于:

*a0 = parentOne[i]; 

你想要的是这样的:

lb $t0, ($s0)       # temp = parentOne[i]
sb $t0, ($a0)       # childOne[i] = temp
# similarly for $a1

您问题中的代码似乎也有拼写错误:

printChildTwo:
la $a0, childOne

我怀疑标签应为printChildOne

相关问题