0

アセンブリ言語は初めてです。私は多くの助けを借りて、配列を受け取って出力するコードを書きました。最初の配列の内容を 2 番目の配列に単純にコピーし、2 番目の配列を出力したいと考えています。(後で操作して、2 番目の配列が最初の配列をほとんど逆方向に出力するようにします)

配列を2番目の配列にコピーして印刷する方法を学びたいだけです。以下は、最初の配列を出力するだけの私のコードです

# PrintList.asm
.data
Sz: .word 10
Array: .word 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
NL: .asciiz " "

.text

main:
lw $s7, Sz 
move $s1, $zero  
move $s2, $zero 

print_loop:
bge $s1, $s7, print_loop_end 

lw $a0, Array($s2) 
li $v0, 1
syscall
la $a0, NL 
li $v0, 4
syscall
addi $s1, $s1, 1 
addi $s2, $s2, 4 
j print_loop 

print_loop_end:

ガイダンスやヒントは役に立ちます ありがとう

4

1 に答える 1

2

最初にプログラムに関するいくつかのコメント:

move $2, $zero
.....
lw $a0, Array($s2) 

実際の環境で MIPS を使用する場合 (例: 多くの WLAN ルーターが MIPS プロセッサを使用している場合)、2 行目は機能しません。その理由は、「配列」のアドレスが通常 0x10000 を超える範囲にあり、コード内の行が 0x7FFF を超えるアドレスにアクセスできないためです。

次の 2 行を使用することをお勧めします。

la $2, Array
...
lw $a0, 0($s2) 

また、「syscall」がオペレーティング システムを呼び出すことにも注意してください。これは、"$v0" レジスタの数値の意味が、使用するオペレーティング システム (またはシミュレータ) によって異なることを意味します。Unix では、次の行:

li $v0, 1
syscall

プログラムをすぐに停止する「exit()」システムコールを呼び出します。「syscall」命令を使用する場合は、たとえば SPIM シミュレーターを使用していることに言及する必要があります ($v0=1 は、整数を出力することを意味します)。

実際の問題について:

配列をコピーするには、「lw」命令の後に「sw」命令を追加するだけです。

lw $a0, Array($s2)
sw $a0, SecondArray($s2)

一部の実際の MIPS プロセッサでは、次の命令で "lw" を使用してロードされたレジスタを使用できません。したがって、これを回避するために命令の順序を変更する必要があります。

lw $a0, Array($s2)
li $v0, 1
sw $a0, SecondArray($s2)

アドレス > 0x10000 の問題はまだ存在します。プログラムがそのようなアドレスで機能する必要がある場合は、2 つ目の配列ポインターが必要になります。

la $s2, Array
la $s3, SecondArray
  ...
lw $a0, 0($s2)
li $v0, 1
sw $a0, 0($s3)
  ...
addi $s2, $s2, 4
addi $s3, $s3, 4
于 2013-10-20T06:06:05.903 に答える