MIPS - 修订该程序实际上做了什么?

时间:2012-04-19 09:42:56

标签: arrays assembly mips

            .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,然后打印出来?!?我' m完全失去了程序的其余部分。程序是正确的,(加载“1234”),但我应该学习MIPS,通过了解课堂讲师给出的每个程序。这不是作业或任何东西,只是学习MIPS计划如何运作。

2 个答案:

答案 0 :(得分:2)

程序首先从A的地址开始存储常量1,2,3,4,然后它只打印这四个单词的内容。

指令sw reg1, offset(reg2)将寄存器reg1的内容存储到reg2指向的地址加上指定的可选偏移量。

因此,在您的第一个示例中,sw $t0, ($a0)将$ t0的内容存储在$ a0指向的地址中,在您的情况下,该地址是标签A的地址。

然后使用4的倍数作为偏移,因为您正在存储单词,并且每个单词恰好占用4个字节,因此要将数字1,2,3,4存储在连续的单词中,您必须为每个先前的地址添加4。

答案 1 :(得分: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 )
}

汇编代码时,汇编程序可能会将循环展开为性能改进。