📄 x86assembler.h
字号:
m_formatter.immediate8(imm); } else { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_SUB, dst); m_formatter.immediate32(imm); } } void subl_im(int imm, int offset, RegisterID base) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_SUB, base, offset); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_SUB, base, offset); m_formatter.immediate32(imm); } }#if PLATFORM(X86_64) void subq_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp64(OP_SUB_EvGv, src, dst); } void subq_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_SUB, dst); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_SUB, dst); m_formatter.immediate32(imm); } }#else void subl_im(int imm, void* addr) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_SUB, addr); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_SUB, addr); m_formatter.immediate32(imm); } }#endif void xorl_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp(OP_XOR_EvGv, src, dst); } void xorl_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_XOR, dst); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_XOR, dst); m_formatter.immediate32(imm); } }#if PLATFORM(X86_64) void xorq_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp64(OP_XOR_EvGv, src, dst); } void xorq_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_XOR, dst); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_XOR, dst); m_formatter.immediate32(imm); } }#endif void sarl_i8r(int imm, RegisterID dst) { if (imm == 1) m_formatter.oneByteOp(OP_GROUP2_Ev1, GROUP2_OP_SAR, dst); else { m_formatter.oneByteOp(OP_GROUP2_EvIb, GROUP2_OP_SAR, dst); m_formatter.immediate8(imm); } } void sarl_CLr(RegisterID dst) { m_formatter.oneByteOp(OP_GROUP2_EvCL, GROUP2_OP_SAR, dst); } void shll_i8r(int imm, RegisterID dst) { if (imm == 1) m_formatter.oneByteOp(OP_GROUP2_Ev1, GROUP2_OP_SHL, dst); else { m_formatter.oneByteOp(OP_GROUP2_EvIb, GROUP2_OP_SHL, dst); m_formatter.immediate8(imm); } } void shll_CLr(RegisterID dst) { m_formatter.oneByteOp(OP_GROUP2_EvCL, GROUP2_OP_SHL, dst); }#if PLATFORM(X86_64) void sarq_CLr(RegisterID dst) { m_formatter.oneByteOp64(OP_GROUP2_EvCL, GROUP2_OP_SAR, dst); } void sarq_i8r(int imm, RegisterID dst) { if (imm == 1) m_formatter.oneByteOp64(OP_GROUP2_Ev1, GROUP2_OP_SAR, dst); else { m_formatter.oneByteOp64(OP_GROUP2_EvIb, GROUP2_OP_SAR, dst); m_formatter.immediate8(imm); } }#endif void imull_rr(RegisterID src, RegisterID dst) { m_formatter.twoByteOp(OP2_IMUL_GvEv, dst, src); } void imull_i32r(RegisterID src, int32_t value, RegisterID dst) { m_formatter.oneByteOp(OP_IMUL_GvEvIz, dst, src); m_formatter.immediate32(value); } void idivl_r(RegisterID dst) { m_formatter.oneByteOp(OP_GROUP3_Ev, GROUP3_OP_IDIV, dst); } // Comparisons: void cmpl_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp(OP_CMP_EvGv, src, dst); } void cmpl_rm(RegisterID src, int offset, RegisterID base) { m_formatter.oneByteOp(OP_CMP_EvGv, src, base, offset); } void cmpl_mr(int offset, RegisterID base, RegisterID src) { m_formatter.oneByteOp(OP_CMP_GvEv, src, base, offset); } void cmpl_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_CMP, dst); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, dst); m_formatter.immediate32(imm); } } void cmpl_ir_force32(int imm, RegisterID dst) { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, dst); m_formatter.immediate32(imm); } void cmpl_im(int imm, int offset, RegisterID base) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_CMP, base, offset); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, base, offset); m_formatter.immediate32(imm); } } void cmpl_im(int imm, int offset, RegisterID base, RegisterID index, int scale) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_CMP, base, index, scale, offset); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, base, index, scale, offset); m_formatter.immediate32(imm); } } void cmpl_im_force32(int imm, int offset, RegisterID base) { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, base, offset); m_formatter.immediate32(imm); }#if PLATFORM(X86_64) void cmpq_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp64(OP_CMP_EvGv, src, dst); } void cmpq_rm(RegisterID src, int offset, RegisterID base) { m_formatter.oneByteOp64(OP_CMP_EvGv, src, base, offset); } void cmpq_mr(int offset, RegisterID base, RegisterID src) { m_formatter.oneByteOp64(OP_CMP_GvEv, src, base, offset); } void cmpq_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_CMP, dst); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_CMP, dst); m_formatter.immediate32(imm); } } void cmpq_im(int imm, int offset, RegisterID base) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_CMP, base, offset); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_CMP, base, offset); m_formatter.immediate32(imm); } } void cmpq_im(int imm, int offset, RegisterID base, RegisterID index, int scale) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_CMP, base, index, scale, offset); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_CMP, base, index, scale, offset); m_formatter.immediate32(imm); } }#else void cmpl_rm(RegisterID reg, void* addr) { m_formatter.oneByteOp(OP_CMP_EvGv, reg, addr); } void cmpl_im(int imm, void* addr) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_CMP, addr); m_formatter.immediate8(imm); } else { m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, addr); m_formatter.immediate32(imm); } }#endif void cmpw_rm(RegisterID src, int offset, RegisterID base, RegisterID index, int scale) { m_formatter.prefix(PRE_OPERAND_SIZE); m_formatter.oneByteOp(OP_CMP_EvGv, src, base, index, scale, offset); } void testl_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp(OP_TEST_EvGv, src, dst); } void testl_i32r(int imm, RegisterID dst) { m_formatter.oneByteOp(OP_GROUP3_EvIz, GROUP3_OP_TEST, dst); m_formatter.immediate32(imm); } void testl_i32m(int imm, int offset, RegisterID base) { m_formatter.oneByteOp(OP_GROUP3_EvIz, GROUP3_OP_TEST, base, offset); m_formatter.immediate32(imm); } void testl_i32m(int imm, int offset, RegisterID base, RegisterID index, int scale) { m_formatter.oneByteOp(OP_GROUP3_EvIz, GROUP3_OP_TEST, base, index, scale, offset); m_formatter.immediate32(imm); }#if PLATFORM(X86_64) void testq_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp64(OP_TEST_EvGv, src, dst); } void testq_i32r(int imm, RegisterID dst) { m_formatter.oneByteOp64(OP_GROUP3_EvIz, GROUP3_OP_TEST, dst); m_formatter.immediate32(imm); } void testq_i32m(int imm, int offset, RegisterID base) { m_formatter.oneByteOp64(OP_GROUP3_EvIz, GROUP3_OP_TEST, base, offset); m_formatter.immediate32(imm); } void testq_i32m(int imm, int offset, RegisterID base, RegisterID index, int scale) { m_formatter.oneByteOp64(OP_GROUP3_EvIz, GROUP3_OP_TEST, base, index, scale, offset); m_formatter.immediate32(imm); }#endif void testb_i8r(int imm, RegisterID dst) { m_formatter.oneByteOp8(OP_GROUP3_EbIb, GROUP3_OP_TEST, dst); m_formatter.immediate8(imm); } void setCC_r(Condition cond, RegisterID dst) { m_formatter.twoByteOp8(setccOpcode(cond), (GroupOpcodeID)0, dst); } void sete_r(RegisterID dst) { m_formatter.twoByteOp8(setccOpcode(ConditionE), (GroupOpcodeID)0, dst); } void setz_r(RegisterID dst) { sete_r(dst); } void setne_r(RegisterID dst) { m_formatter.twoByteOp8(setccOpcode(ConditionNE), (GroupOpcodeID)0, dst); } void setnz_r(RegisterID dst) { setne_r(dst); } // Various move ops: void cdq() { m_formatter.oneByteOp(OP_CDQ); } void xchgl_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp(OP_XCHG_EvGv, src, dst); }#if PLATFORM(X86_64) void xchgq_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp64(OP_XCHG_EvGv, src, dst); }#endif void movl_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp(OP_MOV_EvGv, src, dst); } void movl_rm(RegisterID src, int offset, RegisterID base) { m_formatter.oneByteOp(OP_MOV_EvGv, src, base, offset); } void movl_rm_disp32(RegisterID src, int offset, RegisterID base) { m_formatter.oneByteOp_disp32(OP_MOV_EvGv, src, base, offset); } void movl_rm(RegisterID src, int offset, RegisterID base, RegisterID index, int scale) { m_formatter.oneByteOp(OP_MOV_EvGv, src, base, index, scale, offset); } void movl_mEAX(void* addr) { m_formatter.oneByteOp(OP_MOV_EAXOv);#if PLATFORM(X86_64) m_formatter.immediate64(reinterpret_cast<int64_t>(addr));#else m_formatter.immediate32(reinterpret_cast<int>(addr));#endif } void movl_mr(int offset, RegisterID base, RegisterID dst) { m_formatter.oneByteOp(OP_MOV_GvEv, dst, base, offset); } void movl_mr_disp32(int offset, RegisterID base, RegisterID dst) { m_formatter.oneByteOp_disp32(OP_MOV_GvEv, dst, base, offset); } void movl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst) { m_formatter.oneByteOp(OP_MOV_GvEv, dst, base, index, scale, offset); } void movl_i32r(int imm, RegisterID dst) { m_formatter.oneByteOp(OP_MOV_EAXIv, dst); m_formatter.immediate32(imm); } void movl_i32m(int imm, int offset, RegisterID base) { m_formatter.oneByteOp(OP_GROUP11_EvIz, GROUP11_MOV, base, offset); m_formatter.immediate32(imm); } void movl_EAXm(void* addr) { m_formatter.oneByteOp(OP_MOV_OvEAX);#if PLATFORM(X86_64) m_formatter.immediate64(reinterpret_cast<int64_t>(addr));#else m_formatter.immediate32(reinterpret_cast<int>(addr));#endif }#if PLATFORM(X86_64) void movq_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp64(OP_MOV_EvGv, src, dst); } void movq_rm(RegisterID src, int offset, RegisterID base)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -