2017-03-06 9 views
-1

Mipsアセンブリプログラミングの初心者です。私はこのプロジェクトを持っています:Mipsアセンブリは、文字列中の最も長い単語のアドレスを見つけます。

まず、指定された文字列のアドレスをレジスタにロードする必要があります。この文字列には文(文字の配列)が含まれ、単語はスペースで区切られます。それから、各単語の長さを見つけ、その長さを他の単語の長さと比較しなければなりません。最後に、最長の単語を見つけて、最初の文字のアドレスを出力する必要があります。

例えば、文字列がある場合:

string: .asciiz "This is a wonderful day" 

私たちが保存されているワットアドレスを返す必要があります。

は、これまでのところ私はこれを書いている:

.globl main 
.text 
    main: 
     la $a0, string  #Load the address of the string to $a0 
     addu $v1, $0, $a0  #Initialize the address of the longest word to v1 

    exit:     #Exiting the program 
     addiu $v0, $zero, 10 
     syscall 

.data 
string: .asciiz "This is a wonderful day" 

すべてのヘルプは高く評価しました。ありがとう。

、Javaでの実装は、このようなものが考えられます。編集はあなたが探索するためのいくつかのより多くのアイデア...

を良い進歩を見せている

int i = 0; 
int Counter1 = 0; 
int Counter2 = 0; 
int address1 = getTheAddressOfCharacter(string[i]); //get the address of  the first letter of the string. 
while(string[i] != ' ') //find the length of the 1st word and store it in counter1. 
{ 
    Counter1 += 1; 
    i += 1; 
} 

int address2 = getTheAddressOfCharacter(string[i]); //get the address of  the second letter of the string. 
while(string[i] != '\0') 
{ 
    if(string[i] != ' ') 
    { 
     if(Counter2 == 0) 
      address2 = getTheAddressOfCharacter(string[i]); 
     Counter2 += 1; 
    } 
    else 
    { 
     if(Counter2 > Counter1) 
     { 
      address1 = address2; 
      Counter1 = Counter2; 
     } 
     Counter2 = 0; 
    } 
    i += 1; 
} 
+1

あなたの問題は何ですか?最初にいくつかのアルゴリズムを設計し、そのコメントをコードに書き込んでください。コメントでアルゴリズムを使用した後、すべてのコメントがいくつかの単純な操作だけを記述し、そのアルゴリズムが正しく動作することを確認するまで、それらを改良し続けます(空文字列、単一単語、入力中のスペースなど)。その後、それを実装する指示を書くことができます。 – Ped7g

+0

それは "Javaで"正しく動作しません(と私はそれが論理だという意味 "getAddress"のような非Javaの事を意味しない)。適切な時に 'address2'を更新できません。それは空の文字列入力でもクラッシュします。それは、単一のスペースの文字列のためのスペースのアドレスを返します、おそらくそれは "単語が見つかりません"を表示する方が正しいでしょう。 'address2'アップデートメカニズムに対処している間、いたずらなテスターは単語間の二重トリプルスペースや文字列のスペースエンドを追加することに注意してください(しかし一般的に悪い試みではなく、使用されている操作はアセンブリ命令に似ています)。 – Ped7g

+0

多分Javaを残して、 "string [i]"を "address at value"と同等(これはアセンブリでは簡単です)と考えて、アドレスとインデックスの両方で作業する必要はありません。このタスクのすべてのためのそれら。 – Ped7g

答えて

0

私はmaxLengthのを初期化でしょう0に設定し、アドレスを未割り当てのままにしておきます(結果出力はこれを尊重し、(0 == maxLength)、未定義メモリに触れない場合は「単語が見つかりません」と表示する必要があります)。

最初と他の単語を別々にトラッキングするために2つのループを別々に持つ必要はありません。最初の単語を他の単語と同じように扱い、0文字より長い場合は現在の[maxLength、 maxWordAdr]ペアを使用して値を修正します。単一ループのロジックは、これらのトリミングなどをすべて解決するのにかなり複雑ですが、Counter2の "in java"は非常に有望であり、Counter1ループを同じレベルに固定することは避けられます。

変数の名前を変更して目的をより明確にしてください(var1/var2/var3は読みにくいです)...これはasm命令自体で失われていることはわかりますが、rXレジスタだけを使用していますが、すべてのコメントは明確で、細身で、最新のもので、記述するコードのローカルです。

私自身のASMソースを書いているとき、私は通常、単一のタスクを実行するグ​​ループ命令、または特定の命令行の小さなヒントコメントよりも1-2行の大きなコメントを持っているので、少なくともソースの20%以上はコメントです。

このようなクリーンアップの後、2,3の基本的なテスト入力文字列のアルゴリズムを頭で動かしてみてください。すべてが合っていれば、それを表すasmを書くのはかなり簡単です。不明な場合は、デバッガを使用して、指示が期待どおりに実行されていることを確認します。

関連する問題