Ejemplo n.º 1
0
std::string clsDisassem::disassem20(__int32 ad)
{
	int nn, bu;
	std::string str;

	bu = 0;
	str = "";
	for (nn = 0; nn < 20; nn++) {
		str = str + disassem(ad) + "\r\n";
		bu = bu + bytesUsed;
	    ad = ad + bytesUsed;
	}
	bytesUsed = bu;
	return str;
}
Ejemplo n.º 2
0
/*
 FrontEnd - invokes the loader, parser, disassembler (if asm1), icode rewritter,
 and displays any useful information.
*/
void FrontEnd(char *filename, PCALL_GRAPH *pcallGraph)
{
    PPROC pProc;
    PSYM psym;
    int i, c;

    FILE *fp = fopen(filename, "rb");

    if (fp == NULL)
        fatalError(CANNOT_OPEN, filename); 

    MZ_Header *hdr = read_mz_header(fp);

    if (hdr == NULL) { // .com not handled for now
        fprintf(stderr, "%s: File format not recognized\n", filename);
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    // Load program into memory
    LoadImage(fp, hdr);

    if (option.verbose) {
        displayLoadInfo(hdr);
    }

    /* Do depth first flow analysis building call graph and procedure list,
       and attaching the I-code to each procedure */
    parse(pcallGraph);

    if (option.asm1) {
        printf("%s: writing assembler file %s\n", progname, asm1_name);
    }

    // Search through code looking for impure references and flag them
    for (pProc = pProcList; pProc; pProc = pProc->next) {
        for (i = 0; i < pProc->Icode.numIcode; i++) {
            if (pProc->Icode.icode[i].ll.flg & (SYM_USE | SYM_DEF)) {
                psym = &symtab.sym[pProc->Icode.icode[i].ll.caseTbl.numEntries];
                for (c = psym->label; c < psym->label + psym->size; c++) {
                    if (BITMAP(c, BM_CODE)) {
                        pProc->Icode.icode[i].ll.flg |= IMPURE;
                        pProc->flg |= IMPURE;
                        break;
                    }
                }
            }
        }
        // Print assembler listing
        if (option.asm1)
            disassem(1, pProc);
    }

    if (option.Interact) {
        interactDis(pProcList, 0); // Interactive disassembler
    }

    // Converts jump target addresses to icode offsets
    for (pProc = pProcList; pProc; pProc = pProc->next)
        bindIcodeOff(pProc);

    // Print memory bitmap
    if (option.Map)
        displayMemMap();
}
Ejemplo n.º 3
0
int dbg_parse_line()
{
    char ch;
    unsigned int ad;
    unsigned int ln;
    unsigned int regno;
    unsigned int ui;
    int nn;
    int n2;

    while (linendx < 84) {
        ch = dbg_getchar();
        switch (ch) {
        case -1: return;
        case ' ': break;
        case '?': dbg_DisplayHelp(); break;
        case 'q': return 1;
        case 'a': dbg_arm(dbg_dbctrl); break;
        case 'i':
             ch = dbg_getchar();
             switch(ch) {
             case '?':  // query instruction breakpoints
                  if (((dbg_dbctrl & 0x030000)==0) && (dbg_dbctrl & 1) == 1)
                      printf("i0=%08X\r\n", dbg_GetDBAD(0));
                  if (((dbg_dbctrl & 0x300000)==0) && (dbg_dbctrl & 2) == 2)
                      printf("i1=%08X\r\n", dbg_GetDBAD(1));
                  if (((dbg_dbctrl & 0x3000000)==0) && (dbg_dbctrl & 4) == 4)
                      printf("i2=%08X\r\n", dbg_GetDBAD(2));
                  if (((dbg_dbctrl & 0x30000000)==0) && (dbg_dbctrl & 8) == 8)
                      printf("i2=%08X\r\n", dbg_GetDBAD(3));
                  break;
             case '0':  dbg_ReadSetIB(0); break;
             case '1':  dbg_ReadSetIB(1); break;
             case '2':  dbg_ReadSetIB(2); break;
             case '3':  dbg_ReadSetIB(3); break;
             }
             break;
        case 'd':
             ch = dbg_getchar();
             switch(ch) {
             case 'i':
                  dbg_nextSpace();
                  nn = dbg_getHexNumber(&ad);
                  if (nn > 0) {
                      n2 = dbg_getDecNumber(&ln);
                      if (n2 > 0) {
                          for (; n2 > 0; n2--)
                              disassem(&ad,0);
                      }
                      else
                          disassem20(ad,0);
                  }
                  break;
             case '?':  // query instruction breakpoints
                  printf("\r\n");
                  if (((dbg_dbctrl & 0x030000)==0x30000) && (dbg_dbctrl & 1) == 1)
                      printf("d0=%08X\r\n", dbg_GetDBAD(0));
                  if (((dbg_dbctrl & 0x300000)==0x300000) && (dbg_dbctrl & 2) == 2)
                      printf("d1=%08X\r\n", dbg_GetDBAD(1));
                  if (((dbg_dbctrl & 0x3000000)==0x3000000) && (dbg_dbctrl & 4) == 4)
                      printf("d2=%08X\r\n", dbg_GetDBAD(2));
                  if (((dbg_dbctrl & 0x30000000)==0x30000000) && (dbg_dbctrl & 8) == 8)
                      printf("d2=%08X\r\n", dbg_GetDBAD(3));
                  break;
              case '0':  dbg_ReadSetDB(0); break;
              case '1':  dbg_ReadSetDB(1); break;
              case '2':  dbg_ReadSetDB(2); break;
              case '3':  dbg_ReadSetDB(3); break;
              case 's':
                  ch = dbg_getchar();
                  switch(ch) {
                  case '?':
                      if (((dbg_dbctrl & 0x030000)==0x10000) && (dbg_dbctrl & 1) == 1)
                          printf("ds0=%08X\r\n", dbg_GetDBAD(0));
                      if (((dbg_dbctrl & 0x300000)==0x100000) && (dbg_dbctrl & 2) == 2)
                          printf("ds1=%08X\r\n", dbg_GetDBAD(1));
                      if (((dbg_dbctrl & 0x3000000)==0x1000000) && (dbg_dbctrl & 4) == 4)
                          printf("ds2=%08X\r\n", dbg_GetDBAD(2));
                      if (((dbg_dbctrl & 0x30000000)==0x10000000) && (dbg_dbctrl & 8) == 8)
                          printf("ds2=%08X\r\n", dbg_GetDBAD(3));
                      break;
                  case '0':  dbg_ReadSetDSB(0); break;
                  case '1':  dbg_ReadSetDSB(1); break;
                  case '2':  dbg_ReadSetDSB(2); break;
                  case '3':  dbg_ReadSetDSB(3); break;
                  }
                  break;
              default:
                  dbg_nextSpace();
                  dbg_SetDBAD(0,0);
                  dbg_SetDBAD(1,0);
                  dbg_SetDBAD(2,0);
                  dbg_SetDBAD(3,0);
                  dbg_arm(0);
                  break;
             }
             break;
        case 'r': dbg_processReg(); break;
        case 's':
             ch = dbg_getchar();
             if (ch=='s') {
                  ch = dbg_getchar();
                  if (ch=='-') {
                      dbg_dbctrl &= 0x3FFFFFFFFFFFFFFFL;
                      dbg_arm(dbg_dbctrl);
                      ssm = 0;
                  }
                  else if (ch=='+' || ch=='m') {
                      dbg_dbctrl |= 0x4000000000000000L;                 
                      dbg_arm(dbg_dbctrl);
                      ssm = 1;
                      return 1;
                  }
             }
             break;
        case 'f':
             ch = dbg_getchar();
             if (ch=='/')
                 dbg_getDumpFormat();
             ch = dbg_getchar();
             if (ch==',') {
                 if (curfmt=='x')
                     nn = dbg_getHexNumber(&ui);
                 else
                     nn = dbg_getDecNumber(&ui);
                 if (nn > 0)
                     curfill = ui;
             }
             switch(curfmt) {
             case 'x':
                  switch(cursz) {
                  case 'b':
                       for (nn = 0; nn < currep; nn++)
                           bmem[ad+nn] = curfill;
                       break;
                  case 'c':
                       for (nn = 0; nn < currep; nn++)
                           cmem[ad/2+nn] = curfill;
                       break;
                  case 'h':
                       for (nn = 0; nn < currep; nn++)
                           hmem[ad/4+nn] = curfill;
                       break;
                  case 'w':
                       for (nn = 0; nn < currep; nn++)
                           wmem[ad/8+nn] = curfill;
                       break;
                  }
             }
             break;
        case 'x':
             ch = dbg_getchar();
             if (ch=='/') {
                 dbg_getDumpFormat();
             }
             switch(curfmt) {
             case 'i':
                  printf("\r\n");
                  for (nn = 0; nn < currep; nn++) {
                      if (getcharNoWait()==3)
                         break;
                      disassem(&curaddr,0);
                  }
                  break;
             case 's':
                  for (nn = 0; nn < currep; nn++) {
                      if (getcharNoWait()==3)
                         break;
                      curaddr += putstr(&cmem[curaddr/2],84) * 2;
                      printf("\r\n");
                  }
                  break;
             case 'x':
                  for (nn = 0; nn < currep; nn++) {
                      if (getcharNoWait()==3)
                         break;
                      if ((nn % muol)==0) {
                          switch(cursz) {
                          case 'b': printf("\r\n%06X ", curaddr+nn); break;
                          case 'c': printf("\r\n%06X ", curaddr+nn*2); break;
                          case 'h': printf("\r\n%06X ", curaddr+nn*4); break;
                          case 'w': printf("\r\n%06X ", curaddr+nn*8); break;
                          }
                      }
                      asm {; right here ; };
                      switch(cursz) {
                      case 'b': printf("%02X ", bmem[curaddr+nn]); break;
                      case 'c': printf("%04X ", cmem[curaddr/2+nn]); break;
                      case 'h': printf("%08X ", hmem[curaddr/4+nn]); break;
                      case 'w': printf("%016X ", wmem[curaddr/8+nn]); break;
                      }
                  }
                  switch(cursz) {
                  case 'b': curaddr += nn; break;
                  case 'c': curaddr += nn * 2; break;
                  case 'h': curaddr += nn * 4; break;
                  case 'w': curaddr += nn * 8; break;
                  }
                  printf("\r\n");
                  break;
             }
        }
    }
    return 0;
}