Mips Assembly Нахождение максимального значения созданного пользователем массива - PullRequest
1 голос
/ 15 февраля 2020

Я пару недель учусь на уроке по организации и архитектуре компьютеров CS-250, и в настоящее время мы изучаем язык сборки MIPS. Я пытаюсь взять введенный пользователем массив и найти максимальное число в этом массиве. Я не совсем понимаю, как использовать ключевое слово slt в этом контексте, потому что это то, что наш профессор хотел бы, чтобы мы делали.

Вот мой текущий код. Если у вас есть какие-либо предложения, я очень открыт для идей. Единственное пустое место, которое у меня сейчас есть, - это функция для поиска максимального значения массива.

.globl main

.data
array: .space 2000
prompt: .asciiz "Enter the number of integers you would like to input: "
input: .asciiz "Enter an intger: "
Max: .asciiz "Maxiumum Value is: "

.text

main:
    #Loading array into $t5
    la $t5, array

    li $s0, 0

    li $v0, 4
    la $a0, prompt
    syscall

    li $v0, 5
    syscall
    move $s1, $v0

Loop: 
    #Asking the user for input
    li $v0, 4
    la $a0, input
    syscall

    #Storing user input in array address in $t5
    li $v0, 5
    syscall
    sw $v0, 0($t5)

    #Counting iterations for the loop as well as the array address
    addi $s0, $s0, 1
    addi $t5, $t5, 4

    #Loop Exit
    beq $s0, $s1, Maximum
    j Loop

 Maximum: 


 Exit: 
    li $v0, 10
    syscall

1 Ответ

1 голос
/ 18 февраля 2020

Это должно сделать работу:

.globl main

.data
array: .space 2000
prompt: .asciiz "Enter the number of integers you would like to input: "
input: .asciiz "Enter an intger: "
Max: .asciiz "Maxiumum Value is: "

.text
main:
    #Loading array into $t5
    la $t5, array

    li $s0, 0

    li $v0, 4
    la $a0, prompt
    syscall

    li $v0, 5
    syscall
    move $s1, $v0

Loop: 
    #Asking the user for input
    li $v0, 4
    la $a0, input
    syscall

    #Storing user input in array address in $t5
    li $v0, 5
    syscall
    sw $v0, 0($t5)

    #Counting iterations for the loop as well as the array address
    addi $s0, $s0, 1
    addi $t5, $t5, 4

    #Loop Exit
    beq $s0, $s1, Maximum
    j Loop

Maximum:
    la $t5, array # load the array start address
    lw $t2, 0($t5) # max = first element
    li $s0, 0 # i = 0

Max_loop:
    lw $t3, 0($t5) # temp = actual array element
    slt $t4, $t2, $t3 # max < temp ?
    bne $t4, 1, Else # jump to else branch if it condition is false
    move $t2, $t3 # condition was true let max = temp

Else:
    addi $s0, $s0, 1 # i++
    addi $t5, $t5, 4 # array += 4
    beq $s0, $s1, Exit # i < num
    j Max_loop

Exit: 
    li $v0, 10
    syscall

Кажется, что все работает правильно с симулятором MARS 4.5 MIPS. Результат в $t2 на выходе. Вы можете легко добавить код для печати его значения, если хотите.

slt $t1, $t2, $t3 в основном сделает это в C подобном коде:

if ($t2 < $t3)
  $t1 = 1
else
  $t1 = 0

Итак, основываясь на нем, вы может добиться условного ветвления с использованием этого результата.

Обратите внимание, что приведенный мною код необязательно является оптимальным и может быть проблематичным c, если пользовательский ввод меньше 1, но это все равно следует проверить на этапе ввода .

...