1

私はプログラマーとして、アセンブリ言語の行を機械語に翻訳し、小数を計算する必要があるプロジェクトを持っています。計算を簡単にするために、オペコードを備えた独自のサンプルコンピューターがあります。私の質問は、次の関数が私が目指していることを実行するかどうかです。

メイン関数には、返される値が 3 ビットになるため、char binary[3] というラベルの付いた char の配列があります。また、関数には char opcode[MAXLINELENGTH] があり、ファイルから適切に opcode 行を読み込むので、関数内で *string を使用してそれを指します。これで一致が正しく検出され、メインのバイナリ配列が適切な 3 桁のビット コードで埋められますか?

//function should return true if the proper binary output was successfuly copied with the matching opcode
int opcodeBinary(char *string,char *binary){
    if(strncmp(*string,"add"){
        *binary="000";
        return 1;
    }
    else if(strncmp(*string,"nand"){
        *binary="001";
        return 1;
    }
    else if(strncmp(*string,"lw"){
        *binary="010";
        return 1;
    }
    else if(strncmp(*string,"sw"){
        *binary="011";
        return 1;
    }
    else if(strncmp(*string,"beq"){
        *binary="100";
        return 1;
    }
    else if(strncmp(*string,"jalr"){
        *binary="101";
        return 1;
    }
    else if(strncmp(*string,"halt"){
        *binary="110";
        return 1;
    }
    else if(strncmp(*string,"noop"){
        *binary="111";
        return 1;
    }
    else{
        return 0;
    }
}
4

3 に答える 3

2

いいえ -- 実際、コンパイルすることさえできません。(ここに投稿する前にコードをコンパイルしようとしましたか?)

strncmpstrcmp文字列が等しい場合は 0を返します ( strncmp2 つではなく 3 つの引数を取ります!)。2 つの文字列が等しいかどうかを比較するには、次のようなものが必要です。

if (strncmp(string, "nand", 4) == 0) {
    ...

または、より簡単に:

if (strcmp(string, "nand") == 0) {
    ...

文字列リテラル"nand"は比較する文字数に制限があるのでstrncmp、strcmp` を使う意味はあまりありません。

への両方の引数strcmp(または への最初の 2 つの引数strncmp) の型はchar*です。stringはすでにタイプchar*です。文字列 (の最初の文字) を指していると仮定すると、 の最初の引数としてstringではなくを渡すだけです。*stringstrcmp

*binary = "000";コンパイルすらすべきではありません。binary = "000";コンパイルしますが、あなたが望むことはしません。binaryこれはポインターの割り当てであり、関数に対してローカルなの値にのみ影響します。関数が戻ると、目に見える効果はありません。

関数の 2 番目の引数を a にすることもできますchar**。次に、呼び出し元は次のようなことができます。

char *binary;
if (opcodeBinary(some_string, &binary) {
    /* binary now points to a string like "000" */
}

または、呼び出し元が文字列にスペースを割り当てることができます。

char binary[5]; /* or whatever size you need */

次に、関数内で、割り当てを次の呼び出しに置き換えますstrcpy

strcpy(binary, "000");

関数から配列を返すことはできません。同じことを間接的に行う方法はいくつかありますが、どれもやや面倒です。

于 2013-09-19T18:22:30.577 に答える
1

あなたの関数は型チェックをopCodeBinaryしていません。を割り当てる*binary="000"場合、左側は型の左辺値でcharあり、右側はchar*です。第 1 オペランド ~ についても同様ですstrncmp*C で文字列を使用する場合、先頭に a を追加しないでください。

アセンブリ コマンドに対応するバイナリ オペコードを生成する必要があると思います。からコマンドを読み取り、stringオペコードを に書き込む必要がありますbinary。ここで間違っていることがいくつかあります。

  1. 入力から文字を消費し、新しいバイナリオペコードを出力に生成するため、ポインターstringとを移動する方法はありません。これは、関数を繰り返しbinary呼び出す場合に便利です。opCodeBinaryへの両方のパラメーターに二重ポインターを使用することをお勧めしますopCodeBinary

  2. オペコード000は ASCII 表現 (つまり string "000") で生成するのではなく、それを含む 1 バイトをバイナリ形式 (または、さらに悪いことに、3 ビットのみ) で生成する必要があると思います。

あなたのopCodeBinary機能については、次のことをお勧めします。上記の (1) と (2) を正しく解決しますが、各オペコードがバイナリの 1 つ以上の (完全な) バイトになると想定しています。

int opCodeBinary (char **string, char **binary)
{
  if (strncmp(*string, "add", 3) == 0) {
     *string += 3;
     *(*binary)++ = '\x00';
     return 1;
  }
  ...
}
于 2013-09-19T18:21:19.237 に答える
0

using wrong strcnmp: Passing character(dereferenced char pointer) instead of char pointer(string) 比較する文字数を 3 番目の引数として渡す必要があります。

推奨事項: ハッシュを使用して、キーワードをバイナリ コードにマップします

于 2013-09-19T20:48:58.423 に答える