Проверка количества нулей в массиве MIPS
У меня есть вопрос следующим образом:
Учитывая массив 32-битных целых чисел со знаком в памяти и его длину в одном из регистров, напишите программу MIPS, которая подсчитывает, сколько нулей содержит этот массив. Предположим, что массив начинается с Ox12345678, а длина массива уже хранится в $1. Количество нулей должно быть сохранено в $2, который мэр не может быть инициализирован с нуля в начале. Обратитесь к Таблице 1 за инструкциями по сборке MIPS.
Вот куда я попал в своей голове, но у меня есть один главный вопрос:
1) Я думаю, что если у меня есть подпрограммы, мне нужно вытолкнуть, а затем вытолкнуть данные из стека с помощью sw $ra, 4($sp)
а также addi $sp,$sp,-8
а также sw $fp, 0($sp)
, Однако, используя мою программу, у меня есть предложение break, которое перемещается в подпрограмму только по условию (если что-то стоит $0). Так что я не jal
к подпрограмме я beq
в подпрограмму. Как я могу изменить свой код для этого?
Вот мой текущий код:
Add $3, $0, $0 #Set a counter to 0, the start of the array
Lui $4, 0x1234
Ori $4, $4, 0x5678 #Store register $4 to start of the array so you can offset
Add $2, $0, $0 #Sets $2 to $0 which is the total number of zeros
Start_for: Beq $3, $1, end_for #If counter is equal to the array length, go to end
Lw $5, 0x0($4) Load the current value of array into temp register $5
Addi $4, $4, 4 #Increment array pointer to next value
Beq $5, $0, increment #Increment the sum by 1 if the array[i] is zero
Addi $3, $3, 1 #Increment counter by 1
J start_for
increment:
Addi $2, $2, 1 #Increment the number of zeros by 1 and add to sum
Jr $ra
End_for: Lui $8, 0xffff
Ori $8, $8, 0xf004 Load the outtray into $8
Lw $8, 0x0($2) Store the number of zeros in the array to the outtray