Копирование содержимого массива символов в другой массив [MIPS]

это домашнее задание от класса. Цель проекта состоит в том, чтобы разделить 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, ничего не печатается.


person Ybarra    schedule 26.10.2014    source источник


Ответы (1)


Ваш комментарий здесь не соответствует тому, что на самом деле делает инструкция:

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.

person Michael    schedule 27.10.2014
comment
Спасибо за ответ. Я понял это до того, как вы ответили, но это правильно! - person Ybarra; 29.10.2014