|
すいません。
また質問があるのですが・・・。
以下のプログラムは構造体配列でアセンブラ記述を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;
}
|