📄 dismain.c
字号:
}/* * * * * * * * * * * END OF prolog() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function is responsible for disassembly of the * * object file's text segment. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */static voiddistext(){/* * * * * * * * * * START OF distext() * * * * * * * * * */ char *c; register int j; register void (*f)(); for (j = 0; j < (int)(HDR.a_hdrlen); ++j) getchar(); printf("| %s, %s\n\n",PRG,release); printf("| @("); printf("#)\tDisassembly of %s",IFILE); if (symptr < 0) printf(" (no symbols)\n\n"); else printf("\n\n"); if (HDR.a_flags & A_EXEC) printf("| File is executable\n\n"); if (HDR.a_flags & A_SEP) { printf("| File has split I/D space, and may have\n"); printf("| extraneous instructions in text segment\n\n"); } prolog(); printf("\t.text\t\t\t| loc = %05.5lx, size = %05.5lx\n\n", PC,HDR.a_text); segflg = 0; for (PC = 0L; PC < HDR.a_text; ++PC) { j = getchar() & 0xff; if ((j == 0) && ((PC + 1L) == HDR.a_text)) { ++PC; break; } if ((c = getlab(N_TEXT)) != NULL) printf("%s",c); f = optab[j].func; (*f)(j); }}/* * * * * * * * * * END OF distext() * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function handles the object file's data segment. * * There is no good way to disassemble a data segment, be- * * cause it is impossible to tell, from the object code * * alone, what each data byte refers to. If it refers to * * an external symbol, the reference can be resolved from * * the relocation table, if there is one. However, if it * * refers to a static symbol, it cannot be distinguished * * from numeric, character, or other pointer data. In some * * cases, one might make a semi-educated guess as to the * * nature of the data, but such guesses are inherently * * haphazard, and they are bound to be wrong a good por- * * tion of the time. Consequently, the data segment is * * disassembled as a byte stream, which will satisfy no * * one but which, at least, will never mislead anyone. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */static voiddisdata(){/* * * * * * * * * * START OF disdata() * * * * * * * * * */ register char *c; register int j; unsigned long end; putchar('\n'); if (HDR.a_flags & A_SEP) { PC = 0L; end = HDR.a_data; } else end = HDR.a_text + HDR.a_data; printf("\t.data\t\t\t| loc = %05.5lx, size = %05.5lx\n\n", PC,HDR.a_data); segflg = 0; for (objptr = 0, zcount = 0L; PC < end; ++PC) { if ((c = getlab(N_DATA)) != NULL) { objdump(c); printf("%s",c); } if (objptr >= OBJMAX) if (objdump(NULL) && (symptr < 0)) printf("D%05.5lx:",PC); j = getchar() & 0xff; objbuf[objptr++] = j; } objdump("");}/* * * * * * * * * * END OF disdata() * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function handles the object file's bss segment. * * Disassembly of the bss segment is easy, because every- * * thing in it is zero by definition. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */static void disbss(){/* * * * * * * * * * START OF disbss() * * * * * * * * * */ register int j; register char *c; unsigned long beg, end; putchar('\n'); if (HDR.a_flags & A_SEP) end = HDR.a_data + HDR.a_bss; else end = HDR.a_text + HDR.a_data + HDR.a_bss; printf("\t.bss\t\t\t| loc = %05.5lx, size = %05.5lx\n\n", PC,HDR.a_bss); segflg = 0; for (beg = PC; PC < end; ++PC) if ((c = getlab(N_BSS)) != NULL) { if (PC > beg) { zdump(beg); beg = PC; } printf("%s",c); } if (PC > beg) zdump(beg);}/* * * * * * * * * * * END OF disbss() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the program entry point. The command line is * * searched for an input file name, which must be present. * * An optional output file name is also permitted; if none * * is found, standard output is the default. One command- * * line option is available: "-o", which causes the pro- * * gram to include object code in comments along with its * * mnemonic output. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */voidmain(argc,argv) int argc; /* Command-line args from OS */ register char **argv;{/* * * * * * * * * * * START OF main() * * * * * * * * * * */ char a[1024]; register int fd; long taboff, tabnum; long reloff, relnum; PRG = invoker(*argv); while (*++argv != NULL) /* Process command-line args */ if (**argv == '-') switch (*++*argv) { case 'o' : if (*++*argv) usage(PRG); else ++objflg; break; default : usage(PRG); } else if (IFILE == NULL) IFILE = *argv; else if (OFILE == NULL) OFILE = *argv; else usage(PRG); if (IFILE == NULL) usage(PRG); else if ((fd = open(IFILE,0)) < 0) { sprintf(a,"can't access input file %s",IFILE); fatal(PRG,a); } if (OFILE != NULL) if (freopen(OFILE,"w",stdout) == NULL) { sprintf(a,"can't open output file %s",OFILE); fatal(PRG,a); } if ( ! cpuid ) fprintf(stderr,"\07%s: warning: host/cpu clash\n",PRG); read(fd, (char *) &HDR,sizeof(struct exec)); if (BADMAG(HDR)) { sprintf(a,"input file %s not in object format",IFILE); fatal(PRG,a); } if (HDR.a_cpu != A_I8086) { sprintf(a,"%s is not an 8086/8088 object file",IFILE); fatal(PRG,a); } if (HDR.a_hdrlen <= A_MINHDR) HDR.a_trsize = HDR.a_drsize = 0L; HDR.a_tbase = HDR.a_dbase = 0L;/* AST emergency patch HDR.a_lnums = HDR.a_toffs = 0L;*/ reloff = HDR.a_text /* Compute reloc data offset */ + HDR.a_data + (long)(HDR.a_hdrlen); relnum = (HDR.a_trsize + HDR.a_drsize) / sizeof(struct reloc); taboff = reloff /* Compute name table offset */ + HDR.a_trsize + HDR.a_drsize; tabnum = HDR.a_syms / sizeof(struct nlist); if (relnum > MAXSYM) fatal(PRG,"reloc table overflow"); if (tabnum > MAXSYM) fatal(PRG,"symbol table overflow"); if (relnum) /* Get reloc data */ if (lseek(fd,reloff,0) != reloff) fatal(PRG,"lseek error"); else { for (relptr = 0; relptr < relnum; ++relptr) read(fd, (char *) &relo[relptr],sizeof(struct reloc)); relptr--; } if (tabnum) /* Read in symtab */ if (lseek(fd,taboff,0) != taboff) fatal(PRG,"lseek error"); else { for (symptr = 0; symptr < tabnum; ++symptr) read(fd, (char *) &symtab[symptr],sizeof(struct nlist)); symptr--; } else fprintf(stderr,"\07%s: warning: no symbols\n",PRG); close(fd); if (freopen(IFILE,"r",stdin) == NULL) { sprintf(a,"can't reopen input file %s",IFILE); fatal(PRG,a); } distext(); disdata(); disbss(); exit(0);}/* * * * * * * * * * * END OF main() * * * * * * * * * * */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -