2012-02-05 12 views
0

まず、これを言わせてください...私には誰も私に答えを与えたくない...正しい方向を指しておきたいです!MIPS ASM宿題 - ループとwhileループ

私は、例えば、このプログラムでは整数の配列を持っている....:

numbers: 
    .word 17 
    .word -50 
    .word 1 
    .word -999 

私はそれらを介して実行され、新しい行にそれぞれ1を出力し、whileループを持っています。それはうまく動作します。 (-999は終了番号で、印刷には含まれません)

また、逆の順序で印刷する必要があります。私は、要素の数を数えるためにループを使うことができ、そして最後のアドレスから始めて後方に行く別のループを持つことができることを知っています....しかし、これは非効率的です。

最初にループを実行しないで配列の最後の要素のアドレスを見つける方法はありますか?そうでない場合は、私が言及したようにこれを行うことができます、私がプログラムでできるほど効率的であることを確認したいだけです。

ありがとうございます!あなたが望む任意のアセンブリのトリックを行うことを許可されている場合は

+0

長さがあった場合は、すぐにジャンプすることができますが、配列の末尾に-999と表示されている場合は、それをスキャンしてそこから後ろに行くという正しい考えがあります。 –

+0

情報がない場合は(最後の要素アドレスのように)、いいえ。 – m0skit0

答えて

1

、あなたは

numbers: 
.word 17 
.word -50 
.word 1 
last: 
.word -999 

のような何かができると、この擬似コード言い換えれば

for (ptr = last; ptr != numbers;) print(*--ptr); 

のようなコードを使用してラベルを入れて、配列の終わりに移動し、配列の先頭に達するまで後方に歩きます。ターミネータ(-999)を探す代わりにポインタの比較を使用します。

それとも、あなたはあまりにも多くのコード変更を避けるために、どの程度

.word -999 
numbers: 
.word 17 
.word -50 
.word 1 
last: 
.word -999 

、あなたは-999を見つけるまで後方に歩きますか?

+0

アドバイスをいただきありがとうございますが、私は間違いなくこれを宿題にしていますので、それを私のリストに入れておきます。そして、数字を追加していきます。ファイルを配列して別のテストを実行します。その部分を制御します。あなたは、提示されたデータ構造を変更する必要はありませんが、あなたはまだこのトリックを行うことができます – user677786

+0

: '番号: は17 .WORDを.WORD -50 .WORD 1 が最後-999 を.WORD: \t .WORD -999'そして、Richard Penningtonによると、あなたは 'numbers'ラベルを持っているので、先頭の' .word -999'は必要ありません。 – m0skit0

+0

それを正しく理解すれば、たとえ新しいラベル上にあっても、最後の単語の後にはメモリ内の次の場所に残っています。そうすれば、私はそのラベルの住所から後方に数えることができますか? – user677786