mips отпечатва низ от регистъра

$a0 - използва се за предаване на аргументи

$t0 - временен регистър, използван за lw от $a0

Ето моят код

.data
    Str:    .asciiz "please input words "
    input:  .space20

main:
    la $a0, Str   # asciiz loaded at $a0
    li $v0, 4     # print string command
    syscall       # execute print string

    la $a0, input # space for input
    li $a1, 20    # space for input
    li $v0, 8     # read string command
    syscall       # execute reading string

    jal nextStep

nextStep:
    lw $t0, 0($a0) # load first word from address $a0
    move $a0, $t0  # move $t0 -> $a0
    li $v0, 4      # print string command
    syscall        # execute print string

    jr $ra

след изпълнението получавам грешка „извън граница на паметта“ при „преместване на $a0, $t0“.

Пробвах и с

and $a0, $t0, $a0

вместо преместване на ред от горното, но все още получавам същата грешка

Това, което искам да видя, е стойността на $t0 (от [lw $t0, 0($a0)]), отпечатана с помощта на syscall.

Например, при предположението, че потребителят винаги въвежда повече от една дума, моето очакване е, че когато потребителят въведе „1a2b3c4d5e6f“, $t0 ще съдържа „1a2b3c4d“ (една дума), тогава ще отпечата само тези стойности, а не почивка, ако надвишава.

Всяка помощ ще е благодарна.


person dnTosh    schedule 02.10.2015    source източник


Отговори (1)


Сигурни ли сте, че не искате да отпечатате първата дума в обичайния човешки смисъл? Това е частта от низа до първия интервал? Във всеки случай логиката е същата: поставете нулев байт на мястото, където искате да завършите низа, тъй като print string ще стигне само толкова далеч.

Също така имайте предвид, че не трябва да използвате jal за извикване на nextStep, или ако трябва, след това се погрижете правилно за адреса за връщане.

person Jester    schedule 02.10.2015
comment
Да, мисля, че направих този код по-сложен от това, което трябва да бъде, просто исках да видя дали моят $t0 ще бъде същият като 0($a0), когато се отпечата. И разбира се, имам jr $ra в съзнанието си. Благодаря - person dnTosh; 02.10.2015
comment
Обърнете внимание, че въведеното от потребителя е в текстова форма, така че няма да съвпадне числено с това, което виждате в регистъра. напр. ако входът е 0000, тогава това ще се види като 0x30303030 = 808464432 в регистър (0x30 е ascii кодът на 0). - person Jester; 02.10.2015
comment
Да, това е вярно. Това е целта на моята програма всъщност да прави преобразуване на ascii от първата дума на въвеждане от потребителя. Съжалявам, че не съм изяснил въпроса, не разбрах, че ще е необходимо за този код - person dnTosh; 02.10.2015