📄 s390-dis.c.svn-base
字号:
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 + -