Язык ассемблера MIPS: экзамен 1, экзамен 2 и финальный экзамен

# Prompt user to enter the integer scores for Exams 1, 2, and Final,
# read the scores,
# compute the weighted average score (using the following formula), and
# display a labeled output about the weighted average score.
# Formula: avg = (128/637)*e1Score + (307/1024)*e2Score + (feScore/2)
#   avgScore=128*(1/637)*e1Score+307*(1/1024)*e2Score+(1/2)*feScore
############################ data segment ################################
.data
scorePrompt0:       .asciiz "Enter integer score for Exam 1: "
scorePrompt1:       .asciiz "Enter integer score for Exam 2: "
scorePrompt2:       .asciiz "Enter integer score for Final Exam: "
avgMsg:         .asciiz "The weighted average is:  "
############################ code segment ################################
            .text
            .globl main
main:
            ################################################
            #   Get the scores, store in $t0, $t1, $t2
            ################################################

            li $v0, 4
            la $a0, scorePrompt0    # prompt for a score
            syscall
            li $v0, 5
            syscall         # read an integer
            move $t0, $v0

            li $v0, 4
            la $a0, scorePrompt1    # prompt for a score
            syscall
            li $v0, 5
            syscall         # read an integer
            move $t1, $v0

            li $v0, 4
            la $a0, scorePrompt2    # prompt for a score
            syscall
            li $v0, 5
            syscall         # read an integer
            move $t2, $v0


            ################################################
            #   Compute weighted average, store in $t4
            ################################################

            # multiply e1Score by 128
            sll $t0, $t0, 7

            # divide e2Score by 1024
            sra $t1, $t1, 10

            # divide feScore by 2
            sra $t2, $t2, 1

            # divide e1score by 637
            li $t5, 637         
            div $t0, $t5             
            mfhi $t0

            # multiply e2score by 307
            li $t5, 307         
            mul $t1, $t1, $t5

            li $t4, 0     # ensure $t4 is 0
            add $t4, $t4, $t0
            add $t4, $t4, $t1
            add $t4, $t4, $t2

            li $v0, 4
            la $a0, avgMsg
            syscall
            li $v0, 1
            move $a0, $t4
            syscall

            li $v0, 10      # graceful exit service
            syscall

Приведенный выше код является примером, но мой вопрос заключается в том, как мне изменить этот код, чтобы (205/1024)*e1Score + #(256/854)*e2Score + (feScore/2)? Предложите пользователю ввести целочисленные баллы для экзамена 1, экзамена 2 и финального экзамена, прочитайте баллы, вычислите средневзвешенный балл (используя следующую формулу) и отобразите помеченный вывод о средневзвешенном балле.

1 ответ

Подпрограмма помогает упростить организацию. Каждый счет рассчитывается одинаково (т.е. (x/y)*score который переписан как (score*x)/y,

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

Примечание: как я уже упоминал в своем главном комментарии, мы хотим mflo [частное] против mfhi [Остаток].

Вот переработанный код, используя ваши исходные коэффициенты. Теперь должно быть легко подключить новые [прошу прощения за беспричинную очистку стиля]:

# Prompt user to enter the integer scores for Exams 1, 2, and Final,
# read the scores,
# compute the weighted average score (using the following formula), and
# display a labeled output about the weighted average score.
# Formula: avg = (128/637)*e1Score + (307/1024)*e2Score + (feScore/2)
#   avgScore=128*(1/637)*e1Score+307*(1/1024)*e2Score+(1/2)*feScore
############################ data segment ################################
    .data
scorePrompt0:   .asciiz "Enter integer score for Exam 1: "
scorePrompt1:   .asciiz "Enter integer score for Exam 2: "
scorePrompt2:   .asciiz "Enter integer score for Final Exam: "
avgMsg:     .asciiz     "The weighted average is:  "
############################ code segment ################################
    .text
    .globl  main

main:
    ################################################
    #   Get the scores, store in $t0, $t1, $t2
    ################################################

    li      $t4,0                   # zero the sum

    la      $a0,scorePrompt0
    li      $a1,128
    li      $a2,637
    jal     getnum

    la      $a0,scorePrompt1
    li      $a1,307
    li      $a2,1024
    jal     getnum

    la      $a0,scorePrompt2
    li      $a1,1
    li      $a2,2
    jal     getnum

    li      $v0,4
    la      $a0,avgMsg
    syscall

    li      $v0,1
    move    $a0,$t4
    syscall

    li      $v0,10                  # graceful exit service
    syscall

# getnum -- prompt user for number and compute weighted average
#
# RETURNS:
#   v0 -- weighted score value
#   t4 -- sum of terms so var
#
# arguments:
#   a0 -- prompt string
#   a1 -- scale factor (multiplier)
#   a2 -- scale factor (divider)
getnum:
    li      $v0,4                   # syscall to print string
    syscall

    li      $v0,5                   # syscall to read integer
    syscall

    mul     $v0,$v0,$a1             # multiply by scale (e.g. 128)
    div     $v0,$a2                 # divide by scale (e.g. 637)
    mflo    $v0                     # get quotient

    add     $t4,$t4,$v0             # add to sum

    jr      $ra                     # return
Другие вопросы по тегам