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

📄 comp-goto-1.c

📁 this is a gcc file, you can download it and learn its usetility, for further detail please look at t
💻 C
字号:
#include <stdlib.h>#if !defined(NO_LABEL_VALUES) && (!defined(STACK_SIZE) || STACK_SIZE >= 4000)#if __INT_MAX__ == 32767typedef unsigned long uint32;typedef signed long sint32;#elsetypedef unsigned int uint32;typedef signed int sint32;#endiftypedef uint32 reg_t;typedef unsigned long int host_addr_t;typedef uint32 target_addr_t;typedef sint32 target_saddr_t;typedef union{  struct    {      unsigned int	offset:18;      unsigned int	ignore:4;      unsigned int	s1:8;      int		:2;      signed int	simm:14;      unsigned int	s3:8;      unsigned int	s2:8;      int		pad2:2;    } f1;  long long ll;  double d;} insn_t;typedef struct{  target_addr_t vaddr_tag;  unsigned long int rigged_paddr;} tlb_entry_t;typedef struct{  insn_t *pc;  reg_t registers[256];  insn_t *program;  tlb_entry_t tlb_tab[0x100];} environment_t;enum operations{  LOAD32_RR,  METAOP_DONE};host_addr_tf (){  abort ();}reg_tsimulator_kernel (int what, environment_t *env){  register insn_t *pc = env->pc;  register reg_t *regs = env->registers;  register insn_t insn;  register int s1;  register reg_t r2;  register void *base_addr = &&sim_base_addr;  register tlb_entry_t *tlb = env->tlb_tab;  if (what != 0)    {      int i;      static void *op_map[] =	{	  &&L_LOAD32_RR,	  &&L_METAOP_DONE,	};      insn_t *program = env->program;      for (i = 0; i < what; i++)	program[i].f1.offset = op_map[program[i].f1.offset] - base_addr;    } sim_base_addr:;  insn = *pc++;  r2 = (*(reg_t *) (((char *) regs) + (insn.f1.s2 << 2)));  s1 = (insn.f1.s1 << 2);  goto *(base_addr + insn.f1.offset); L_LOAD32_RR:  {    target_addr_t vaddr_page = r2 / 4096;    unsigned int x = vaddr_page % 0x100;    insn = *pc++;    for (;;)      {	target_addr_t tag = tlb[x].vaddr_tag;	host_addr_t rigged_paddr = tlb[x].rigged_paddr;	if (tag == vaddr_page)	  {	    *(reg_t *) (((char *) regs) + s1) = *(uint32 *) (rigged_paddr + r2);	    r2 = *(reg_t *) (((char *) regs) + (insn.f1.s2 << 2));	    s1 = insn.f1.s1 << 2;	    goto *(base_addr + insn.f1.offset);	  }	if (((target_saddr_t) tag < 0))	  {	    *(reg_t *) (((char *) regs) + s1) = *(uint32 *) f ();	    r2 = *(reg_t *) (((char *) regs) + (insn.f1.s2 << 2));	    s1 = insn.f1.s1 << 2;	    goto *(base_addr + insn.f1.offset);	  }	x = (x - 1) % 0x100;      }    L_METAOP_DONE:      return (*(reg_t *) (((char *) regs) + s1));  }}insn_t program[2 + 1];void *malloc ();intmain (){  environment_t env;  insn_t insn;  int i, res;  host_addr_t a_page = (host_addr_t) malloc (2 * 4096);  target_addr_t a_vaddr = 0x123450;  target_addr_t vaddr_page = a_vaddr / 4096;  a_page = (a_page + 4096 - 1) & -4096;  env.tlb_tab[((vaddr_page) % 0x100)].vaddr_tag = vaddr_page;  env.tlb_tab[((vaddr_page) % 0x100)].rigged_paddr = a_page - vaddr_page * 4096;  insn.f1.offset = LOAD32_RR;  env.registers[0] = 0;  env.registers[2] = a_vaddr;  *(sint32 *) (a_page + a_vaddr % 4096) = 88;  insn.f1.s1 = 0;  insn.f1.s2 = 2;  for (i = 0; i < 2; i++)    program[i] = insn;  insn.f1.offset = METAOP_DONE;  insn.f1.s1 = 0;  program[2] = insn;  env.pc = program;  env.program = program;  res = simulator_kernel (2 + 1, &env);  if (res != 88)    abort ();  exit (0);}#elsemain(){ exit (0); }#endif

⌨️ 快捷键说明

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