2017-02-14 585 views
1

我正在參加一個架構課程,並且正在學習MIPS程序集。MIPS彙編中lw/sw操作的格式?

這是我的理解是,LW和SW操作是我格式指令允許2寄存器操作,和一個立即數:

 
[opcode] 6-bits, [rs] 5-bits, [rt] 5-bits, [immediate] 16-bits 

    written as: 
    lw $rt, offset($rs)  # where offset is an immediate value 

OK,讓我們說,我想訪問A [1]。假設A的基地址寄存器$ S7和索引(i)爲寄存器$ S1,我必須做的線沿線的東西:

 
    sll $t0, $s1, 2  # i*4 (offset) 
    add $t0, $s7, $t0 # $t0 = &A[i] 
    lw $t1, 0($t0)  # $t1 = A[i] 

我感到困惑的是我的教授一直說我們也可以用3個寄存器來做這樣的指令:

 
    sll $t0, $s1, 2  # i*4 (offset) 
    lw $t1, $t0($s7) # $t1 = A[i] 

這兩種解決方案都正確嗎?或者我的導師不正確?你不能使用寄存器來抵消偏移嗎?我認爲抵消必須是立即數。據我瞭解,之所以要在中增加指令的第一個解決方案,實際上是因爲你的不能用來使用寄存器作爲偏移量。

+0

彙編語言作爲一種語言是由彙編程序定義的,該程序讀取它並使機器代碼不在其中。一般來說(如果有的話)像C++或JAVA這樣的標準化語言在某個地方有一些委員會。 MIPS已經有了常用的僞指令,這可能是某個特定彙編器的另一個僞指令。 –

回答

0

lw/sw的偏移量必須是直接的。如果您的教師聲稱在接受寄存器偏移的MIPS指令集中存在lw/sw的變體,那麼他/她是不正確的。

但是,可能有彙編程序接受這樣一個變種,如僞指令,並將其轉換爲實際的MIPS指令。在這種情況下,可能的翻譯可能是:

addu $at,$s7,$t0 
lw $t1, 0($at) 
+0

爲了迂迴,(過時的)MIPS DSP架構擴展包括'lwx $ rd,$ rxxx($ ryyy)'指令,該指令允許寄存器用作偏移量。 – markgz