2012-04-19 5 views
1
  .text 
     main: la $a0, A #loads address of A into $a0 
      li $t0, 1 #loads 1 into $t0 
      sw $t0, ($a0) #stores word from $a0 into $t0 
      li $t0, 2 #loads 2 into $t0 
      sw $t0, 4($a0) 
      li $t0, 3 
      sw $t0, 8($a0) 
      li $t0, 4 
      sw $t0, 12($a0) 

      la $a1, A 
      li $v0, 1 
      lw $a0, ($a1) 
      syscall 
      lw $a0, 4($a1) 
      syscall 
      lw $a0, 8($a1) 
      syscall 
      lw $a0, 12($a1) 
      syscall 
      la $a0, tab 
      li $v0, 4 
      syscall  
      li $v0, 10 
      syscall  

      .data 
     A: .space 16 #array size 16 
     tab: .asciiz "\t" #makes line indentation 
#stores 1 - 4 into $t0 

Из чего я могу видеть, он загружает адрес A в a0, затем он загружает '1' в $ t0, а затем переопределяет?!? $ t0, сохраняя в нем массив., затем загружает 2 в $ t0, тогда я не уверен, что должен делать 4 (ничего не делает, насколько я могу видеть, а затем загружает $ t0 в 3, то же, что и «4», не вижу, что делает 8, затем загружает 4 в $ t0, затем делает что-то с 12, а затем загружает адрес A в $ a1 и печатает его?!? I ' м, полностью потерянный в остальной части программы. Программа правильная (загружает «1234»), но я должен изучить MIPS, понимая, что каждая программа дает лекторы класса. Это не домашнее задание или что-то еще, просто обучение как работают программы MIPS.MIPS - Редакция Что делает эта программа на самом деле?

ответ

2

Программа сначала хранит константы 1, 2, 3, 4, начиная с адреса A, а затем просто печатает содержимое этих четырех слов.

Инструкция sw reg1, offset(reg2) хранит содержимое регистра reg1 в адресе, указанном reg2, плюс указанное дополнительное смещение.

Так, в первом примере sw $t0, ($a0) сохранит содержимое $ t0 в адресе, указанном $ a0, что в вашем случае это адрес этикетки А.

Затем он использует кратные 4 как смещение потому что вы храните слова, и каждое слово занимает ровно 4 байта, поэтому для хранения чисел 1, 2, 3, 4 в последовательных словах вы должны добавить 4 к каждому предыдущему адресу.

1

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

function main() 
{ 
    i = 1 
    while(i <= 4) 
    { 
    A[i-1] = i 
    i = i + 1 
    } 

    i = 1 
    while(i <= 4) 
    { 
    printToConsole(A[i-1]) 
    i = i + 1 
    } 
    printToConsole(tab) 
} 

Когда код был собран, ассемблер, возможно, развернул цикл как повышение производительности.

+0

Это не то, что делает код. – gusbro

+1

@gusbro Спасибо. Я был смущен его встроенными комментариями, но исправил мой пример. – Sparafusile