2017-06-24 9 views
0

配列の先頭に整数を挿入する方法は?配列の先頭に整数を挿入するMIPS

例:

レジスタ$ S0 = 4(配列の要素の#)

レジスタ$ s1を= 0x10040000(配列の先頭のアドレス)

0x10040000 10 
0x10040004 20 
0x10040008 30 
0x1000400C 40 

私が挿入したいですint、たとえば0x10040000で5とし、すべてを下に移動します。

0x10040000 5 
0x10040004 10 
0x10040008 20 
0x1000400C 30 
0x10004010 40 

配列の前のアドレスに5を挿入するのですが、私ができるようにしたいのは、配列の先頭に5を挿入し、それ以外をすべて移動することです。

+1

あなたがそれを配列として考えるのを止め、2つの "メモリイメージ"を見るだけであれば、何をする必要があるのか​​は明らかです。メモリ内容を4バイト上に移動( '0x10040000'から4ワード)し、' 0x10040000'に '5 'を書き込む必要があります。この種の 'memmove'は、最適な方法で実行されるのが普通ですが、CPUに特有のものです(MIPSについてはわかりません)が、パフォーマンスに問題がなければ' i = 4; array(i - )array [i + 1] = array [i]; '(配列の最後から移動するので、元の値は移動したもので上書きされません)。 – Ped7g

+0

ところで、これはC++の 'vector <> 'が連続した記憶域の中で空のスロットを作るために配列の残りの部分を移動する必要があるので、挿入のために"遅い "と考えられる理由です。このような挿入ペナルティは後の処理で素早く取り戻されることが多いので、実際の性能を見出すために、使用プロファイリングを推測するのではなく、 'vector <>'構造体のパワーを過小評価しないでください。 'vector <>'型のデータ構造体は通常、初期バージョンのための最良のスタートです。 – Ped7g

答えて

0

ループと一時レジスタが必要です

.data 
N: .word 3 
VET: .word 2, 3, 4, 5 

.text 
li $t1, 0 
lw $t0, N 
sll $t0, $t0, 2 
la $t2, $t0(VET) 
srl $t0, $t0, 2 
loop: 
blt $t0, $t1 end_loop 
lw $s0, ($t2) #load the number from i pos 
sw $s0, 4($t2) #store the number in i+1 pos 
addi $t2, $t2, -4 #i-- 
addi $t0, $t0, -1 
j loop 
end_loop: 
li $s0, 1 #load value you want to store 
sw $s0, VET #store value 
lw $t0, N 
add $t0, $t0, 1 
sw $t0, N #update value of N 

今値1があなたのベクトルの先頭にある:値​​をシフトする($s0)。 最適化されていません。プログラムの背後にあるロジックを理解できるようにするだけです。これが参考になることを願っています。

関連する問題