2017-01-09 3 views
1

Так что в настоящее время я хочу рассчитать время, затраченное на расчет. Я использую 30 в $ v0, но проблема заключается в том, что каждый раз печатается время, отображается огромное количество, которое не связано. так как я могу исправить эту проблему? любая помощь ценитсяКак получить время для расчета с использованием языка ассемблера MIPS?

Пример кода

.data 
inputNumber: .asciiz "Input an integr: " 
newLine: .asciiz "\n" 
done1:  .asciiz "loop completed\n" 
.text 
main: 
#print inputNmber string 
li $v0, 4 
la $a0, inputNumber 
syscall 

#read integer 
li $v0, 5 
syscall 

#move int to another register 
move $t0, $v0 

# get starting time 
li $v0, 30 
syscall 

# store it in another place 
move $a0, $v0 

#while loop counter 
addi $t1, $zero, 1 

# while loop 
while: 
    bgt $t1, $t0, done 
    #print inputNmber int 
    li $v0, 1 
    move $a0, $t0 
    syscall 

    #print new line 
    li $v0, 4 
    la $a0, newLine 
    syscall 

    addi $t1, $t1, 1 

    j while 


#Exit the program 
li $v0, 10 
syscall 

done: 
    # get finishing time 
    li $v0, 30 
    syscall 

    # store it in another place 
    move $a1, $v0 

    #printing done1 
    li $v0, 4 
    la $a0, done1 
    syscall 

    # Subtract time values 
    sub $t2, $a1, $a0 

    #print time taken 
    li $v0, 1 
    move $a0, $t2 
    syscall 

    # exit program 
    li $v0, 10 
    syscall 

ответ

1

Прежде всего, после возвращения из syscall, который дает вам системное время, вы сохраняете результат в $a0. Однако, внутри цикла, вы удалите значение $a0:

#print inputNmber int 
li $v0, 1 
move $a0, $t0 

Кроме того, глядя на таблицу системных вызовов, вы можете увидеть, что этот системный вызов поместить значение времени, как это:

$a0 = low order 32 bits of system time 
$a1 = high order 32 bits of system time 

И не в $v0. Таким образом, вы должны адаптировать свои move инструкции и ваше вычитание принимая это во внимание

ПРИМЕЧАНИЕ: Если вы используете эмулятор, это sycall является НЕ совместимы с SPIM, только MARS

Источник для системных вызовов: https://courses.missouristate.edu/KenVollmar/mars/Help/SyscallHelp.html

+0

Вы можете объяснить часть «$ a0 = low order ...»? По-видимому, нет никаких объяснений этому в справочном листе. Спасибо – aspire29

+0

Временная метка, возвращаемая syscall, представляет собой 64-битное значение, так как регистры MIPS имеют ширину всего 32 бита, вам нужно 2 для хранения текущего времени (возвращаемое значение равно миллисекундам). Приведем пример: Текущее время с эпохи - 1484002833406 миллисекунд, то есть в шестнадцатеричном формате 0x159857633FE. Итак, после syscall '$ a0' будет содержать 0x00000159 (4 байта | 32 разряда высокого порядка), а' $ a1' будет содержать 0x857633FE (младшие разряды 32 бит) – Omar

+0

, если возможно, вы можете показать пример того, как получить время? Я все еще не могу заставить код работать. благодаря – aspire29