Копиране на съдържанието на масив от знаци в друг масив [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