Я действительно новичок в ассемблерном коде и не уверен, что пошло не так с моим кодом ... Мне разрешено использовать только 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