1

C でアセンブリ エミュレータ プログラムを作成しようとすると問題が発生します。REGA、REGB、REGC、REGX AND INSP の 5 つのレジスタと、NOP、SET、AND (ビット単位の &)、OR (ビット単位の |)、10 の命令があります。 ADD、SUB、SHL(<< 左)、SHR(>>)、JMP。

プログラムはファイルから命令を読み取ります。命令と 2 つの引数を含む行があります。ほとんどの場合、1 番目の引数はレジスタ名 (REGA など) で、2 番目の引数はレジスタ名または整数にすることができます。

ファイルから指示を取得するためにsscanfを使用しています。

ADD、SUB、SHL、SHR 関数に問題があります。私のADD関数は次のとおりです。

int opcode_add(char* opcode, char *arg1, char *arg2){
    int i, j;
    for(i = 0; i < MAX_REGISTER; i++){ 
        if (strcmp(register_str[i],arg1) == 0){ 
            for(j = 0; j <=MAX_REGISTER; j++){ 
                if(strcmp(register_str[j],arg2) == 0){ 
                    *register_ptr[i] = *register_ptr[i] + *register_ptr[j]; 
                    break;
                }else {
                    *register_ptr[i] = *register_ptr[i] + atoi(arg2); 
                }       
            }

        }
    }
    INSP++; 
    return (0); 
}

この関数は、2 つのレジスタ引数が渡された場合に機能します。例えば:

SET REGA 1
SET REGB 2
ADD REGA REGB

ただし、レジスタと整数が渡された場合はそうではありません。例えば:

SET REGA 2
ADD REGA 1

問題は次の行にあります。

*register_ptr[i] = *register_ptr[i] + atoi(arg2);

私はこれをやってみました:

int y = *register_ptr[i];
int k = atoi(arg2);
int result = y+k;
*register_ptr[i] = result;

しかし、うまくいきませんでした。

4

2 に答える 2

1

がうまくいかなかったのかは言いませんでしたが、内側のループとif. 内側のループが 2 番目のオペランドと一致しないレジスタを検出すると、elseブロックが実行されます。そのため、2 番目のオペランドで指定されたレジスタより前のすべてのレジスタが追加されます (2 番目のオペランドが int の場合、すべてのレジスタが追加されます)。に追加)。elseブロックの内容はループのに移動する必要があり、内側のループでレジスタが見つからなかった場合にのみ実行する必要があります。

于 2012-06-04T14:54:05.043 に答える
0

問題は次のとおりです。

for(j = 0; j <=MAX_REGISTER; j++){ 
    if(strcmp(register_str[j],arg2) == 0){ 
        *register_ptr[i] = *register_ptr[i] + *register_ptr[j]; 
        break;
    }else {
        *register_ptr[i] = *register_ptr[i] + atoi(arg2); 
    }       
}

まず第一にj < MAX_REGISTER、配列には (明らかに) それ自体が含まれていないため、確認する必要がありMAX_REGISTERます。しかし、さらに重要なことは、1 つのレジスター名が一致しない場合、すぐに試してはならないatoiということです。

これで、2 番目の引数が でない場合REGA、すぐに に行ってelseを試すことができatoiました。あなたがすべきことは、すべてのレジスタをチェックすることarg2ですatoi

bool found = false;
for(j = 0; j < MAX_REGISTER; j++){ 
    if(strcmp(register_str[j],arg2) == 0){ 
        *register_ptr[i] = *register_ptr[i] + *register_ptr[j]; 
        found = true
        break;
    }       
}
if (!found)
    *register_ptr[i] = *register_ptr[i] + atoi(arg2);
于 2012-06-04T15:10:15.033 に答える