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

📄 s390-dis.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
print_insn_s390 (bfd_vma memaddr, struct disassemble_info *info){  bfd_byte buffer[6];  const struct s390_opcode *opcode;  const struct s390_opcode *opcode_end;  unsigned int value;  int status, opsize, bufsize;  char separator;  if (init_flag == 0)    init_disasm (info);  /* The output looks better if we put 6 bytes on a line.  */  info->bytes_per_line = 6;  /* Every S390 instruction is max 6 bytes long.  */  memset (buffer, 0, 6);  status = (*info->read_memory_func) (memaddr, buffer, 6, info);  if (status != 0)    {      for (bufsize = 0; bufsize < 6; bufsize++)	if ((*info->read_memory_func) (memaddr, buffer, bufsize + 1, info) != 0)	  break;      if (bufsize <= 0)	{	  (*info->memory_error_func) (status, memaddr, info);	  return -1;	}      /* Opsize calculation looks strange but it works	 00xxxxxx -> 2 bytes, 01xxxxxx/10xxxxxx -> 4 bytes,	 11xxxxxx -> 6 bytes.  */      opsize = ((((buffer[0] >> 6) + 1) >> 1) + 1) << 1;      status = opsize > bufsize;    }  else    {      bufsize = 6;      opsize = ((((buffer[0] >> 6) + 1) >> 1) + 1) << 1;    }  if (status == 0)    {      /* Find the first match in the opcode table.  */      opcode_end = s390_opcodes + s390_num_opcodes;      for (opcode = s390_opcodes + opc_index[(int) buffer[0]];	   (opcode < opcode_end) && (buffer[0] == opcode->opcode[0]);	   opcode++)	{	  const struct s390_operand *operand;	  const unsigned char *opindex;	  /* Check architecture.  */	  if (!(opcode->modes & current_arch_mask))	    continue;	  /* Check signature of the opcode.  */	  if ((buffer[1] & opcode->mask[1]) != opcode->opcode[1]	      || (buffer[2] & opcode->mask[2]) != opcode->opcode[2]	      || (buffer[3] & opcode->mask[3]) != opcode->opcode[3]	      || (buffer[4] & opcode->mask[4]) != opcode->opcode[4]	      || (buffer[5] & opcode->mask[5]) != opcode->opcode[5])	    continue;	  /* The instruction is valid.  */	  if (opcode->operands[0] != 0)	    (*info->fprintf_func) (info->stream, "%s\t", opcode->name);	  else	    (*info->fprintf_func) (info->stream, "%s", opcode->name);	  /* Extract the operands.  */	  separator = 0;	  for (opindex = opcode->operands; *opindex != 0; opindex++)	    {	      unsigned int value;	      operand = s390_operands + *opindex;	      value = s390_extract_operand (buffer, operand);	      if ((operand->flags & S390_OPERAND_INDEX) && value == 0)		continue;	      if ((operand->flags & S390_OPERAND_BASE) &&		  value == 0 && separator == '(')		{		  separator = ',';		  continue;		}	      if (separator)		(*info->fprintf_func) (info->stream, "%c", separator);	      if (operand->flags & S390_OPERAND_GPR)		(*info->fprintf_func) (info->stream, "%%r%i", value);	      else if (operand->flags & S390_OPERAND_FPR)		(*info->fprintf_func) (info->stream, "%%f%i", value);	      else if (operand->flags & S390_OPERAND_AR)		(*info->fprintf_func) (info->stream, "%%a%i", value);	      else if (operand->flags & S390_OPERAND_CR)		(*info->fprintf_func) (info->stream, "%%c%i", value);	      else if (operand->flags & S390_OPERAND_PCREL)		(*info->print_address_func) (memaddr + (int) value, info);	      else if (operand->flags & S390_OPERAND_SIGNED)		(*info->fprintf_func) (info->stream, "%i", (int) value);	      else		(*info->fprintf_func) (info->stream, "%u", value);	      if (operand->flags & S390_OPERAND_DISP)		{		  separator = '(';		}	      else if (operand->flags & S390_OPERAND_BASE)		{		  (*info->fprintf_func) (info->stream, ")");		  separator = ',';		}	      else		separator = ',';	    }	  /* Found instruction, printed it, return its size.  */	  return opsize;	}      /* No matching instruction found, fall through to hex print.  */    }  if (bufsize >= 4)    {      value = (unsigned int) buffer[0];      value = (value << 8) + (unsigned int) buffer[1];      value = (value << 8) + (unsigned int) buffer[2];      value = (value << 8) + (unsigned int) buffer[3];      (*info->fprintf_func) (info->stream, ".long\t0x%08x", value);      return 4;    }  else if (bufsize >= 2)    {      value = (unsigned int) buffer[0];      value = (value << 8) + (unsigned int) buffer[1];      (*info->fprintf_func) (info->stream, ".short\t0x%04x", value);      return 2;    }  else    {      value = (unsigned int) buffer[0];      (*info->fprintf_func) (info->stream, ".byte\t0x%02x", value);      return 1;    }}/* s390-opc.c -- S390 opcode list   Copyright 2000, 2001, 2003, 2007 Free Software Foundation, Inc.   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).   This file is part of the GNU opcodes library.   This library is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 3, or (at your option)   any later version.   It is distributed in the hope that it will be useful, but WITHOUT   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public   License for more details.   You should have received a copy of the GNU General Public License   along with this file; see the file COPYING.  If not, write to the   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,   MA 02110-1301, USA.  */#include <stdio.h>/* This file holds the S390 opcode table.  The opcode table   includes almost all of the extended instruction mnemonics.  This   permits the disassembler to use them, and simplifies the assembler   logic, at the cost of increasing the table size.  The table is   strictly constant data, so the compiler should be able to put it in   the .text section.   This file also holds the operand table.  All knowledge about   inserting operands into instructions and vice-versa is kept in this   file.  *//* The operands table.   The fields are bits, shift, insert, extract, flags.  */const struct s390_operand s390_operands[] ={#define UNUSED 0  { 0, 0, 0 },                    /* Indicates the end of the operand list */#define R_8    1                  /* GPR starting at position 8 */  { 4, 8, S390_OPERAND_GPR },#define R_12   2                  /* GPR starting at position 12 */  { 4, 12, S390_OPERAND_GPR },#define R_16   3                  /* GPR starting at position 16 */  { 4, 16, S390_OPERAND_GPR },#define R_20   4                  /* GPR starting at position 20 */  { 4, 20, S390_OPERAND_GPR },#define R_24   5                  /* GPR starting at position 24 */  { 4, 24, S390_OPERAND_GPR },#define R_28   6                  /* GPR starting at position 28 */  { 4, 28, S390_OPERAND_GPR },#define R_32   7                  /* GPR starting at position 32 */  { 4, 32, S390_OPERAND_GPR },#define F_8    8                  /* FPR starting at position 8 */  { 4, 8, S390_OPERAND_FPR },#define F_12   9                  /* FPR starting at position 12 */  { 4, 12, S390_OPERAND_FPR },#define F_16   10                 /* FPR starting at position 16 */  { 4, 16, S390_OPERAND_FPR },#define F_20   11                 /* FPR starting at position 16 */  { 4, 16, S390_OPERAND_FPR },#define F_24   12                 /* FPR starting at position 24 */  { 4, 24, S390_OPERAND_FPR },#define F_28   13                 /* FPR starting at position 28 */  { 4, 28, S390_OPERAND_FPR },#define F_32   14                 /* FPR starting at position 32 */  { 4, 32, S390_OPERAND_FPR },#define A_8    15                 /* Access reg. starting at position 8 */  { 4, 8, S390_OPERAND_AR },#define A_12   16                 /* Access reg. starting at position 12 */  { 4, 12, S390_OPERAND_AR },#define A_24   17                 /* Access reg. starting at position 24 */  { 4, 24, S390_OPERAND_AR },#define A_28   18                 /* Access reg. starting at position 28 */  { 4, 28, S390_OPERAND_AR },#define C_8    19                 /* Control reg. starting at position 8 */  { 4, 8, S390_OPERAND_CR },#define C_12   20                 /* Control reg. starting at position 12 */  { 4, 12, S390_OPERAND_CR },#define B_16   21                 /* Base register starting at position 16 */  { 4, 16, S390_OPERAND_BASE|S390_OPERAND_GPR },#define B_32   22                 /* Base register starting at position 32 */  { 4, 32, S390_OPERAND_BASE|S390_OPERAND_GPR },#define X_12   23                 /* Index register starting at position 12 */  { 4, 12, S390_OPERAND_INDEX|S390_OPERAND_GPR },#define D_20   24                 /* Displacement starting at position 20 */  { 12, 20, S390_OPERAND_DISP },#define D_36   25                 /* Displacement starting at position 36 */  { 12, 36, S390_OPERAND_DISP },#define D20_20 26		  /* 20 bit displacement starting at 20 */  { 20, 20, S390_OPERAND_DISP|S390_OPERAND_SIGNED },#define L4_8   27                 /* 4 bit length starting at position 8 */  { 4, 8, S390_OPERAND_LENGTH },#define L4_12  28                 /* 4 bit length starting at position 12 */  { 4, 12, S390_OPERAND_LENGTH },#define L8_8   29                 /* 8 bit length starting at position 8 */

⌨️ 快捷键说明

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