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

📄 x86-codegen.h

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 H
📖 第 1 页 / 共 4 页
字号:
#define x86_fst(inst,mem,is_double,pop_stack)	\	do {	\		*(inst)++ = (is_double) ? (unsigned char)0xdd: (unsigned char)0xd9;	\		x86_mem_emit ((inst), 2 + ((pop_stack) ? 1 : 0), (mem));	\	} while (0)#define x86_fst_membase(inst,basereg,disp,is_double,pop_stack)	\	do {	\		*(inst)++ = (is_double) ? (unsigned char)0xdd: (unsigned char)0xd9;	\		x86_membase_emit ((inst), 2 + ((pop_stack) ? 1 : 0), (basereg), (disp));	\	} while (0)#define x86_fst80_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0xdb;	\		x86_mem_emit ((inst), 7, (mem));	\	} while (0)#define x86_fst80_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xdb;	\		x86_membase_emit ((inst), 7, (basereg), (disp));	\	} while (0)#define x86_fist_pop(inst,mem,is_long)	\	do {	\		if ((is_long)) {	\			*(inst)++ = (unsigned char)0xdf;	\			x86_mem_emit ((inst), 7, (mem));	\		} else {	\			*(inst)++ = (unsigned char)0xdb;	\			x86_mem_emit ((inst), 3, (mem));	\		}	\	} while (0)#define x86_fist_pop_membase(inst,basereg,disp,is_long)	\	do {	\		if ((is_long)) {	\			*(inst)++ = (unsigned char)0xdf;	\			x86_membase_emit ((inst), 7, (basereg), (disp));	\		} else {	\			*(inst)++ = (unsigned char)0xdb;	\			x86_membase_emit ((inst), 3, (basereg), (disp));	\		}	\	} while (0)#define x86_fstsw(inst)	\	do {	\			*(inst)++ = (unsigned char)0x9b;	\			*(inst)++ = (unsigned char)0xdf;	\			*(inst)++ = (unsigned char)0xe0;	\	} while (0)/** * @x86_fist_membase * Converts content of ST(0) to integer and stores it at memory location * addressed by [basereg + disp]. * is_int specifies whether destination is int32 (TRUE) or int16 (FALSE). */#define x86_fist_membase(inst,basereg,disp,is_int)	\	do {	\		if ((is_int)) {	\			*(inst)++ = (unsigned char)0xdb;	\			x86_membase_emit ((inst), 2, (basereg), (disp));	\		} else {	\			*(inst)++ = (unsigned char)0xdf;	\			x86_membase_emit ((inst), 2, (basereg), (disp));	\		}	\	} while (0)#define x86_push_reg(inst,reg)	\	do {	\		*(inst)++ = (unsigned char)0x50 + (reg);	\	} while (0)#define x86_push_regp(inst,reg)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_regp_emit ((inst), 6, (reg));	\	} while (0)#define x86_push_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_mem_emit ((inst), 6, (mem));	\	} while (0)#define x86_push_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_membase_emit ((inst), 6, (basereg), (disp));	\	} while (0)#define x86_push_memindex(inst,basereg,disp,indexreg,shift)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_memindex_emit ((inst), 6, (basereg), (disp), (indexreg), (shift));	\	} while (0)#define x86_push_imm_template(inst) x86_push_imm (inst, 0xf0f0f0f0)	#define x86_push_imm(inst,imm)	\	do {	\		int _imm = (int) (imm);	\		if (x86_is_imm8 (_imm)) {	\			*(inst)++ = (unsigned char)0x6A;	\			x86_imm_emit8 ((inst), (_imm));	\		} else {	\			*(inst)++ = (unsigned char)0x68;	\			x86_imm_emit32 ((inst), (_imm));	\		}	\	} while (0)#define x86_pop_reg(inst,reg)	\	do {	\		*(inst)++ = (unsigned char)0x58 + (reg);	\	} while (0)#define x86_pop_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0x87;	\		x86_mem_emit ((inst), 0, (mem));	\	} while (0)#define x86_pop_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0x87;	\		x86_membase_emit ((inst), 0, (basereg), (disp));	\	} while (0)#define x86_pushad(inst) do { *(inst)++ = (unsigned char)0x60; } while (0)#define x86_pushfd(inst) do { *(inst)++ = (unsigned char)0x9c; } while (0)#define x86_popad(inst)  do { *(inst)++ = (unsigned char)0x61; } while (0)#define x86_popfd(inst)  do { *(inst)++ = (unsigned char)0x9d; } while (0)#define x86_loop(inst,imm)	\	do {	\		*(inst)++ = (unsigned char)0xe2;	\		x86_imm_emit8 ((inst), (imm));	\	} while (0)#define x86_loope(inst,imm)	\	do {	\		*(inst)++ = (unsigned char)0xe1;	\		x86_imm_emit8 ((inst), (imm));	\	} while (0)#define x86_loopne(inst,imm)	\	do {	\		*(inst)++ = (unsigned char)0xe0;	\		x86_imm_emit8 ((inst), (imm));	\	} while (0)#define x86_jump32(inst,imm)	\	do {	\		*(inst)++ = (unsigned char)0xe9;	\		x86_imm_emit32 ((inst), (imm));	\	} while (0)#define x86_jump8(inst,imm)	\	do {	\		*(inst)++ = (unsigned char)0xeb;	\		x86_imm_emit8 ((inst), (imm));	\	} while (0)#define x86_jump_reg(inst,reg)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_reg_emit ((inst), 4, (reg));	\	} while (0)#define x86_jump_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_mem_emit ((inst), 4, (mem));	\	} while (0)#define x86_jump_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_membase_emit ((inst), 4, (basereg), (disp));	\	} while (0)/* * target is a pointer in our buffer. */#define x86_jump_code(inst,target)	\	do {	\		int t = (unsigned char*)(target) - (inst) - 2;	\		if (x86_is_imm8(t)) {	\			x86_jump8 ((inst), t);	\		} else {	\			t -= 3;	\			x86_jump32 ((inst), t);	\		}	\	} while (0)#define x86_jump_disp(inst,disp)	\	do {	\		int t = (disp) - 2;	\		if (x86_is_imm8(t)) {	\			x86_jump8 ((inst), t);	\		} else {	\			t -= 3;	\			x86_jump32 ((inst), t);	\		}	\	} while (0)#define x86_branch8(inst,cond,imm,is_signed)	\	do {	\		if ((is_signed))	\			*(inst)++ = x86_cc_signed_map [(cond)];	\		else	\			*(inst)++ = x86_cc_unsigned_map [(cond)];	\		x86_imm_emit8 ((inst), (imm));	\	} while (0)#define x86_branch32(inst,cond,imm,is_signed)	\	do {	\		*(inst)++ = (unsigned char)0x0f;	\		if ((is_signed))	\			*(inst)++ = x86_cc_signed_map [(cond)] + 0x10;	\		else	\			*(inst)++ = x86_cc_unsigned_map [(cond)] + 0x10;	\		x86_imm_emit32 ((inst), (imm));	\	} while (0)#define x86_branch(inst,cond,target,is_signed)	\	do {	\		int offset = (target) - (inst) - 2;	\		if (x86_is_imm8 ((offset)))	\			x86_branch8 ((inst), (cond), offset, (is_signed));	\		else {	\			offset -= 4;	\			x86_branch32 ((inst), (cond), offset, (is_signed));	\		}	\	} while (0)#define x86_branch_disp(inst,cond,disp,is_signed)	\	do {	\		int offset = (disp) - 2;	\		if (x86_is_imm8 ((offset)))	\			x86_branch8 ((inst), (cond), offset, (is_signed));	\		else {	\			offset -= 4;	\			x86_branch32 ((inst), (cond), offset, (is_signed));	\		}	\	} while (0)#define x86_set_reg(inst,cond,reg,is_signed)	\	do {	\                assert (X86_IS_BYTE_REG (reg)); \		*(inst)++ = (unsigned char)0x0f;	\		if ((is_signed))	\			*(inst)++ = x86_cc_signed_map [(cond)] + 0x20;	\		else	\			*(inst)++ = x86_cc_unsigned_map [(cond)] + 0x20;	\		x86_reg_emit ((inst), 0, (reg));	\	} while (0)#define x86_set_mem(inst,cond,mem,is_signed)	\	do {	\		*(inst)++ = (unsigned char)0x0f;	\		if ((is_signed))	\			*(inst)++ = x86_cc_signed_map [(cond)] + 0x20;	\		else	\			*(inst)++ = x86_cc_unsigned_map [(cond)] + 0x20;	\		x86_mem_emit ((inst), 0, (mem));	\	} while (0)#define x86_set_membase(inst,cond,basereg,disp,is_signed)	\	do {	\		*(inst)++ = (unsigned char)0x0f;	\		if ((is_signed))	\			*(inst)++ = x86_cc_signed_map [(cond)] + 0x20;	\		else	\			*(inst)++ = x86_cc_unsigned_map [(cond)] + 0x20;	\		x86_membase_emit ((inst), 0, (basereg), (disp));	\	} while (0)#define x86_call_imm(inst,disp)	\	do {	\		*(inst)++ = (unsigned char)0xe8;	\		x86_imm_emit32 ((inst), (int)(disp));	\	} while (0)#define x86_call_reg(inst,reg)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_reg_emit ((inst), 2, (reg));	\	} while (0)#define x86_call_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_mem_emit ((inst), 2, (mem));	\	} while (0)#define x86_call_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_membase_emit ((inst), 2, (basereg), (disp));	\	} while (0)#define x86_call_code(inst,target)	\	do {	\		int _x86_offset = (unsigned char*)(target) - (inst);	\		_x86_offset -= 5;	\		x86_call_imm ((inst), _x86_offset);	\	} while (0)#define x86_ret(inst) do { *(inst)++ = (unsigned char)0xc3; } while (0)#define x86_ret_imm(inst,imm)	\	do {	\		if ((imm) == 0) {	\			x86_ret ((inst));	\		} else {	\			*(inst)++ = (unsigned char)0xc2;	\			x86_imm_emit16 ((inst), (imm));	\		}	\	} while (0)#define x86_cmov_reg(inst,cond,is_signed,dreg,reg)	\	do {	\		*(inst)++ = (unsigned char) 0x0f;	\		if ((is_signed))	\			*(inst)++ = x86_cc_signed_map [(cond)] - 0x30;	\		else	\			*(inst)++ = x86_cc_unsigned_map [(cond)] - 0x30;	\		x86_reg_emit ((inst), (dreg), (reg));	\	} while (0)#define x86_cmov_mem(inst,cond,is_signed,reg,mem)	\	do {	\		*(inst)++ = (unsigned char) 0x0f;	\		if ((is_signed))	\			*(inst)++ = x86_cc_signed_map [(cond)] - 0x30;	\		else	\			*(inst)++ = x86_cc_unsigned_map [(cond)] - 0x30;	\		x86_mem_emit ((inst), (reg), (mem));	\	} while (0)#define x86_cmov_membase(inst,cond,is_signed,reg,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char) 0x0f;	\		if ((is_signed))	\			*(inst)++ = x86_cc_signed_map [(cond)] - 0x30;	\		else	\			*(inst)++ = x86_cc_unsigned_map [(cond)] - 0x30;	\		x86_membase_emit ((inst), (reg), (basereg), (disp));	\	} while (0)#define x86_enter(inst,framesize)	\	do {	\		*(inst)++ = (unsigned char)0xc8;	\		x86_imm_emit16 ((inst), (framesize));	\		*(inst)++ = 0;	\	} while (0)	#define x86_leave(inst) do { *(inst)++ = (unsigned char)0xc9; } while (0)#define x86_sahf(inst)  do { *(inst)++ = (unsigned char)0x9e; } while (0)#define x86_fsin(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xfe; } while (0)#define x86_fcos(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xff; } while (0)#define x86_fabs(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xe1; } while (0)#define x86_ftst(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xe4; } while (0)#define x86_fxam(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xe5; } while (0)#define x86_fpatan(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xf3; } while (0)#define x86_fprem(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xf8; } while (0)#define x86_fprem1(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xf5; } while (0)#define x86_frndint(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xfc; } while (0)#define x86_fsqrt(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xfa; } while (0)#define x86_fptan(inst) do { *(inst)++ = (unsigned char)0xd9; *(inst)++ = (unsigned char)0xf2; } while (0)#define x86_padding(inst,size)	\	do {	\		switch ((size)) {	\		case 1: x86_nop ((inst)); break;	\		case 2: *(inst)++ = 0x8b;	\			*(inst)++ = 0xc0; break;	\		case 3: *(inst)++ = 0x8d; *(inst)++ = 0x6d;	\			*(inst)++ = 0x00; break;	\		case 4: *(inst)++ = 0x8d; *(inst)++ = 0x64;	\			*(inst)++ = 0x24; *(inst)++ = 0x00;	\			break;	\		case 5: *(inst)++ = 0x8d; *(inst)++ = 0x64;	\			*(inst)++ = 0x24; *(inst)++ = 0x00;	\			x86_nop ((inst)); break;	\		case 6: *(inst)++ = 0x8d; *(inst)++ = 0xad;	\			*(inst)++ = 0x00; *(inst)++ = 0x00;	\			*(inst)++ = 0x00; *(inst)++ = 0x00;	\			break;	\		case 7: *(inst)++ = 0x8d; *(inst)++ = 0xa4;	\			*(inst)++ = 0x24; *(inst)++ = 0x00;	\			*(inst)++ = 0x00; *(inst)++ = 0x00;	\			*(inst)++ = 0x00; break;	\		default: assert (0);	\		}	\	} while (0)#define x86_prolog(inst,frame_size,reg_mask)	\	do {	\		unsigned i, m = 1;	\		x86_enter ((inst), (frame_size));	\		for (i = 0; i < X86_NREG; ++i, m <<= 1) {	\			if ((reg_mask) & m)	\				x86_push_reg ((inst), i);	\		}	\	} while (0)#define x86_epilog(inst,reg_mask)	\	do {	\		unsigned i, m = 1 << X86_EDI;	\		for (i = X86_EDI; m != 0; i--, m=m>>1) {	\			if ((reg_mask) & m)	\				x86_pop_reg ((inst), i);	\		}	\		x86_leave ((inst));	\		x86_ret ((inst));	\	} while (0)#endif // X86_H

⌨️ 快捷键说明

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