📄 emit-inline.c
字号:
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 + -