Package jnr.x86asm
Class Assembler
- java.lang.Object
-
- jnr.x86asm.SerializerCore
-
- jnr.x86asm.SerializerIntrinsics
-
- jnr.x86asm.Serializer
-
- jnr.x86asm.Assembler
-
public final class Assembler extends Serializer
Low level code generation.
-
-
Field Summary
Fields Modifier and Type Field 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
-
Fields inherited from class jnr.x86asm.SerializerCore
_cmovcctable, _jcctable, _none, _setcctable
-
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method 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, int r)
Emit Register / Register - calls _emitMod(3, opReg, r)(package private) void
_emitModR(int opReg, BaseReg r)
Emit Register / Register - calls _emitMod(3, opReg, r.code())(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 codebyte
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.-
Methods inherited from class jnr.x86asm.SerializerIntrinsics
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, j_short, ja, ja_short, jae, jae_short, jb, jb_short, jbe, jbe_short, jc, jc_short, je, je_short, jg, jg_short, jge, jge_short, jl, jl_short, jle, jle_short, jmp, jmp, jmp, jmp, jmp, jmp_short, jna, jna_short, jnae, jnae_short, jnb, jnb_short, jnbe, jnbe_short, jnc, jnc_short, jne, jne_short, jng, jng_short, jnge, jnge_short, jnl, jnl_short, jnle, jnle_short, jno, jno_short, jnp, jnp_short, jns, jns_short, jnz, jnz_short, jo, jo_short, jp, jp_short, jpe, jpe_short, jpo, jpo_short, js, js_short, jz, jz_short, 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, mov, mov, mov, mov, mov_ptr, mov_ptr, 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
-
Methods inherited from class jnr.x86asm.SerializerCore
_emitJcc, _emitJcc, conditionToCMovCC, conditionToJCC, conditionToSetCC, emitX86, emitX86, emitX86, emitX86
-
-
-
-
Field Detail
-
_buffer
private final CodeBuffer _buffer
-
_relocData
private final java.util.List<RelocData> _relocData
-
cpuInfo
private final CpuInfo cpuInfo
-
_properties
private int _properties
-
_trampolineSize
int _trampolineSize
Size of possible trampolines.
-
_logger
private final Logger _logger
-
cpu
private final CPU cpu
-
I386
public static final CPU I386
-
X86_64
public static final CPU X86_64
-
nop1
private static final int[] nop1
-
nop2
private static final int[] nop2
-
nop3
private static final int[] nop3
-
nop4
private static final int[] nop4
-
nop5
private static final int[] nop5
-
nop6
private static final int[] nop6
-
nop7
private static final int[] nop7
-
nop8
private static final int[] nop8
-
nop9
private static final int[] nop9
-
nop10
private static final int[] nop10
-
nop11
private static final int[] nop11
-
-
Constructor Detail
-
Assembler
public Assembler(CPU cpu)
-
-
Method Detail
-
is64
boolean is64()
- Specified by:
is64
in classSerializerCore
-
intValue
private static final int intValue(boolean b)
-
offset
public final int offset()
-
codeSize
public final int codeSize()
Gets the required size of memory required to store all the generated code
-
trampolineSize
int trampolineSize()
Return size of all possible trampolines needed to successfuly generate relative jumps to absolute addresses. This value is only non-zero if jmp of call instructions were used with immediate operand (this means jump or call absolute address directly). Currently only _emitJmpOrCallReloc() method can increase trampoline size value.
-
getByteAt
public final byte getByteAt(int pos)
-
getWordAt
public final short getWordAt(int pos)
-
getDWordAt
public final int getDWordAt(int pos)
-
getQWordAt
public final long getQWordAt(int pos)
-
setByteAt
public final void setByteAt(int pos, byte x)
-
setWordAt
public final void setWordAt(int pos, short x)
-
setDWordAt
public final void setDWordAt(int pos, int x)
-
setQWordAt
public final void setQWordAt(int pos, long x)
-
getInt32At
public final int getInt32At(int pos)
-
setInt32At
public final void setInt32At(int pos, long x)
-
setVarAt
public final void setVarAt(int pos, long i, boolean isUnsigned, int size)
-
_emitByte
final void _emitByte(int x)
Emit Byte to internal buffer.
-
_emitWord
final void _emitWord(int x)
Emit Word (2 bytes) to internal buffer.
-
_emitDWord
final void _emitDWord(int x)
Emit DWord (4 bytes) to internal buffer.
-
_emitQWord
final void _emitQWord(long x)
Emit QWord (8 bytes) to internal buffer.
-
_emitInt32
final void _emitInt32(int x)
Emit Int32 (4 bytes) to internal buffer.
-
_emitSysInt
final void _emitSysInt(long x)
Emit system signed integer (4 or 8 bytes) to internal buffer.
-
_emitOpCode
final void _emitOpCode(int opCode)
-
_emitSegmentPrefix
void _emitSegmentPrefix(Operand rm)
-
_emitImmediate
void _emitImmediate(Immediate imm, int size)
-
_emitRexR
void _emitRexR(int w, int opReg, int regCode)
Emit REX prefix (64 bit mode only).
-
_emitRexR
void _emitRexR(boolean w, int opReg, int regCode)
-
_emitRexRM
void _emitRexRM(int w, int opReg, Operand rm)
Emit REX prefix (64 bit mode only).
-
_emitRexRM
void _emitRexRM(boolean w, int opReg, Operand rm)
-
_emitModM
void _emitModM(int opReg, Mem mem, int immSize)
-
_emitX86Inl
void _emitX86Inl(int opCode, boolean i16bit, boolean rexw, int reg)
-
_emitX86Inl
void _emitX86Inl(int opCode, boolean i16bit, int rexw, int reg)
-
_emitModRM
void _emitModRM(int opReg, Operand op, int immSize)
-
_emitMod
void _emitMod(int m, int o, int r)
Emit MODR/M byte.
-
_emitSib
void _emitSib(int s, int i, int b)
Emit SIB byte.
-
_emitModR
void _emitModR(int opReg, int r)
Emit Register / Register - calls _emitMod(3, opReg, r)
-
_emitModR
void _emitModR(int opReg, BaseReg r)
Emit Register / Register - calls _emitMod(3, opReg, r.code())
-
_emitX86RM
void _emitX86RM(int opCode, boolean i16bit, boolean rexw, int o, Operand op, int immSize)
-
_emitX86RM
void _emitX86RM(int opCode, boolean i16bit, int rexw, int o, Operand op, int immSize)
-
_emitX86
void _emitX86(INST_CODE code, Operand o1, Operand o2, Operand o3)
- Specified by:
_emitX86
in classSerializerCore
-
_emitFpu
void _emitFpu(int opCode)
-
_emitFpuSTI
void _emitFpuSTI(int opCode, int sti)
-
_emitFpuMEM
void _emitFpuMEM(int opCode, int opReg, Mem mem)
-
_emitMmu
void _emitMmu(int opCode, int rexw, int opReg, Operand src, int immSize)
-
_emitJmpOrCallReloc
void _emitJmpOrCallReloc(InstructionGroup instruction, long target)
-
relocCode
public void relocCode(java.nio.ByteBuffer buffer, long address)
-
align
public void align(long m)
-
-