【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19152

次の番地
投稿者---SOS(2005/01/13 08:52:24)


すいません。
また質問があるのですが・・・。
以下のプログラムは構造体配列でアセンブラ記述を1行目から最終行まで読み込むプログラムです。50行の命令があった時,4行目でbeqを読んだ後,38行目に飛んでその後39行目,40行目...50行目(5〜37行目は読み込まない)としたいのですが,どのように考えればよいのでしょうか。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct youso{   /* 構造体の宣言 */
    char opecode[20];   
    char operand0[20];  
    char operand1[20];  
    char operand2[20];  
};

int goukei(int x,FILE *fp);

int main(int argc, char *argv[])
{
    FILE *fp;
    int clock=0;

    fp=fopen("ras.txt", "r");   /* ファイルを開く */

    if(fp==NULL){
        printf("ファイルをオープンできませんでした\n");
        return 1;
    }else{
        printf("ファイルをオープンしました\n");
    }

    clock=goukei(clock,fp);

    printf("合計は%dです\n",clock);

    fclose(fp);

    return 0;
}

/* クロック数を数えるプログラム */
int goukei(int clock,FILE *fp)
{
    int i,num,n;
    char line[100];
    struct youso y[10000];  /* 構造体変数と構造体配列の宣言 */ 

    /* 構造体配列にデータを入力 */
    for(num = 0; num < 10000; num++) {
        if(fgets(line, sizeof(line), fp) == NULL) break;
        if((n = sscanf(line, "%s %s %s %s", y[num].opecode, y[num].operand0, y[num].operand1,y[num].operand2)) < 1) break;
        else if(n == 1){
            y[num].operand0[0] = '\0';
            y[num].operand1[0] = '\0';
            y[num].operand2[0] = '\0';
        }
        else if(n == 2){
            y[num].operand1[0] = '\0';
            y[num].operand2[0] = '\0';
        }
        else if(n == 3){
            y[num].operand2[0] = '\0';
        }
    }

    for(i = 0; i < num; i++){   
        /* 入力データの確認 */
        if(i==0){
            printf("opecode:%s operand0:%s operand1:%s operand2:%s\n", 
                y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2);
        }else{
            printf("opecode:%s operand0:%s operand1:%s operand2:%s p_opecode:%s\n", 
                y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2, y[i-1].opecode);
        }
    }
    
    /* 実行クロック数 */
    for(i = 0; i < num; i++){
        clock++;
    }

    /* オペコード */
    for(i = 0; i < num; i=i+1){

        /* 条件分岐命令、無条件ジャンプ命令 */
        if(strcmp(y[i].opecode,"slt")==0){
                clock=clock+1;
        }else if(strcmp(y[i].opecode,"sltu")==0){
                clock=clock+1;
        }else if(strcmp(y[i].opecode,"slti")==0){
                clock=clock+1;
        }else if(strcmp(y[i].opecode,"sltiu")==0){
                clock=clock+1;
        }else if(strcmp(y[i].opecode,"beq")==0){
                clock=clock+1;

        }else{ 
                clock=clock;
        }
     }

    clock=clock+4;  /* 段数分 */

    return clock;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:次の番地 19153 ぽこ 2005/01/13 09:29:40
<子記事> Re:次の番地 19154 gf 2005/01/13 09:51:43


No.19153

Re:次の番地
投稿者---ぽこ(2005/01/13 09:29:40)


>すいません。
>また質問があるのですが・・・。
>以下のプログラムは構造体配列でアセンブラ記述を1行目から最終行まで読み込むプログラムです。
>50行の命令があった時,4行目でbeqを読んだ後,38行目に飛んでその後39行目,40行目...50行目(5〜37行目は読み込まない)としたいのですが,どのように考えればよいのでしょうか。

シミュレートしようとしているニーモニックの仕様によるでしょう。
#MIPS系プロセッサのシミュレータを作成していると類推しています。

見た感じ分岐命令っぽいので、条件が成立した時(もしくはその逆)に何処に跳ぶか
オペランドから取得できませんか?
そこからアドレッシングモードを考慮に入れつつ跳び先の番地を計算し、
PCに代入すればいいのでは?




この投稿にコメントする

削除パスワード

No.19155

ごみレス
投稿者---ハンス(2005/01/13 10:32:11)


CPUシミュレータ作る意味が判りません。
PSもどきとかの壮大な計画なのかしら?

MIPSは遅延スロットがあるのでちゃんと考慮するように >toスレ主



この投稿にコメントする

削除パスワード

No.19158

Re:次の番地
投稿者---SOS(2005/01/13 13:46:12)


>>すいません。
>>また質問があるのですが・・・。
>>以下のプログラムは構造体配列でアセンブラ記述を1行目から最終行まで読み込むプログラムです。
>>50行の命令があった時,4行目でbeqを読んだ後,38行目に飛んでその後39行目,40行目...50行目(5〜37行目は読み込まない)としたいのですが,どのように考えればよいのでしょうか。
>
>シミュレートしようとしているニーモニックの仕様によるでしょう。
>#MIPS系プロセッサのシミュレータを作成していると類推しています。
>
>見た感じ分岐命令っぽいので、条件が成立した時(もしくはその逆)に何処に跳ぶか
>オペランドから取得できませんか?
>そこからアドレッシングモードを考慮に入れつつ跳び先の番地を計算し、
>PCに代入すればいいのでは?
>

C言語で書くとしたらどのように書けばいいですかね。


この投稿にコメントする

削除パスワード

No.19161

Re:次の番地
投稿者---nop(2005/01/13 14:53:20)


>C言語で書くとしたらどのように書けばいいですかね。

今の作りをガラッと変えて、
アセンブラの構文解析を実装するのが最適かと。


# どちらにしろ、アセンブラを作れるだけの知識量が必要な事項かと思います。
# それだけの知識はお持ちなのでしょうか?


この投稿にコメントする

削除パスワード

No.19177

Re:次の番地
投稿者---ぽこ(2005/01/13 22:03:06)


>C言語で書くとしたらどのように書けばいいですかね。

ニーモニックの仕様が分からないため、答えようがありません。
#プログラムの目的も分からないし。。



この投稿にコメントする

削除パスワード

No.19154

Re:次の番地
投稿者---gf(2005/01/13 09:51:43)


フラグ立てて、フラグがたってる場合、34回なにもせず
ループさせるとか、
他には、forの代わりに、while使って、カウンタを進ませる

>4行目でbeqを読んだ後,38行目に飛んで
必ず、beqなら、34行飛ぶのですか?
アセンブラのジャンプ命令なら、どこに飛ぶのか、指定されてるはずなので
operand0とかを数値にして、飛び先を決めるのではないのかな

# 入力データの確認、実行クロック数って、無駄にループ増やしてますね
# 特に、実行クロックのループは不必要&意味無しに見えます




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧