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

📄 emit-inline.c

📁 二进制翻译的一个软件
💻 C
📖 第 1 页 / 共 2 页
字号:
  case GP_REG_EAX:    restore_from = MREG(M, eax);    break;  case GP_REG_EBX:    restore_from = MREG(M, ebx);    break;  case GP_REG_ECX:    restore_from = MREG(M, ecx);    break;  case GP_REG_EDX:    restore_from = MREG(M, edx);    break;  case GP_REG_ESI:    restore_from = MREG(M, esi);    break;  case GP_REG_EDI:    restore_from = MREG(M, edi);    break;  case GP_REG_EBP:    restore_from = MREG(M, ebp);    break;  case GP_REG_ESP:    restore_from = MREG(M, esp);    break;  default:    panic("bb_emit_restore_reg() called with unknown register\n");    break;  }  bb_emit_restore_reg_from(M, whichReg, restore_from);}/* The following function is highly sensitive as the emitted code's size is used for computing something else */INLINE voidbb_emit_store_immediate_to(machine_t *M, unsigned long imm, unsigned long dest){  //bb_emit_byte(M, 0x65u); /* GS Segment Override Prefix - for accessing the M structure */  bb_emit_byte(M, 0xc7u); /* mov immediate to memory */  bb_emit_byte(M, 0x05u); /* 00 000 101 */  bb_emit_w32(M, dest);   /* M dest */  bb_emit_w32(M, imm);    /* imm32 */}/**************************************************************************************************************/INLINE voidbb_emit_get_2_bytes_into_M(machine_t *M, decode_t *d, unsigned long addr){  modrm_union modrm;  unsigned reg = GP_REG_EAX;  modrm.byte = (d->modrm).byte;  if (modrm.parts.mod == 0x3u)    {      /* Required value is contained in register /modrm.parts.rm/. Save that register to the appropriate field of M */      bb_emit_16_bit_save_reg_to(M, d->modrm.parts.rm, addr);      return;    }  /* Free up the selected register to hold temporary */  bb_emit_save_reg(M, reg);  modrm.parts.reg = reg;   if (d->flags & DSFL_GROUP2_PREFIX)    bb_emit_byte(M, d->Group2_Prefix);    bb_emit_byte(M, 0x66u);	/* Operand-size override prefix */  if (d->flags & DSFL_GROUP4_PREFIX)    bb_emit_byte (M, d->Group4_Prefix);  bb_emit_byte(M, 0x8bu);	/* (16-bit) mov instruction */  bb_emit_byte(M, modrm.byte);  if (d->need_sib)     bb_emit_byte (M, d->sib.byte);  switch(d->dispBytes) {  case 1:    bb_emit_byte(M, d->displacement);    break;  case 2:    bb_emit_w16(M, d->displacement);    break;  case 4:    bb_emit_w32(M, d->displacement);    break;  }  /* Required value is now contained in register /reg/. Copy that     to the appropriate field of M */  bb_emit_16_bit_save_reg_to(M, reg, addr);  /* Restore the register that we used as scratch register */  bb_emit_restore_reg(M, reg);}INLINE voidbb_emit_get_4_bytes_into_M(machine_t *M, decode_t * d, unsigned long addr){  modrm_union modrm;  unsigned reg = GP_REG_EAX;  modrm.byte = (d->modrm).byte;  if (modrm.parts.mod == 0x3u)    {      /* Required value is contained in register /modrm.parts.rm/. Save that register to the appropriate field of M */      bb_emit_save_reg_to(M, d->modrm.parts.rm, addr);      return;    }  /* Free up the selected register to hold temporary */  bb_emit_save_reg(M, reg);  modrm.parts.reg = reg;    if (d->flags & DSFL_GROUP2_PREFIX)    bb_emit_byte (M, d->Group2_Prefix);    if (d->flags & DSFL_GROUP4_PREFIX)    bb_emit_byte (M, d->Group4_Prefix);  bb_emit_byte(M, 0x8bu);	/* (32-bit) mov instruction */  bb_emit_byte(M, modrm.byte);  if (d->need_sib)     bb_emit_byte (M, d->sib.byte);  switch(d->dispBytes) {  case 1:    bb_emit_byte(M, d->displacement);    break;  case 2:    bb_emit_w16(M, d->displacement);    break;  case 4:    bb_emit_w32(M, d->displacement);    break;  }  /* Required value is now contained in register /reg/. Copy that     to the appropriate field of M */  bb_emit_save_reg_to(M, reg, addr);  /* Restore the register that we used as scratch register */  bb_emit_restore_reg(M, reg);}INLINE voidbb_emit_push_rm(machine_t *M, decode_t * d){  modrm_union modrm;  modrm.byte = (d->modrm).byte;  modrm.parts.reg = 0x6u;    if (d->flags & DSFL_GROUP2_PREFIX)    bb_emit_byte (M, d->Group2_Prefix);    if (d->flags & DSFL_GROUP4_PREFIX) {     bb_emit_byte (M, d->Group4_Prefix);    panic("16 bit mode encountered\n");  }  /* Push FF /6*/  bb_emit_byte(M, 0xFFu);  bb_emit_byte(M, modrm.byte);  if (d->need_sib)     bb_emit_byte (M, d->sib.byte);  switch(d->dispBytes) {  case 1:    bb_emit_byte(M, d->displacement);    break;  case 2:    bb_emit_w16(M, d->displacement);    break;  case 4:    bb_emit_w32(M, d->displacement);    break;  }}INLINE voidbb_emit_lw_inc(machine_t *M, unsigned long addr) // [len 8b]{  bb_emit_byte(M, 0xFFu);  // INC FF/0  bb_emit_byte(M, 0x05u);  // 00 000 101   bb_emit_w32(M, addr);}INLINE voidbb_emit_nop_inc(machine_t *M, unsigned long addr) // [len 8b]{  bb_emit_byte (M, 0x90u); // nop  bb_emit_byte(M, 0xFFu);  // INC FF/0  bb_emit_byte(M, 0x05u);  // 00 000 101   bb_emit_w32(M, addr);  bb_emit_byte (M, 0x90u); // nop}INLINE voidbb_emit_inc(machine_t *M, unsigned long addr) // [len 8b]{  bb_emit_byte (M, 0x9Cu); //Pushf  bb_emit_byte(M, 0xFFu);  // INC FF/0  bb_emit_byte(M, 0x05u);  // 00 000 101   bb_emit_w32(M, addr);  bb_emit_byte (M, 0x9Du); //Popf}INLINE voidbb_emit_lea_inc(machine_t *M, unsigned long addr){  // Push %eax  bb_emit_byte(M, 0x50u);    // Mov (addr), %eax  bb_emit_byte(M, 0x8bu); // 8b /r  bb_emit_byte(M, 0x05u); // 00 000 101  bb_emit_w32(M, addr);       // leal 1(%eax), %eax // 8D /r  bb_emit_byte(M, 0x8du);  bb_emit_byte(M, 0x40u); // 01 000 000  bb_emit_byte(M, 0x01u);    // mov %eax, (addr)  bb_emit_byte(M, 0x89u); // 8b /r  bb_emit_byte(M, 0x05u); // 00 000 101  bb_emit_w32(M, addr);     // pop %eax  bb_emit_byte(M, 0x58u);}/* Emit a call-back routine. Takes a pointer to the location holding   the function pointer, and a single argument to be passed to the    emitted function */INLINE voidbb_emit_call_back(machine_t *M, unsigned long fpp, unsigned long arg){  bb_emit_byte(M, 0x9cu);		/* PUSHF */  bb_emit_byte(M, 0x60u);		/* PUSHA */    // Push arg  bb_emit_byte(M, 0x68u);  bb_emit_w32(M, arg);    // call fpp  bb_emit_call(M, (unsigned char *)fpp);    // leal 4(%esp), %esp  bb_emit_byte(M, 0x8du);  bb_emit_byte(M, 0xA4u); /* 10 100 100 */  bb_emit_byte(M, 0x24u); /* 00 100 100 */  bb_emit_w32(M, 0x4u);  bb_emit_byte(M, 0x61u);		/* POPA */  bb_emit_byte(M, 0x9du);		/* POPF */}/* Emit a call-back routine. Takes a pointer to the location holding   the function pointer, and 2 arguments to be passed to the    emitted function */INLINE voidbb_emit_call_back3(machine_t *M, unsigned long fpp, 		   unsigned long arg1,		   unsigned long arg2,		   unsigned long arg3){  bb_emit_byte(M, 0x9cu);		/* PUSHF */  bb_emit_byte(M, 0x60u);		/* PUSHA */  // Push arg3  bb_emit_byte(M, 0x68u);  bb_emit_w32(M, arg3);  // Push arg2  bb_emit_byte(M, 0x68u);  bb_emit_w32(M, arg2);  // Push arg1  bb_emit_byte(M, 0x68u);  bb_emit_w32(M, arg1);    // call fpp  bb_emit_call(M, (unsigned char *)fpp);  // leal 12(%esp), %esp  bb_emit_byte(M, 0x8du);  bb_emit_byte(M, 0xA4u); /* 10 100 100 */  bb_emit_byte(M, 0x24u); /* 00 100 100 */  bb_emit_w32(M, 0xCu);  bb_emit_byte(M, 0x61u);		/* POPA */  bb_emit_byte(M, 0x9du);		/* POPF */}

⌨️ 快捷键说明

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