2012-04-19 37 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中,然後打印它?!?這個程序是正確的(加載「1234」),但我應該學習MIPS,通過理解課程講師給出的每個程序是什麼,這不是家庭作業或任何東西,只是學習如何MIPS程序工作MIPS - 修訂本程序實際上做了什麼?

回答

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

它似乎是一個展開的循環。第一個循環設置數組的內容和第二個循環打印出數組的內容後跟一個選項卡。看起來像:

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 2012-04-19 16:51:03

+1

@gusbro謝謝。我被他的內聯評論弄糊塗了,但是修正了我的例子。 – Sparafusile 2012-04-19 16:58:43

相關問題