2014-10-30 4 views
0

Прежде всего, я уже проверил связанные с этим вопросы, но я все еще не могу решить проблему, связанную с этой программой.Сборка - Копирование массива байтов - MIPS

То, что я пытаюсь сделать, в основном, принимает байтовый вход [] и дублирует его на другой байт [] и печатает дублирующий массив. Мой код, как описано выше:

.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 в качестве ввода, и я получаю бесчисленное количество 1s в качестве вывода, что говорит мне, что я застрял в цикле и больше не получаю в $ s1 (inp).

ответ

1

Есть несколько проблем с кодом:

Во-первых, .byte 5 не резервирует пространство для 5 байт, он объявляет один байт со значением 5. Если вы хотите 5 байт вы должны сказать .space 5 (байты будут инициализированы значением 0 IIRC).

Во-вторых, syscall 8 принимает еще один аргумент; $a1 = maximum number of characters to read, который вы не указали. Если у вас есть место для 5 байтов в вашем буфере, вы должны установить $a1 - 5. Обратите внимание, что «Максимальное количество символов для чтения» фактически означает «Максимальное количество символов для чтения, включая конечный нуль-символ».

+0

спасибо за ответ, я позже понял это, но мне было бы легче проверить ответ здесь, я думаю :) –

Смежные вопросы