Не удалось получить подстроку ввода в MIPS - PullRequest
0 голосов
/ 07 марта 2019

Я действительно новичок в ассемблерном коде и не уверен, что пошло не так с моим кодом ... Мне разрешено использовать только slt, beq, bne для сравнения и lw, sw для ввода / вывода.

Эта программа должна принимать два целых числа в качестве индексов и экономить в $ 1, $ 2;где значения должны быть 0 <= $ 1 <= $ 2 <= длина строки.Индекс строки начинается с 0, если два входа 2,4, а подстрока - от индекса 2 до 3. В конце подстроки добавляется символ новой строки.$ 3 = 0, если индексы действительны, 1, если недействительны. </p>

Мой код работает, только когда $ 2 <$ 1 (неверный случай).В любом другом случае произойдет сбой с ошибкой «Внутренняя ошибка эмулятора MIPS. Mips.MachineException $ OutOfBounds». </p>

Ниже приведен мой код, пожалуйста, помогите ... Я понятия не имею, что пошло не так ....

; $1 - starting index position for substring
; $2 - ending index position for substring 
; $3 - 1 when index positions invalid; 0 when index positions valid
; $4 - address of standard input
; $5 - address of standard output 
; $6 - used for comparison
; $7 - current address of character read
; $8 - New line character
; $9 - index counter
; $10 - check if substring is there
; $11 - temp

lis $4  
.word 0xffff0004
lis $5
.word 0xffff000c
lis $8
.word 0xa       ;$8=Newline character ASCII code
addi $9, $0, -1 ;initiate $9 value: $9=-1
addi $10, $0, 0 ;initiate $10=0
addi $6, $0, 1  ;$6 is 1
slt $3, $2, $1  ;if $2<$1, $3=1
beq $6, $3, end ;if $3=1, invalid index, go to end by printing newline
slt $3, $2, $0  ;if $2<0, $3=1 (0>$2>$1)
beq $6, $3, end
slt $3, $1, $0  ;if $1<0, $3=1; otherwise 0<$1<$2
beq $6, $3, end

loop:   lw $7, 0($4)    ;retrieve first element of input string
        addi $9, $9, 1  ;$9 increments index count by 1 (so start with index=0)
        slt $3, $9, $1  ;$3=1 if yet to achieve starting index
        bne $6, $3, print   ;if at starting index, go to print
        addi $4, $4, 4  ;if yet to achieve starting index, then move to next element
        beq $0, $0, loop    ;keep looping

print:  addi $10, $0, 2 ;$10=2 if need to add newline
        slt $3, $9, $2  ;$3=1 if before hitting last index
        beq $0, $3, end ;if $3=0, it means hit the last index, so go to end
        sw $7, 0($5)    ;print the desired character
        addi $4, $4, 4
        addi $5, $5, 4  ;move to next space for output
        beq $0, $0, loop

end:    addi $11, $0, 2 ;$11 is 2
        bne $11, $10, end2  ;$10=$11=2, then substring exists, add new line char
        addi $5, $5, 4
        sw $8, 0($5)  

end2:   jr $31
...