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

📄 mips-pinsn.c

📁 早期freebsd实现
💻 C
字号:
/* Print mips instructions for GDB, the GNU debugger.   Copyright 1989, 1991, 1992 Free Software Foundation, Inc.   Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).This file is part of GDB.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */#include "defs.h"#include "symtab.h"#include "opcode/mips.h"/* Mips instructions are never longer than this many bytes.  */#define MAXLEN 4/* Number of elements in the opcode table.  */#define NOPCODES (sizeof mips_opcodes / sizeof mips_opcodes[0])#define MKLONG(p)  *(unsigned long*)p/* subroutine */static unsigned char *print_insn_arg (d, l, stream, pc)     char *d;     register unsigned long int *l;     FILE *stream;     CORE_ADDR pc;{  switch (*d)    {    case ',':    case '(':    case ')':      fputc (*d, stream);      break;    case 's':      fprintf (stream, "$%s", reg_names[((struct op_i_fmt *) l)->rs]);      break;    case 't':      fprintf (stream, "$%s", reg_names[((struct op_i_fmt *) l)->rt]);      break;    case 'i':      fprintf (stream, "%d", ((struct op_i_fmt *) l)->immediate);      break;    case 'j': /* same as i, but sign-extended */      fprintf (stream, "%d", ((struct op_b_fmt *) l)->delta);      break;    case 'a':      print_address ((pc & 0xF0000000) | (((struct op_j_fmt *)l)->target << 2),		     stream);      break;    case 'b':      print_address ((((struct op_b_fmt *) l)->delta << 2) + pc + 4, stream);      break;    case 'd':      fprintf (stream, "$%s", reg_names[((struct op_r_fmt *) l)->rd]);      break;    case 'h':      fprintf (stream, "0x%x", ((struct op_r_fmt *) l)->shamt);      break;    case 'B':      fprintf (stream, "0x%x", ((struct op_brk_fmt *) l)->code);      break;    case 'S':      fprintf (stream, "$f%d", ((struct fop_r_fmt *) l)->fs);      break;    case 'T':      fprintf (stream, "$f%d", ((struct fop_r_fmt *) l)->ft);      break;    case 'D':      fprintf (stream, "$f%d", ((struct fop_r_fmt *) l)->fd);      break;    default:      fprintf (stream, "# internal error, undefined modifier(%c)", *d);      break;    }}/* Print the mips instruction at address MEMADDR in debugged memory,   on STREAM.  Returns length of the instruction, in bytes, which   is always 4.  */intprint_insn (memaddr, stream)     CORE_ADDR memaddr;     FILE *stream;{  unsigned char buffer[MAXLEN];  register int i;  register char *d;  unsigned long int l;  read_memory (memaddr, buffer, MAXLEN);  SWAP_TARGET_AND_HOST (buffer, MAXLEN);  for (i = 0; i < NOPCODES; i++)    {      register unsigned int opcode = mips_opcodes[i].opcode;      register unsigned int match = mips_opcodes[i].match;      if ((*(unsigned int*)buffer & match) == opcode)	break;    }  l = MKLONG (buffer);  /* Handle undefined instructions.  */  if (i == NOPCODES)    {      fprintf (stream, "0x%x",l);      return 4;    }  fprintf (stream, "%s", mips_opcodes[i].name);  if (!(d = mips_opcodes[i].args))    return 4;  fputc (' ', stream);  while (*d)    print_insn_arg (d++, &l, stream, memaddr);  return 4;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -