2016-11-08 18 views
0

現在、MIPSアセンブリ言語を学び、アレイの使用方法が異なる2つの方法がありますが、その違いを知りたいと思っています。mips - 配列へのアクセス方法の違い

第一の方法

  .data 
array: .word 0, 1, 2, 3 
      .text 
main: 
    li $t0, 0 
    lw $t1, array($t0) #t1 = array[0], t1 = 0 
    addi $t0, $t0, 4  #increment 
    lw $t2, array($t0) #t2 = array[1], t2 = 1 

第二の方法

  .data 
array: .word 0, 1, 2, 3 
      .text 
main: 
    la $t0, array 
    lw $t1, ($t0) #t1 = 0 
    addi $t0, t0, 4 #increment 
    lw $t2, ($t0) #t2 = 1 

違いをいただきましたので?

+0

つ以外にも、あなたは0から始まり$ T0への配列のアドレスをロードすると、他のあなただけの差が0にロードされていません読みやすさと私は標準が第一の方法だと思います。 –

+0

2番目の方法は通常の方法です。最初の方法は、配列のアドレスが64kバイト未満の場合にのみ機能します。 – markgz

答えて

1

lw命令に対するメモリ内の場所に応じて、lwは複数の実際の命令に変換される疑似命令である可能性があります。 .. + 32767

------------------------------- 
| 100011 | base | rt | offset | 
------------------------------- 

ザは、一部は16ビットであり、32ビットに符号拡張されるであろうオフセットので、-32768の範囲を有する:

lw命令のエンコーディング(lw rt, offset(base))であります。それはarraylw命令の間にあり、lw命令にアセンブルされている命令の最大数はlwです。
array命令とlw命令が異なるセクションに配置されているため、距離が大きい場合(ほとんどの場合)、アセンブラはlwを疑似命令として扱い、2、3、または4の実際の指示。一部のアセンブラはこれをサポートしておらず、代わりにエラーとして扱います。

翻訳がどのように見えるかの例:

# array located at 0x10010000 
# lw $t1,array($t0) located at 0x00400018 

lui $at,0x1001  # $at = 0x10010000 
addu $at,$at,$t0 # $at = 0x10010000 + $t0 
lw $t1,($t0) 
関連する問題