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