📄 x86-codegen.h
字号:
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 + -