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

4

2 回答 2

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 添加到每个先前的地址。

于 2012-04-19T16:50:28.063 回答
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 )
}

汇编代码时,汇编器可能会展开循环以提高性能。

于 2012-04-19T16:01:13.173 回答