int main(int argv, char **argc){ int state = NOT_HALTED; struct instruction *instr_array; if(argv!=2){ fprintf(stderr, "Invalid input\n"); return -1; } FILE *assembly_file; assembly_file = fopen(argc[1],"r"); if(assembly_file==NULL){ fprintf(stderr, "File not found"); return -1; } FILE *diss_file; diss_file = fopen("file_dissassembled", "w+"); if(diss_file==NULL){ fprintf(stderr, "Error opening file for write"); return -1; } int len = 0; char *line = (char *) calloc(1,BUFF_LEN+1); int intarray[100]; int intindex = 0; while((fgets(line,BUFF_LEN,assembly_file))!=NULL){ if(strlen(line)>2){ *instr_array = get_instruction(line); if(instr_array->instr[0]==JMP){ int a = (int)instr_array->instr[1]-'0'; int b = (int)instr_array->instr[2]-'0'; int c = (int)instr_array->instr[3]-'0'; intarray[intindex]=(a*100+b*10+c*1); intindex++; } } free(line); line = (char*) calloc(1,BUFF_LEN+1); } intarray[intindex] = -1; //prevent oob rewind(assembly_file); intindex = 0; int intiter = 0; while((fgets(line,BUFF_LEN,assembly_file))!=NULL){ if(strlen(line)>2){ *instr_array = get_instruction(line); char *str; str = get_str_from_instr((*instr_array)); fputs(instr_array->ip,diss_file); fputs(" ",diss_file); fputs(instr_array->instr,diss_file); fputs(" ",diss_file); if(has_int(intindex,intarray)||state==HALTEDB){ fputs("L",diss_file); char* temp; if(intindex<10){ char sig = '0'+intindex; *temp = sig; fputs(temp,diss_file); fputs(":",diss_file); fputs(" ",diss_file); } else if(intindex<100){ char sig1 = '0'+intindex/10; char sig2 = '0'+intindex%10; *temp = sig1; *(temp+1)=sig2; fputs(temp,diss_file); fputs(":",diss_file); fputs(" ",diss_file); } else if(intindex<1000){ char sig1 = '0'+intindex/100; char sig2 = '0'+intindex/10; char sig3 = '0'+intindex%10; *temp = sig1; *(temp+1)=sig2; *(temp+2)=sig3; fputs(temp,diss_file); fputs(":",diss_file); } else { fputs("X",diss_file); } intiter++; if(state==HALTEDB) state=HALTED; } else { fputs(" ",diss_file); } fputs(" ",diss_file); if(strlen(instr_array->instr)>2 &&state!=HALTED) fputs(str,diss_file); else if(strlen(instr_array->instr)>2 &&state==HALTED) fputs(".word",diss_file); fputs("\n",diss_file); if(strcasecmp(instr_array->instr,"0000 ")==0&&len>2&&state!=HALTED){ state = HALTEDB; } len++; intindex++; } } fclose(diss_file); fclose(assembly_file); return 1; }
bool get_int(HSQUIRRELVM vm, const char* name, int& val) { if (!has_int(vm, name)) return false; val = read_int(vm, name); return true; }