⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dismain.c

📁 操作系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}/* * * * * * * * * * * 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 + -