/* da.c */ #include #include #include "as.h" typedef unsigned char byte; union { int i; float f; struct { byte a,b,c,d; } b; } converter; FILE *fin; int location_counter; void main(void) { fin=fopen("a.exe","r"); if (fin==NULL) { fprintf(stderr,"Can't open a.exe\n"); exit(1); } converter.b.a=fgetc(fin); converter.b.b=fgetc(fin); converter.b.c=fgetc(fin); converter.b.d=fgetc(fin); printf("MAIN = %d\n", converter.i); converter.b.a=fgetc(fin); converter.b.b=fgetc(fin); converter.b.c=fgetc(fin); converter.b.d=fgetc(fin); location_counter=converter.i; printf("start loading at address %d\n", location_counter); while (1) { int b, opc, opd, i; b=fgetc(fin); if (b==EOF) break; printf("%6d: ", location_counter); location_counter+=1; opc=b&~OPERAND; opd=b&OPERAND; if (opd!=0) opc|=OPERAND; switch (opc) { case BADP : i=0; while (b==0) { b=fgetc(fin); i+=1; } location_counter+=i-1; ungetc(b, fin); printf("%d zeros", i); break; case LOAD : printf("LOAD "); break; case STOR : printf("STOR "); break; case LOADN : printf("LOADN "); break; case LOADF : printf("LOADF "); break; case POP : printf("POP "); break; case STI : printf("STI "); break; case LDI : printf("LDI "); break; case DUP : printf("DUP "); break; case ADD : printf("ADD "); break; case ADDF : printf("ADDF "); break; case SUB : printf("SUB "); break; case SUBF : printf("SUBF "); break; case MUL : printf("MUL "); break; case MULF : printf("MULF "); break; case DIV : printf("DIV "); break; case DIVF : printf("DIVF "); break; case MOD : printf("MOD "); break; case FLOAT : printf("FLOAT "); break; case FIX : printf("FIX "); break; case NOT : printf("NOT "); break; case AND : printf("AND "); break; case OR : printf("OR "); break; case EQL : printf("EQL "); break; case EQLF : printf("EQLF "); break; case NEQ : printf("NEQ "); break; case NEQF : printf("NEQF "); break; case LSS : printf("LSS "); break; case LSSF : printf("LSSF "); break; case GTR : printf("GTR "); break; case GTRF : printf("GTRF "); break; case LEQ : printf("LEQ "); break; case LEQF : printf("LEQF "); break; case GEQ : printf("GEQ "); break; case GEQF : printf("GEQF "); break; case INCSP : printf("INCSP "); break; case DECSP : printf("DECSP "); break; case INCFP : printf("INCFP "); break; case DECFP : printf("DECFP "); break; case JUMP : printf("JUMP "); break; case PJZ : printf("PJZ "); break; case POPJMP : printf("POPJMP"); break; case POPFP : printf("POPFP "); break; case LDFP : printf("LDFP "); break; case INIT : printf("INIT "); break; case STOP : printf("STOP "); break; case BADN : printf("BADN "); break; default: printf("#%03d ",opc); break; } if (opd==0) printf("\n"); else if (opd==CONSTANT_OPERAND) { converter.b.a=fgetc(fin); converter.b.b=fgetc(fin); converter.b.c=fgetc(fin); converter.b.d=fgetc(fin); location_counter+=4; if (opc==LOADF) printf(" %f\n", converter.f); else printf(" %d\n", converter.i); } else if (opd=FP_RELATIVE_OPERAND) { converter.b.a=fgetc(fin); converter.b.b=fgetc(fin); converter.b.c=fgetc(fin); converter.b.d=fgetc(fin); location_counter+=4; if (converter.i<0) printf(" FP%d\n", converter.i); else printf(" FP+%d\n", converter.i); } else printf(" BAD\n"); } fclose(fin); }