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

📄 x86-codegen.h

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 H
📖 第 1 页 / 共 4 页
字号:
		x86_membase_emit ((inst), (reg), (basereg), (disp));	\	} while (0)#define x86_xadd_reg_reg(inst,dreg,reg,size)	\	do {	\		*(inst)++ = (unsigned char)0x0F;     \		if ((size) == 1)	\			*(inst)++ = (unsigned char)0xC0;	\		else	\			*(inst)++ = (unsigned char)0xC1;	\		x86_reg_emit ((inst), (reg), (dreg));	\	} while (0)#define x86_xadd_mem_reg(inst,mem,reg,size)	\	do {	\		*(inst)++ = (unsigned char)0x0F;     \		if ((size) == 1)	\			*(inst)++ = (unsigned char)0xC0;	\		else	\			*(inst)++ = (unsigned char)0xC1;	\		x86_mem_emit ((inst), (reg), (mem));	\	} while (0)#define x86_xadd_membase_reg(inst,basereg,disp,reg,size)	\	do {	\		*(inst)++ = (unsigned char)0x0F;     \		if ((size) == 1)	\			*(inst)++ = (unsigned char)0xC0;	\		else	\			*(inst)++ = (unsigned char)0xC1;	\		x86_membase_emit ((inst), (reg), (basereg), (disp));	\	} while (0)#define x86_inc_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_mem_emit ((inst), 0, (mem)); 	\	} while (0)#define x86_inc_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_membase_emit ((inst), 0, (basereg), (disp));	\	} while (0)#define x86_inc_reg(inst,reg) do { *(inst)++ = (unsigned char)0x40 + (reg); } while (0)#define x86_dec_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_mem_emit ((inst), 1, (mem));	\	} while (0)#define x86_dec_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xff;	\		x86_membase_emit ((inst), 1, (basereg), (disp));	\	} while (0)#define x86_dec_reg(inst,reg) do { *(inst)++ = (unsigned char)0x48 + (reg); } while (0)#define x86_not_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_mem_emit ((inst), 2, (mem));	\	} while (0)#define x86_not_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_membase_emit ((inst), 2, (basereg), (disp));	\	} while (0)#define x86_not_reg(inst,reg)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_reg_emit ((inst), 2, (reg));	\	} while (0)#define x86_neg_mem(inst,mem)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_mem_emit ((inst), 3, (mem));	\	} while (0)#define x86_neg_membase(inst,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_membase_emit ((inst), 3, (basereg), (disp));	\	} while (0)#define x86_neg_reg(inst,reg)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_reg_emit ((inst), 3, (reg));	\	} while (0)#define x86_nop(inst) do { *(inst)++ = (unsigned char)0x90; } while (0)#define x86_alu_reg_imm(inst,opc,reg,imm) 	\	do {	\		if ((reg) == X86_EAX) {	\			*(inst)++ = (((unsigned char)(opc)) << 3) + 5;	\			x86_imm_emit32 ((inst), (imm));	\			break;	\		}	\		if (x86_is_imm8((imm))) {	\			*(inst)++ = (unsigned char)0x83;	\			x86_reg_emit ((inst), (opc), (reg));	\			x86_imm_emit8 ((inst), (imm));	\		} else {	\			*(inst)++ = (unsigned char)0x81;	\			x86_reg_emit ((inst), (opc), (reg));	\			x86_imm_emit32 ((inst), (imm));	\		}	\	} while (0)#define x86_alu_mem_imm(inst,opc,mem,imm) 	\	do {	\		if (x86_is_imm8((imm))) {	\			*(inst)++ = (unsigned char)0x83;	\			x86_mem_emit ((inst), (opc), (mem));	\			x86_imm_emit8 ((inst), (imm));	\		} else {	\			*(inst)++ = (unsigned char)0x81;	\			x86_mem_emit ((inst), (opc), (mem));	\			x86_imm_emit32 ((inst), (imm));	\		}	\	} while (0)#define x86_alu_membase_imm(inst,opc,basereg,disp,imm) 	\	do {	\		if (x86_is_imm8((imm))) {	\			*(inst)++ = (unsigned char)0x83;	\			x86_membase_emit ((inst), (opc), (basereg), (disp));	\			x86_imm_emit8 ((inst), (imm));	\		} else {	\			*(inst)++ = (unsigned char)0x81;	\			x86_membase_emit ((inst), (opc), (basereg), (disp));	\			x86_imm_emit32 ((inst), (imm));	\		}	\	} while (0)	#define x86_alu_membase8_imm(inst,opc,basereg,disp,imm) 	\	do {	\		*(inst)++ = (unsigned char)0x80;	\		x86_membase_emit ((inst), (opc), (basereg), (disp));	\		x86_imm_emit8 ((inst), (imm)); \	} while (0)#define x86_alu_mem_reg(inst,opc,mem,reg)	\	do {	\		*(inst)++ = (((unsigned char)(opc)) << 3) + 1;	\		x86_mem_emit ((inst), (reg), (mem));	\	} while (0)#define x86_alu_membase_reg(inst,opc,basereg,disp,reg)	\	do {	\		*(inst)++ = (((unsigned char)(opc)) << 3) + 1;	\		x86_membase_emit ((inst), (reg), (basereg), (disp));	\	} while (0)#define x86_alu_reg_reg(inst,opc,dreg,reg)	\	do {	\		*(inst)++ = (((unsigned char)(opc)) << 3) + 3;	\		x86_reg_emit ((inst), (dreg), (reg));	\	} while (0)/** * @x86_alu_reg8_reg8: * Supports ALU operations between two 8-bit registers. * dreg := dreg opc reg * X86_Reg_No enum is used to specify the registers. * Additionally is_*_h flags are used to specify what part * of a given 32-bit register is used - high (TRUE) or low (FALSE). * For example: dreg = X86_EAX, is_dreg_h = TRUE -> use AH */#define x86_alu_reg8_reg8(inst,opc,dreg,reg,is_dreg_h,is_reg_h)	\	do {	\		*(inst)++ = (((unsigned char)(opc)) << 3) + 2;	\		x86_reg8_emit ((inst), (dreg), (reg), (is_dreg_h), (is_reg_h));	\	} while (0)#define x86_alu_reg_mem(inst,opc,reg,mem)	\	do {	\		*(inst)++ = (((unsigned char)(opc)) << 3) + 3;	\		x86_mem_emit ((inst), (reg), (mem));	\	} while (0)#define x86_alu_reg_membase(inst,opc,reg,basereg,disp)	\	do {	\		*(inst)++ = (((unsigned char)(opc)) << 3) + 3;	\		x86_membase_emit ((inst), (reg), (basereg), (disp));	\	} while (0)#define x86_test_reg_imm(inst,reg,imm)	\	do {	\		if ((reg) == X86_EAX) {	\			*(inst)++ = (unsigned char)0xa9;	\		} else {	\			*(inst)++ = (unsigned char)0xf7;	\			x86_reg_emit ((inst), 0, (reg));	\		}	\		x86_imm_emit32 ((inst), (imm));	\	} while (0)#define x86_test_mem_imm(inst,mem,imm)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_mem_emit ((inst), 0, (mem));	\		x86_imm_emit32 ((inst), (imm));	\	} while (0)#define x86_test_membase_imm(inst,basereg,disp,imm)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_membase_emit ((inst), 0, (basereg), (disp));	\		x86_imm_emit32 ((inst), (imm));	\	} while (0)#define x86_test_reg_reg(inst,dreg,reg)	\	do {	\		*(inst)++ = (unsigned char)0x85;	\		x86_reg_emit ((inst), (reg), (dreg));	\	} while (0)#define x86_test_mem_reg(inst,mem,reg)	\	do {	\		*(inst)++ = (unsigned char)0x85;	\		x86_mem_emit ((inst), (reg), (mem));	\	} while (0)#define x86_test_membase_reg(inst,basereg,disp,reg)	\	do {	\		*(inst)++ = (unsigned char)0x85;	\		x86_membase_emit ((inst), (reg), (basereg), (disp));	\	} while (0)#define x86_shift_reg_imm(inst,opc,reg,imm)	\	do {	\		if ((imm) == 1) {	\			*(inst)++ = (unsigned char)0xd1;	\			x86_reg_emit ((inst), (opc), (reg));	\		} else {	\			*(inst)++ = (unsigned char)0xc1;	\			x86_reg_emit ((inst), (opc), (reg));	\			x86_imm_emit8 ((inst), (imm));	\		}	\	} while (0)#define x86_shift_mem_imm(inst,opc,mem,imm)	\	do {	\		if ((imm) == 1) {	\			*(inst)++ = (unsigned char)0xd1;	\			x86_mem_emit ((inst), (opc), (mem));	\		} else {	\			*(inst)++ = (unsigned char)0xc1;	\			x86_mem_emit ((inst), (opc), (mem));	\			x86_imm_emit8 ((inst), (imm));	\		}	\	} while (0)#define x86_shift_membase_imm(inst,opc,basereg,disp,imm)	\	do {	\		if ((imm) == 1) {	\			*(inst)++ = (unsigned char)0xd1;	\			x86_membase_emit ((inst), (opc), (basereg), (disp));	\		} else {	\			*(inst)++ = (unsigned char)0xc1;	\			x86_membase_emit ((inst), (opc), (basereg), (disp));	\			x86_imm_emit8 ((inst), (imm));	\		}	\	} while (0)#define x86_shift_reg(inst,opc,reg)	\	do {	\		*(inst)++ = (unsigned char)0xd3;	\		x86_reg_emit ((inst), (opc), (reg));	\	} while (0)#define x86_shift_mem(inst,opc,mem)	\	do {	\		*(inst)++ = (unsigned char)0xd3;	\		x86_mem_emit ((inst), (opc), (mem));	\	} while (0)#define x86_shift_membase(inst,opc,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0xd3;	\		x86_membase_emit ((inst), (opc), (basereg), (disp));	\	} while (0)/* * Multi op shift missing. */#define x86_shrd_reg(inst,dreg,reg)                     \        do {                                            \		*(inst)++ = (unsigned char)0x0f;	\		*(inst)++ = (unsigned char)0xad;	\		x86_reg_emit ((inst), (reg), (dreg));	\	} while (0)#define x86_shrd_reg_imm(inst,dreg,reg,shamt)           \        do {                                            \		*(inst)++ = (unsigned char)0x0f;	\		*(inst)++ = (unsigned char)0xac;	\		x86_reg_emit ((inst), (reg), (dreg));	\		x86_imm_emit8 ((inst), (shamt));	\	} while (0)#define x86_shld_reg(inst,dreg,reg)                     \        do {                                            \		*(inst)++ = (unsigned char)0x0f;	\		*(inst)++ = (unsigned char)0xa5;	\		x86_reg_emit ((inst), (reg), (dreg));	\	} while (0)#define x86_shld_reg_imm(inst,dreg,reg,shamt)           \        do {                                            \		*(inst)++ = (unsigned char)0x0f;	\		*(inst)++ = (unsigned char)0xa4;	\		x86_reg_emit ((inst), (reg), (dreg));	\		x86_imm_emit8 ((inst), (shamt));	\	} while (0)/* * EDX:EAX = EAX * rm */#define x86_mul_reg(inst,reg,is_signed)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_reg_emit ((inst), 4 + ((is_signed) ? 1 : 0), (reg));	\	} while (0)#define x86_mul_mem(inst,mem,is_signed)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_mem_emit ((inst), 4 + ((is_signed) ? 1 : 0), (mem));	\	} while (0)#define x86_mul_membase(inst,basereg,disp,is_signed)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_membase_emit ((inst), 4 + ((is_signed) ? 1 : 0), (basereg), (disp));	\	} while (0)/* * r *= rm */#define x86_imul_reg_reg(inst,dreg,reg)	\	do {	\		*(inst)++ = (unsigned char)0x0f;	\		*(inst)++ = (unsigned char)0xaf;	\		x86_reg_emit ((inst), (dreg), (reg));	\	} while (0)#define x86_imul_reg_mem(inst,reg,mem)	\	do {	\		*(inst)++ = (unsigned char)0x0f;	\		*(inst)++ = (unsigned char)0xaf;	\		x86_mem_emit ((inst), (reg), (mem));	\	} while (0)#define x86_imul_reg_membase(inst,reg,basereg,disp)	\	do {	\		*(inst)++ = (unsigned char)0x0f;	\		*(inst)++ = (unsigned char)0xaf;	\		x86_membase_emit ((inst), (reg), (basereg), (disp));	\	} while (0)/* * dreg = rm * imm */#define x86_imul_reg_reg_imm(inst,dreg,reg,imm)	\	do {	\		if (x86_is_imm8 ((imm))) {	\			*(inst)++ = (unsigned char)0x6b;	\			x86_reg_emit ((inst), (dreg), (reg));	\			x86_imm_emit8 ((inst), (imm));	\		} else {	\			*(inst)++ = (unsigned char)0x69;	\			x86_reg_emit ((inst), (dreg), (reg));	\			x86_imm_emit32 ((inst), (imm));	\		}	\	} while (0)#define x86_imul_reg_mem_imm(inst,reg,mem,imm)	\	do {	\		if (x86_is_imm8 ((imm))) {	\			*(inst)++ = (unsigned char)0x6b;	\			x86_mem_emit ((inst), (reg), (mem));	\			x86_imm_emit8 ((inst), (imm));	\		} else {	\			*(inst)++ = (unsigned char)0x69;	\			x86_reg_emit ((inst), (reg), (mem));	\			x86_imm_emit32 ((inst), (imm));	\		}	\	} while (0)#define x86_imul_reg_membase_imm(inst,reg,basereg,disp,imm)	\	do {	\		if (x86_is_imm8 ((imm))) {	\			*(inst)++ = (unsigned char)0x6b;	\			x86_membase_emit ((inst), (reg), (basereg), (disp));	\			x86_imm_emit8 ((inst), (imm));	\		} else {	\			*(inst)++ = (unsigned char)0x69;	\			x86_membase_emit ((inst), (reg), (basereg), (disp));	\			x86_imm_emit32 ((inst), (imm));	\		}	\	} while (0)/* * divide EDX:EAX by rm; * eax = quotient, edx = remainder */#define x86_div_reg(inst,reg,is_signed)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_reg_emit ((inst), 6 + ((is_signed) ? 1 : 0), (reg));	\	} while (0)#define x86_div_mem(inst,mem,is_signed)	\	do {	\		*(inst)++ = (unsigned char)0xf7;	\		x86_mem_emit ((inst), 6 + ((is_signed) ? 1 : 0), (mem));	\	} while (0)

⌨️ 快捷键说明

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