public final class Assembler extends Serializer
Modifier and Type | Field and Description |
---|---|
private CodeBuffer |
_buffer |
private Logger |
_logger |
private int |
_properties |
private java.util.List<RelocData> |
_relocData |
(package private) int |
_trampolineSize
Size of possible trampolines.
|
private CPU |
cpu |
private CpuInfo |
cpuInfo |
static CPU |
I386 |
private static int[] |
nop1 |
private static int[] |
nop10 |
private static int[] |
nop11 |
private static int[] |
nop2 |
private static int[] |
nop3 |
private static int[] |
nop4 |
private static int[] |
nop5 |
private static int[] |
nop6 |
private static int[] |
nop7 |
private static int[] |
nop8 |
private static int[] |
nop9 |
static CPU |
X86_64 |
_cmovcctable, _jcctable, _none, _setcctable
Modifier and Type | Method and Description |
---|---|
(package private) void |
_emitByte(int x)
Emit Byte to internal buffer.
|
(package private) LinkData |
_emitDisplacement(Label label,
long inlinedDisplacement,
int size) |
(package private) void |
_emitDWord(int x)
Emit DWord (4 bytes) to internal buffer.
|
(package private) void |
_emitFpu(int opCode) |
(package private) void |
_emitFpuMEM(int opCode,
int opReg,
Mem mem) |
(package private) void |
_emitFpuSTI(int opCode,
int sti) |
(package private) void |
_emitImmediate(Immediate imm,
int size) |
(package private) void |
_emitInt32(int x)
Emit Int32 (4 bytes) to internal buffer.
|
(package private) void |
_emitJmpOrCallReloc(InstructionGroup instruction,
long target) |
(package private) void |
_emitMmu(int opCode,
int rexw,
int opReg,
Operand src,
int immSize) |
(package private) void |
_emitMod(int m,
int o,
int r)
Emit MODR/M byte.
|
(package private) void |
_emitModM(int opReg,
Mem mem,
int immSize) |
(package private) void |
_emitModR(int opReg,
BaseReg r)
Emit Register / Register - calls _emitMod(3, opReg, r.code())
|
(package private) void |
_emitModR(int opReg,
int r)
Emit Register / Register - calls _emitMod(3, opReg, r)
|
(package private) void |
_emitModRM(int opReg,
Operand op,
int immSize) |
(package private) void |
_emitOpCode(int opCode) |
(package private) void |
_emitQWord(long x)
Emit QWord (8 bytes) to internal buffer.
|
(package private) void |
_emitRexR(boolean w,
int opReg,
int regCode) |
(package private) void |
_emitRexR(int w,
int opReg,
int regCode)
Emit REX prefix (64 bit mode only).
|
(package private) void |
_emitRexRM(boolean w,
int opReg,
Operand rm) |
(package private) void |
_emitRexRM(int w,
int opReg,
Operand rm)
Emit REX prefix (64 bit mode only).
|
(package private) void |
_emitSegmentPrefix(Operand rm) |
(package private) void |
_emitSib(int s,
int i,
int b)
Emit SIB byte.
|
(package private) void |
_emitSysInt(long x)
Emit system signed integer (4 or 8 bytes) to internal buffer.
|
(package private) void |
_emitWord(int x)
Emit Word (2 bytes) to internal buffer.
|
(package private) void |
_emitX86(INST_CODE code,
Operand o1,
Operand o2,
Operand o3) |
(package private) void |
_emitX86Inl(int opCode,
boolean i16bit,
boolean rexw,
int reg) |
(package private) void |
_emitX86Inl(int opCode,
boolean i16bit,
int rexw,
int reg) |
(package private) void |
_emitX86RM(int opCode,
boolean i16bit,
boolean rexw,
int o,
Operand op,
int immSize) |
(package private) void |
_emitX86RM(int opCode,
boolean i16bit,
int rexw,
int o,
Operand op,
int immSize) |
void |
align(long m) |
int |
codeSize()
Gets the required size of memory required to store all the generated code
|
byte |
getByteAt(int pos) |
int |
getDWordAt(int pos) |
int |
getInt32At(int pos) |
long |
getQWordAt(int pos) |
short |
getWordAt(int pos) |
private static int |
intValue(boolean b) |
(package private) boolean |
is64() |
int |
offset() |
void |
relocCode(java.nio.ByteBuffer buffer,
long address) |
void |
setByteAt(int pos,
byte x) |
void |
setDWordAt(int pos,
int x) |
void |
setInt32At(int pos,
long x) |
void |
setQWordAt(int pos,
long x) |
void |
setVarAt(int pos,
long i,
boolean isUnsigned,
int size) |
void |
setWordAt(int pos,
short x) |
(package private) int |
trampolineSize()
Return size of all possible trampolines needed to successfuly generate
relative jumps to absolute addresses.
|
adc, adc, adc, adc, adc, add, add, add, add, add, addpd, addpd, addps, addps, addsd, addsd, addss, addss, addsubpd, addsubpd, addsubps, addsubps, amd_prefetch, amd_prefetchw, and_, and_, and_, and_, and_, andnpd, andnpd, andnps, andnps, andpd, andpd, andps, andps, blendpd, blendpd, blendps, blendps, blendvpd, blendvpd, blendvps, blendvps, bsf, bsf, bsr, bsr, bswap, bt, bt, bt, bt, btc, btc, btc, btc, btr, btr, btr, btr, bts, bts, bts, bts, call, call, call, call, call, cbw, cdqe, clc, cld, clflush, cmc, cmov, cmov, cmova, cmova, cmovae, cmovae, cmovb, cmovb, cmovbe, cmovbe, cmovc, cmovc, cmove, cmove, cmovg, cmovg, cmovge, cmovge, cmovl, cmovl, cmovle, cmovle, cmovna, cmovna, cmovnae, cmovnae, cmovnb, cmovnb, cmovnbe, cmovnbe, cmovnc, cmovnc, cmovne, cmovne, cmovng, cmovng, cmovnge, cmovnge, cmovnl, cmovnl, cmovnle, cmovnle, cmovno, cmovno, cmovnp, cmovnp, cmovns, cmovns, cmovnz, cmovnz, cmovo, cmovo, cmovp, cmovp, cmovpe, cmovpe, cmovpo, cmovpo, cmovs, cmovs, cmovz, cmovz, cmp, cmp, cmp, cmp, cmp, cmppd, cmppd, cmpps, cmpps, cmpsd, cmpsd, cmpss, cmpss, cmpxchg, cmpxchg, cmpxchg16b, cmpxchg8b, comisd, comisd, comiss, comiss, cpuid, crc32, crc32, cvtdq2pd, cvtdq2pd, cvtdq2ps, cvtdq2ps, cvtpd2dq, cvtpd2dq, cvtpd2pi, cvtpd2pi, cvtpd2ps, cvtpd2ps, cvtpi2pd, cvtpi2pd, cvtpi2ps, cvtpi2ps, cvtps2dq, cvtps2dq, cvtps2pd, cvtps2pd, cvtps2pi, cvtps2pi, cvtsd2si, cvtsd2si, cvtsd2ss, cvtsd2ss, cvtsi2sd, cvtsi2sd, cvtsi2ss, cvtsi2ss, cvtss2sd, cvtss2sd, cvtss2si, cvtss2si, cvttpd2dq, cvttpd2dq, cvttpd2pi, cvttpd2pi, cvttps2dq, cvttps2dq, cvttps2pi, cvttps2pi, cvttsd2si, cvttsd2si, cvttss2si, cvttss2si, cwde, daa, das, dec, dec, div, div, divpd, divpd, divps, divps, divsd, divsd, divss, divss, dppd, dppd, dpps, dpps, emms, enter, extractps, extractps, f2xm1, fabs, fadd, fadd, faddp, faddp, fbld, fbstp, fchs, fclex, fcmovb, fcmovbe, fcmove, fcmovnb, fcmovnbe, fcmovne, fcmovnu, fcmovu, fcom, fcom, fcom, fcomi, fcomip, fcomp, fcomp, fcomp, fcompp, fcos, fdecstp, fdiv, fdiv, fdivp, fdivp, fdivr, fdivr, fdivrp, fdivrp, femms, ffree, fiadd, ficom, ficomp, fidiv, fidivr, fild, fimul, fincstp, finit, fist, fistp, fisttp, fisub, fisubr, fld, fld, fld1, fldcw, fldenv, fldl2e, fldl2t, fldlg2, fldln2, fldpi, fldz, fmul, fmul, fmulp, fmulp, fnclex, fninit, fnop, fnsave, fnstcw, fnstenv, fnstsw, fnstsw, fpatan, fprem, fprem1, fptan, frndint, frstor, fsave, fscale, fsin, fsincos, fsqrt, fst, fst, fstcw, fstenv, fstp, fstp, fstsw, fstsw, fsub, fsub, fsubp, fsubp, fsubr, fsubr, fsubrp, fsubrp, ftst, fucom, fucom, fucomi, fucomip, fucomip, fucomp, fucomp, fucompp, fwait, fxam, fxch, fxch, fxrstor, fxsave, fxtract, fyl2x, fyl2xp1, haddpd, haddpd, haddps, haddps, hsubpd, hsubpd, hsubps, hsubps, idiv, idiv, imul, imul, imul, imul, imul, imul, imul, inc, inc, int3, j_short, j, ja_short, ja, jae_short, jae, jb_short, jb, jbe_short, jbe, jc_short, jc, je_short, je, jg_short, jg, jge_short, jge, jl_short, jl, jle_short, jle, jmp_short, jmp, jmp, jmp, jmp, jmp, jna_short, jna, jnae_short, jnae, jnb_short, jnb, jnbe_short, jnbe, jnc_short, jnc, jne_short, jne, jng_short, jng, jnge_short, jnge, jnl_short, jnl, jnle_short, jnle, jno_short, jno, jnp_short, jnp, jns_short, jns, jnz_short, jnz, jo_short, jo, jp_short, jp, jpe_short, jpe, jpo_short, jpo, js_short, js, jz_short, jz, lddqu, ldmxcsr, lea, leave, lfence, lock, maskmovdqu, maskmovq, maxpd, maxpd, maxps, maxps, maxsd, maxsd, maxss, maxss, mfence, minpd, minpd, minps, minps, minsd, minsd, minss, minss, monitor, mov_ptr, mov_ptr, mov, mov, mov, mov, mov, movapd, movapd, movapd, movaps, movaps, movaps, movbe, movbe, movd, movd, movd, movd, movd, movd, movd, movd, movddup, movddup, movdq2q, movdqa, movdqa, movdqa, movdqu, movdqu, movdqu, movhlps, movhpd, movhpd, movhps, movhps, movlhps, movlpd, movlpd, movlps, movlps, movmskpd, movmskps, movntdq, movntdqa, movnti, movntpd, movntps, movntq, movq, movq, movq, movq, movq, movq, movq, movq, movq, movq, movq2dq, movsd, movsd, movsd, movshdup, movshdup, movsldup, movsldup, movss, movss, movss, movsx, movsx, movsxd, movsxd, movupd, movupd, movups, movups, movups, movzx, movzx, mpsadbw, mpsadbw, mul, mul, mulpd, mulpd, mulps, mulps, mulsd, mulsd, mulss, mulss, mwait, neg, neg, nop, not_, not_, or_, or_, or_, or_, or_, orpd, orpd, orps, orps, pabsb, pabsb, pabsb, pabsb, pabsd, pabsd, pabsd, pabsd, pabsw, pabsw, pabsw, pabsw, packssdw, packssdw, packsswb, packsswb, packusdw, packusdw, packuswb, packuswb, packuswb, packuswb, paddb, paddb, paddb, paddb, paddd, paddd, paddd, paddd, paddq, paddq, paddq, paddq, paddsb, paddsb, paddsb, paddsb, paddsw, paddsw, paddsw, paddsw, paddusb, paddusb, paddusb, paddusb, paddusw, paddusw, paddusw, paddusw, paddw, paddw, paddw, paddw, palignr, palignr, palignr, palignr, pand, pand, pand, pand, pandn, pandn, pandn, pandn, pause, pavgb, pavgb, pavgb, pavgb, pavgw, pavgw, pavgw, pavgw, pblendvb, pblendvb, pblendw, pblendw, pcmpeqb, pcmpeqb, pcmpeqb, pcmpeqb, pcmpeqd, pcmpeqd, pcmpeqd, pcmpeqd, pcmpeqq, pcmpeqq, pcmpeqw, pcmpeqw, pcmpeqw, pcmpeqw, pcmpestri, pcmpestri, pcmpestrm, pcmpestrm, pcmpgtb, pcmpgtb, pcmpgtb, pcmpgtb, pcmpgtd, pcmpgtd, pcmpgtd, pcmpgtd, pcmpgtq, pcmpgtq, pcmpgtw, pcmpgtw, pcmpgtw, pcmpgtw, pcmpistri, pcmpistri, pcmpistrm, pcmpistrm, pextrb, pextrb, pextrd, pextrd, pextrq, pextrq, pextrw, pextrw, pextrw, pf2id, pf2id, pf2iw, pf2iw, pfacc, pfacc, pfadd, pfadd, pfcmpeq, pfcmpeq, pfcmpge, pfcmpge, pfcmpgt, pfcmpgt, pfmax, pfmax, pfmin, pfmin, pfmul, pfmul, pfnacc, pfnacc, pfpnacc, pfpnaxx, pfrcp, pfrcp, pfrcpit1, pfrcpit1, pfrcpit2, pfrcpit2, pfrsqit1, pfrsqit1, pfrsqrt, pfrsqrt, pfsub, pfsub, pfsubr, pfsubr, phaddd, phaddd, phaddd, phaddd, phaddsw, phaddsw, phaddsw, phaddsw, phaddw, phaddw, phaddw, phaddw, phminposuw, phminposuw, phsubd, phsubd, phsubd, phsubd, phsubsw, phsubsw, phsubsw, phsubsw, phsubw, phsubw, phsubw, phsubw, pi2fd, pi2fd, pi2fw, pi2fw, pinsrb, pinsrb, pinsrd, pinsrd, pinsrq, pinsrq, pinsrw, pinsrw, pinsrw, pinsrw, pmaddubsw, pmaddubsw, pmaddubsw, pmaddubsw, pmaddwd, pmaddwd, pmaddwd, pmaddwd, pmaxsb, pmaxsb, pmaxsd, pmaxsd, pmaxsw, pmaxsw, pmaxsw, pmaxsw, pmaxub, pmaxub, pmaxub, pmaxub, pmaxud, pmaxud, pmaxuw, pmaxuw, pminsb, pminsb, pminsd, pminsd, pminsw, pminsw, pminsw, pminsw, pminub, pminub, pminub, pminub, pminud, pminud, pminuw, pminuw, pmovmskb, pmovmskb, pmovsxbd, pmovsxbd, pmovsxbq, pmovsxbq, pmovsxbw, pmovsxbw, pmovsxdq, pmovsxdq, pmovsxwd, pmovsxwd, pmovsxwq, pmovsxwq, pmovzxbd, pmovzxbd, pmovzxbq, pmovzxbq, pmovzxbw, pmovzxbw, pmovzxdq, pmovzxdq, pmovzxwd, pmovzxwd, pmovzxwq, pmovzxwq, pmuldq, pmuldq, pmulhrsw, pmulhrsw, pmulhrsw, pmulhrsw, pmulhuw, pmulhuw, pmulhuw, pmulhuw, pmulhw, pmulhw, pmulhw, pmulhw, pmulld, pmulld, pmullw, pmullw, pmullw, pmullw, pmuludq, pmuludq, pmuludq, pmuludq, pop, pop, popad, popcnt, popcnt, popf, popfd, popfq, por, por, por, por, prefetch, psadbw, psadbw, psadbw, psadbw, pshufb, pshufb, pshufb, pshufb, pshufd, pshufd, pshufhw, pshufhw, pshuflw, pshuflw, pshufw, pshufw, psignb, psignb, psignb, psignb, psignd, psignd, psignd, psignd, psignw, psignw, psignw, psignw, pslld, pslld, pslld, pslld, pslld, pslld, pslldq, psllq, psllq, psllq, psllq, psllq, psllq, psllw, psllw, psllw, psllw, psllw, psllw, psrad, psrad, psrad, psrad, psrad, psrad, psraw, psraw, psraw, psraw, psraw, psraw, psrld, psrld, psrld, psrld, psrld, psrld, psrldq, psrlq, psrlq, psrlq, psrlq, psrlq, psrlq, psrlw, psrlw, psrlw, psrlw, psrlw, psrlw, psubb, psubb, psubb, psubb, psubd, psubd, psubd, psubd, psubq, psubq, psubq, psubq, psubsb, psubsb, psubsb, psubsb, psubsw, psubsw, psubsw, psubsw, psubusb, psubusb, psubusb, psubusb, psubusw, psubusw, psubusw, psubusw, psubw, psubw, psubw, psubw, pswapd, pswapd, ptest, ptest, punpckhbw, punpckhbw, punpckhbw, punpckhbw, punpckhdq, punpckhdq, punpckhdq, punpckhdq, punpckhqdq, punpckhqdq, punpckhwd, punpckhwd, punpckhwd, punpckhwd, punpcklbw, punpcklbw, punpcklbw, punpcklbw, punpckldq, punpckldq, punpckldq, punpckldq, punpcklqdq, punpcklqdq, punpcklwd, punpcklwd, punpcklwd, punpcklwd, push, push, push, pushad, pushf, pushfd, pushfq, pxor, pxor, pxor, pxor, rcl, rcl, rcl, rcl, rcpps, rcpps, rcpss, rcpss, rcr, rcr, rcr, rcr, rdtsc, rdtscp, ret, ret, rol, rol, rol, rol, ror, ror, ror, ror, roundpd, roundpd, roundps, roundps, roundsd, roundsd, roundss, roundss, rsqrtps, rsqrtps, rsqrtss, rsqrtss, sahf, sal, sal, sal, sal, sar, sar, sar, sar, sbb, sbb, sbb, sbb, sbb, set, set, seta, seta, setae, setae, setb, setb, setbe, setbe, setc, setc, sete, sete, setg, setg, setge, setge, setl, setl, setle, setle, setna, setna, setnae, setnae, setnb, setnb, setnbe, setnbe, setnc, setnc, setne, setne, setng, setng, setnge, setnge, setnl, setnl, setnle, setnle, setno, setno, setnp, setnp, setns, setns, setnz, setnz, seto, seto, setp, setp, setpe, setpe, setpo, setpo, sets, sets, setz, setz, sfence, shl, shl, shl, shl, shld, shld, shld, shld, shr, shr, shr, shr, shrd, shrd, shrd, shrd, shufps, shufps, sqrtpd, sqrtpd, sqrtps, sqrtps, sqrtsd, sqrtsd, sqrtss, sqrtss, stc, std, stmxcsr, sub, sub, sub, sub, sub, subpd, subpd, subps, subps, subsd, subsd, subss, subss, test, test, test, test, ucomisd, ucomisd, ucomiss, ucomiss, ud2, unpckhpd, unpckhpd, unpckhps, unpckhps, unpcklpd, unpcklpd, unpcklps, unpcklps, xadd, xadd, xchg, xchg, xchg, xor_, xor_, xor_, xor_, xor_, xorpd, xorpd, xorps, xorps
_emitJcc, _emitJcc, conditionToCMovCC, conditionToJCC, conditionToSetCC, emitX86, emitX86, emitX86, emitX86
private final CodeBuffer _buffer
private final java.util.List<RelocData> _relocData
private final CpuInfo cpuInfo
private int _properties
int _trampolineSize
private final Logger _logger
private final CPU cpu
public static final CPU I386
public static final CPU X86_64
private static final int[] nop1
private static final int[] nop2
private static final int[] nop3
private static final int[] nop4
private static final int[] nop5
private static final int[] nop6
private static final int[] nop7
private static final int[] nop8
private static final int[] nop9
private static final int[] nop10
private static final int[] nop11
public Assembler(CPU cpu)
boolean is64()
is64
in class SerializerCore
private static final int intValue(boolean b)
public final int offset()
public final int codeSize()
int trampolineSize()
public final byte getByteAt(int pos)
public final short getWordAt(int pos)
public final int getDWordAt(int pos)
public final long getQWordAt(int pos)
public final void setByteAt(int pos, byte x)
public final void setWordAt(int pos, short x)
public final void setDWordAt(int pos, int x)
public final void setQWordAt(int pos, long x)
public final int getInt32At(int pos)
public final void setInt32At(int pos, long x)
public final void setVarAt(int pos, long i, boolean isUnsigned, int size)
final void _emitByte(int x)
final void _emitWord(int x)
final void _emitDWord(int x)
final void _emitQWord(long x)
final void _emitInt32(int x)
final void _emitSysInt(long x)
final void _emitOpCode(int opCode)
void _emitSegmentPrefix(Operand rm)
void _emitImmediate(Immediate imm, int size)
void _emitRexR(int w, int opReg, int regCode)
void _emitRexR(boolean w, int opReg, int regCode)
void _emitRexRM(int w, int opReg, Operand rm)
void _emitRexRM(boolean w, int opReg, Operand rm)
void _emitModM(int opReg, Mem mem, int immSize)
void _emitX86Inl(int opCode, boolean i16bit, boolean rexw, int reg)
void _emitX86Inl(int opCode, boolean i16bit, int rexw, int reg)
void _emitModRM(int opReg, Operand op, int immSize)
void _emitMod(int m, int o, int r)
void _emitSib(int s, int i, int b)
void _emitModR(int opReg, int r)
void _emitModR(int opReg, BaseReg r)
void _emitX86RM(int opCode, boolean i16bit, boolean rexw, int o, Operand op, int immSize)
void _emitX86RM(int opCode, boolean i16bit, int rexw, int o, Operand op, int immSize)
void _emitX86(INST_CODE code, Operand o1, Operand o2, Operand o3)
_emitX86
in class SerializerCore
void _emitFpu(int opCode)
void _emitFpuSTI(int opCode, int sti)
void _emitFpuMEM(int opCode, int opReg, Mem mem)
void _emitMmu(int opCode, int rexw, int opReg, Operand src, int immSize)
void _emitJmpOrCallReloc(InstructionGroup instruction, long target)
public void relocCode(java.nio.ByteBuffer buffer, long address)
public void align(long m)