2012-11-01 56 views
1

我在下面的代碼中有幾個MIPS指令的問題
1. addi是一個算術指令,它的目的是什麼?
2.爲什麼jbeq之後有單個nop,但addi之後有多個nop
謝謝!關於MIPS指令在代碼中的問題

if(a==b) x=3; /* simple C code */ 
else  x=4; 
y=5; 

     lw $1,a  # possible unoptimized assembly language 
     lw $2,b  # no ($0) shown on memory access 
     nop    # wait for b to get into register 2 
     nop    # wait for b to get into register 2 
     beq $1,$2,lab1 
     nop    # branch slot, always executed ********* 
     addi $1,4  # else part 
     nop    # wait for 4 to get into register 1 
     nop    # wait for 4 to get into register 1 
     sw $1,x  # x=4; 
     j lab2 
     nop    # branch slot, always executed *********  
lab1: addi $1,3  # true part 
     nop    # wait for 3 to get into register 1 
     nop    # wait for 3 to get into register 1 
     sw $1,x  # x=3; 
lab2: addi $1,5  # after if-else, always execute 
     nop    # wait for 5 to get into register 1 
     nop    # wait for 5 to get into register 1 
     sw $1,y  # y=5; 

回答

3

阿迪是「立即添加」它可將一個立即值(常數,的整數),以寄存器的內容。另一個添加變體是寄存器添加寄存器。

addi和addi之後的nops從mips的角度來看完全沒有意義。 Mips很好地用於教育目的,並且您正在使用或正在教授的特定實現可能需要時間讓addi指令解碼並執行並將結果存儲到寄存器文件,然後該寄存器可用作另一條指令的輸入。通常情況下,mips內核(或者任何現代流水線處理器)會阻塞下一條指令或使用其他解決方案來縮短作爲後續指令輸入的一條指令的結果。

它不僅是addi,而且也是你看到這些nops用於延遲時間的lw,因爲評論說要將結果存儲在寄存器中。

至少想到基本步驟,取回,解碼,執行,存儲結果。這段代碼似乎讓時間至少可以完成這些步驟中的一部分,即使真正的mips不需要。

有一個分支後的延遲槽非常mips的東西(確保其他人這樣做,但它比普通罕見)。簡單的做法是在每個分支或跳躍之後放置一個nop並浪費週期。最終你會知道什麼時候你可以在分支之前接受其中一條指令並將其放在後面,否則如果你找不到一條指令就會使用nop。

通常,代碼看起來很好。對於addi指令的工作,以便代碼是C代碼的代表,addi確實需要使用始終爲零的寄存器0。 Addi需要一個寄存器,並立即將它們加在一起,並將結果放在不同的寄存器中,一個addi和一個常量有兩個寄存器......您只能顯示一個寄存器。對於所有在該代碼阿迪的用途,如果你認爲它是這樣的:

addi $1,4 
changes to 
addi $1,$0,4 
register $0 is always zero so this instruction really means 
$1 = 0 + 4 = 4 
$1 = 4 

我知道,從正式的角度和從機器代碼的角度來看,或許阿迪$ 1,4 MIPS指令的快捷方式,代表更正式的addi $ 1,$ 0.4。組裝代碼然後檢查該指令的機器代碼,並且您可能會看到兩個寄存器$ 1和$ 0與即時4。

Mips沒有mov指令,您可以將整個寄存器的大小立即調整爲一次。 lui指令用於將位置於寄存器的上半部分,並將零位置於下半部分。 Lui後面跟着一個addi或一個ori可以作爲一個團隊加載一個即時。或者如果高位爲零,則帶寄存器0($ 0)的addi or ori可用於在單條指令中設置低位。對於這個asm來表示C代碼,後者肯定是這種情況。

+0

感謝您的詳細解釋。我研究過MIPS ISA,發現'addi'有兩個寄存器。所以教官的例子沒有意義。謝謝 ! – newprint

1

我不知道MIP彙編我猜以下

  1. 筆者知道,A = 0,因此$ 1 = 0,因此阿迪(閱讀維基文章MIPS Architecture後) 1美元,4美元設置$ 1 = 4準備交給X。
  2. NOP沒有任何意義 - 除非作者知道指令是並行的,因此插入時鐘週期等待以確保完成前面的指令。

是否有更多的上下文的代碼(即,x的集合起來並且a,b等)

+0

這就是我的講師在演講幻燈片上呈現的代碼。我在想同樣的觀點。 $ 1 = $ 1(是0 ???)+4(換句話說,addi $ 1,4'指令提供立即數4,存儲在$ 1中)。但是,我沒有看到0進入$ 1寄存器。 – newprint

+0

我會問你的講師。大多數人會愛你提出更多的問題,特別是如果出現合理的問題,所以他們可以幫助你更好地理解。 –

1

在普通的MIPS彙編器中,addi $1,4addi $1,$1,4的縮寫,即將4加到$ 1。將常量加載到寄存器的正常速記是li $1,4,彙編程序通常將其轉換爲ori $1,$0,4。 (寄存器$ 0總是包含零)。

教師的示例看起來不正確,除非知道a始終爲零。在那種情況下,有更好的方法來實現這個代碼。